在本系列的第一篇文章中,我概述了 WordPress 提供的所有各种类型的元数据、元数据的保存位置以及我们将在本系列中介绍的内容。
此外,我定义了什么是元数据;它在 WordPress 中的作用,以及它与我们作为开发人员的关系。但介绍的目的就是这样:对我们将在本系列的其余部分中涵盖的内容进行调查。
从这篇文章开始,我们将开始探索 WordPress Post Meta API,了解它为何有用、我们可以用它做什么,以及如何利用通过 WordPress 应用程序提供的方法。
针对所有人的免责声明
首先,如果您是高级开发人员,那么本系列教程不太可能对您有太大帮助。相反,它更适合那些对主题进行过一些工作,可能调整了一些插件代码,并准备通过向组成其项目的帖子(或帖子类型)添加一些额外信息来更进一步的人。
其次,请注意,本教程中的代码示例不 用于生产环境。相反,我们要查看的代码并不适合在任何人都可以公开访问该网站的任何地方使用。
现在,我计划在完成本系列之后介绍该主题的更多高级技术。但目前,我们只关心 API 的使用。
为什么呢?报道附加信息有什么延迟?简单来说,它与网站安全有关。具体来说,每当我们将信息写入数据库时,我们都必须假设数据的存储格式不安全;我们必须清理数据。
我们需要探索一组完全不同的用于清理数据的 API,它们将与元数据 API 结合使用,但这不是这样做的教程。
我知道,谈论这些 API 而无法利用它们可能听起来有点令人沮丧。但请记住,这只是对 API 的介绍。这些教程应该为您提供足够的信息,以便您开始在计算机上使用帖子元数据,但也应该留下足够的问题,以便我们可以在未来的系列文章中更深入地探讨该主题。
话虽如此,让我们继续开始使用 WordPress Post Meta API。请注意:这是一个很长的教程。
API 简介
在我们查看代码之前,请务必确保您拥有必要的工具来浏览运行 WordPress 安装的数据库。一些可用的工具包括:
- phpMyAdmin
- 续集专业版
- MySQL 工作台
- 管理员
但请随意使用您最喜欢的任何内容。只要您可以查看数据库中的数据,就可以开始了。
接下来,让我们了解 WordPress 如何定义帖子元数据。根据法典:
WordPress 能够允许帖子作者为帖子分配自定义字段。这种任意的额外信息称为元数据。
元数据通过键/值对进行处理。键是元数据元素的名称。该值是将显示在与该信息关联的每个帖子的元数据列表中的信息。
简单来说,WordPress 允许我们将自定义信息写入数据库,将其与我们想要的任何帖子相关联,然后根据需要检索它。此外,信息使用唯一的键/值对存储。
编写我们自己的元数据
如果这对您来说很陌生,请不要担心。这个想法是,对于您存储的每个值,它都与唯一的钥匙相关(就像门把手有一个用于解锁它的唯一钥匙一样)。
关键是我们如何从帖子中检索值。但这确实提出了一个问题:如果一篇文章具有多个与其关联的元数据,会发生什么?也就是说,如果任何给定的帖子可以同时存储多个元数据,我们如何检索唯一的元数据?
当我们开始查看下面的一些示例代码时,我们将看到,除了使用存储数据时使用的密钥之外,我们还需要将帖子的唯一 ID 传递给函数。
不过,没有什么比亲眼目睹它的实际效果更好的了。因此,假设您在本地计算机上设置了 WordPress,并且可以在默认主题的核心中编辑 functions.php
,那么让我们开始吧。
供参考
我将使用以下工具:
- WordPress 4.4
- 二十六主题
- 原子
- 续集专业版
最重要的是您正在运行 WordPress 和上面提到的主题。
最后,如果您更喜欢其他 IDE 和数据库前端,那完全没问题。
我们在本文的介绍中介绍了很多信息,但当我们开始不仅关注 Post Meta API 还关注其他 API 时,这些信息将会派上用场。所以要保持这个心态。我也将在以后的文章中提及这篇文章。
让我们深入研究 API。
非常重要的说明
我们合并代码的方式不是更改主题、实现此功能或与 API 交互的专业方式。我们这样做是为了初学者进入 WordPress 开发的第一步。
在后续系列中,我们将把本系列中所做的工作提取到一个更易于维护的插件中,该插件还更加关注可维护性、安全性等。
目前,我们重点关注 API 的基础知识。
准备主题
Remember that I’m using a basic installation of WordPress along with 二十六主题 for the demos that we’re going to see throughout this tutorial and the rest of the tutorials in the series.
其次,我们将在 functions.php
中进行更改。这通常不是进行此更改的最佳位置;但是,请确保您在继续之前已阅读上面的注释。
话虽如此,我们假设您的服务器已运行,您的 IDE 已启动并准备就绪,并且编辑器中已存在 functions.php
。虽然您的屏幕截图可能看起来有点不同,但它应该类似于:
使用 functions.php
的挑战在于它已经充满了有助于增强功能的代码现有的主题。尽管我们最终将在未来的系列中将代码移至插件中,但我们至少要迈出制作文件的第一步,以便我们可以独立包含我们的代码。
使用您选择的 IDE:
- Create a new file in the root directory of 二十六主题.
- 将文件命名为
tutsplus-metadata.php
。
完成后,您的文件系统上应该有如下内容:
最后,我们需要确保将其包含在 functions.php
中。为此,请在 PHP 起始标记下添加以下代码行。
<?php include_once( 'tutsplus-metadata.php' );
重新加载您的浏览器。如果一切顺利,您应该会看到与将文件添加到 functions.php
之前完全相同的主题。
现在,让我们开始工作吧。
开始使用
回想一下我们之前的讨论,我们需要三件事才能将元数据添加到数据库:
- 帖子 ID
- 我们可以用来识别元数据的唯一密钥
- 我们要存储并稍后检索的值
在本教程中,我们所要做的就是添加元数据,这些元数据将显示在每次安装 WordPress 时标配的默认 Hello World! 帖子中。
假设我们想要添加一些包含我们姓名的元数据。因此,我们将使用的元键是 my_name
,我们将使用的值是您的名字。就我而言,是“Tom McFarlin”。
我们要做的第一件事是定义一个挂钩到 the_content
的函数。这将使我们能够在函数运行时输出文本。如果您不熟悉 hooks,请阅读本系列。
您的初始代码应如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { echo "[We are here.]" } return $content; }
当您执行此代码时,字符串“[We are here.]”应该出现在帖子内容上方,然后出现在其他内容之前,并且它应该仅出现在上世界你好!帖子。这是因为我们在 echo
字符串之前检查以确保 ID 为 1。
请注意,本文末尾共享的代码的最终版本将包含注释。在那之前,当我们将每个新部分添加到代码中时,我将解释代码正在做什么。
添加元数据
现在让我们添加一些实际的元数据。为此,请将此代码添加到条件正文中,以便我们确定我们是针对 Hello World 这样做的。由于我们已经在条件中检查 ID 1,因此我们可以删除上一节中添加的代码并更新它。
在条件语句体内,我们将调用 add_post_meta
API 函数,如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { add_post_meta( get_the_ID(), 'my_name', 'Tom McFarlin' ); } return $content; }
如果我们可以利用这些信息做点什么,那就太好了。不过,在此之前,我们还需要了解更多信息。也就是说,关于更新元数据(以及它与添加元数据有何不同)以及在处理 API 时您可能没有想到的一些细微差别。
更新元数据
添加元数据和更新元数据之间存在细微差别。您知道键如何唯一标识与其关联的值吗?嗯,这部分准确。
当您调用 add_post_meta
时,您每次进行该调用时都会创建一个条目。因此,在我们上面的代码中,如果刷新页面三次,那么您将看到类似这样的内容:
很好奇,对吧?回想一下法典的内容:
请注意,如果指定帖子的自定义字段中已存在给定键,则会添加具有相同键的另一个自定义字段,除非 $unique 参数设置为 true,在这种情况下,不会进行任何更改。
啊,该函数接受一个可选参数。这是一个名为 $unique
的布尔值,如果我们只想确保添加的值是唯一的,它允许我们传递 true
。
此时您可能想要删除现有记录。如果没有,也没关系,只需为 my_name
键使用不同的值即可。
这意味着我们可以将代码更新为如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { add_post_meta( get_the_ID(), 'my_name', 'Tom McFarlin', true ); } return $content; }
现在您只创建一个条目。此外,如果您尝试更改代码中该键的值,那么它在数据库中将不会被覆盖。。一旦写入帖子元数据完成,它就会像第一次一样存储。
但事实并非一定如此,这就是 update_post_meta
发挥作用的地方。事实上,update_post_meta
可能比 add_post_meta
更常用,具体取决于您的用例。
在查看代码之前,请先查看 Codex 的内容:
函数 update_post_meta() 更新指定帖子的现有元键(自定义字段)的值。
这可以用来代替 add_post_meta() 函数。该函数要做的第一件事是确保 $meta_key 已经存在于 $post_id 上。如果没有,则调用 add_post_meta($post_id, $meta_key, $meta_value) 并返回其结果。
你明白了吗?它可以“用来代替 add_post_meta
”,这很有用,因为这意味着:
- 如果给定键的帖子元数据已存在,
- 如果您使用
update_post_meta
, - 您将覆盖之前的值。
此时,您可能想要删除数据库中的信息,或创建一对新的键和值。这意味着我们可以将代码更新为如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { update_post_meta( get_the_ID(), 'my_name', 'Tom McFarlin' ); } return $content; }
不过,这也带来了一些固有的危险。
也就是说,如果您覆盖了一个您从未打算覆盖的值,那么该值就会消失,并且无法回收(除非您做了超出本系列范围的更出色的工作)。
不过, update_post_meta
有一个可选的最后一个参数,那就是 $prev_value
参数。也就是说,您可以指定要覆盖哪个值。
例如,您有使用 add_post_meta
创建的具有相同密钥的多条记录,并且您只想更新其中一条记录。要更新该数据,您需要传入与该一条记录对应的值。
有什么区别?
add_post_meta
和 update_post_meta
之间的区别可能被认为很微妙,但这取决于您的用例。
在这里,我将尝试尽可能简单地分解它们,因为尽管考虑到我们上面看到的示例,它可能看起来很复杂,但当您将其全部展开时,它会更简单。
-
当您想要将记录引入数据库时,
add_post_meta
非常有用。如果该值已经存在,则可能会或不会写入新值。如果您为函数的$unique
参数传递true
,则只会创建第一条记录,并且不会覆盖该 >除了update_post_meta
。 -
update_post_meta
可以用来代替add_post_meta
并且将始终覆盖以前存在的值。如果您正在处理由add_post_meta
创建的多条记录,那么您可能需要指定要覆盖的先前值。
这就是一切。当然,我们仍然需要处理从数据库中检索记录并将其显示在屏幕上的问题。
检索元数据
在检索帖子元数据时,您需要记住两件事:
- 元数据可以字符串形式检索。
- 元数据可以作为数组检索。
有时这取决于您存储原始信息的方式;有时它取决于您想要如何使用它。
在了解检索信息的各种方法之前,让我们首先了解一下执行此操作的基本 API 调用。具体来说,我说的是 get_post_meta
。如果您到目前为止一直在关注,那么理解 API 应该相对容易。
该函数接受三个参数:
- 帖子 ID
- 元数据键
- 如果您想要以字符串或数组形式检索值(如果未指定任何内容,则数组是默认值),则为可选布尔值
来自法典:
检索帖子的帖子元字段。如果 $single 为 false,则将是一个数组。如果 $single 为 true,则为元数据字段的值。
看起来很简单。因此,考虑到我们源代码的最后一部分现在所在的位置,我想说我们可以通过调用 get_post_meta( get_the_ID(), 'my_name' );
来检索信息。 p>
上面的代码将返回一个数组。
多个值
每当您听到“多个值”这个短语时,想象一下您正在使用的编程语言中的数组或某种类型的数据集合会很有帮助。
在我们的示例中,考虑一下我们使用 add_post_meta
多次存储相同密钥的情况。作为回顾,数据库如下所示:
如果我通过密钥检索信息,我会得到什么?由于我没有指定我想要一个字符串,因此我将返回所有记录的数组。这将使我能够迭代它们中的每一个。
另一方面,如果我指定 true 来获取字符串,那么我只会获取使用 add_post_meta
创建的第一行。
为此,如果您希望获取给定键的多个值,那么您的代码将如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { var_dump( get_post_meta( get_the_ID(), 'my_name' ) ); } return $content; }
请注意,我使用 var_dump
是为了更轻松地在浏览器中查看从 WordPress 返回的信息;然而,我更喜欢使用调试器,我们可能会在以后的文章中讨论这一点。
单一值
现在假设您想要为一篇文章存储单个值。在这种情况下,您仍然需要帖子 ID 和元数据密钥;但是,您还需要提供 true
作为 get_post_meta
的第三个参数。
如上所述,如果您正在处理使用 add_post_meta
创建多行的情况,那么您将取回创建的第一行;但是,如果您将此函数与 update_post_meta
一起使用,那么您将返回存储的数据的字符串值。
由于我们已经介绍了前者但没有介绍后者,所以代码如下:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { var_dump( get_post_meta( get_the_ID(), 'my_name', true ) ); } return $content; }
然后,您将在调用该函数时返回您保存为元值的任何值。与必须使用一组可能包含也可能不包含类似信息的记录和数组相比,这非常简单。
删除元数据
使用帖子元数据的最后一点与删除它有关。这很简单,但我们需要了解一些细微差别,以确保我们有效地做到这一点。
但首先,这是 Codex 的定义:
此函数从指定帖子中删除具有指定键或键和值的所有自定义字段。
简短、甜蜜、切中要点。该函数接受三个参数:
- 帖子 ID
- 元键
- 元值
meta 值是可选的,但如果您一直在使用 add_post_meta
并希望删除多次调用该函数创建的特定条目之一(正如我们已经在本教程的其他地方可以看到)。
虽然调用 delete_post_meta
就像传递帖子 ID、元键和可选元值一样简单,但该函数返回一个布尔值,说明数据是否已删除。
删除我们迄今为止一直在查看的一些帖子元数据的示例代码可能如下所示:
<?php add_filter( 'the_content', 'tutsplus_metadata' ); function tutsplus_metadata( $content ) { if ( 1 === get_the_ID() ) { delete_post_meta( get_the_ID(), 'my_name' ); } return $content; }
但是,您的实施可能会有所不同。如果您正在使用多个元数据,并且想要验证删除是否成功,那么您可以将代码包装在条件中。
最后的代码示例
下面您将找到一个很长的、有记录的代码片段,它应该代表我们在本教程中讨论的大部分内容。请注意,这些函数挂接到 the_content
。
这仅用于演示目的,以便您可以在加载特定页面时轻松触发这些函数。
<?php /** * This file shows how to work with the common Post Meta API functions. * * Namely, it demonstrates how to use: * - add_post_meta * - update_post_meta * - get_post_meta * - delete_post_meta * * Each function is hooked to 'the_content' so that line will need to be * commented out depending on which action you really want to test. * * Also note, from the tutorial linked below, that this file is used form * demonstration purposes only and should not be used in a production * environment. * * Tutorial: * http://code.tutsplus.com/tutorials/how-to-work-with-wordpress-post-metadata--cms-25715 * * @version 1.0.0 * @author Tom McFarlin * @package tutsplus_wp_metadata */ add_filter( 'the_content', 'tutsplus_add_post_meta' ); /** * Determines if the current post is the default 'Hello World' post and, if so, * adds my name as the post meta data to the postmeta database table. * * @param string $content The post content. * @return string $content The post content. */ function tutsplus_add_post_meta( $content ) { if ( 1 === get_the_ID() ) { add_post_meta( get_the_ID(), 'my_name', 'Tom McFarlin' ); } return $content; } add_filter( 'the_content', 'tutsplus_update_post_meta' ); /** * Determines if the current post is the default 'Hello World' post and, if so, * updates my name as the post meta data to the postmeta database table. This * is an alternative way of writing post metadata to the postmeta table as * discussed in the linked tutorial. * * @param string $content The post content. * @return string $content The post content. */ function tutsplus_update_post_meta( $content ) { if ( 1 === get_the_ID() ) { update_post_meta( get_the_ID(), 'my_name', 'Tom McFarlin' ); } return $content; } add_filter( 'the_content', 'tutsplus_get_post_meta' ); /** * Determines if the current post is the default 'Hello World' post and, if so, * retrieves the value for the 'my_name' in the format of a string and echoes * it back to the browser. * * @param string $content The post content. * @return string $content The post content. */ function tutsplus_get_post_meta( $content ) { // Note: Don't worry about the esc_textarea call right now. if ( 1 === get_the_ID() ) { echo esc_textarea( get_post_meta( get_the_ID(), 'my_name', true ) ); } return $content; } add_filter( 'the_content', 'tutsplus_delete_post_meta' ); /** * Determines if the current post is the default 'Hello World' post and, if so, * deletes the post metadata identified by the unique key. * * @param string $content The post content. * @return string $content The post content. */ function tutsplus_delete_post_meta( $content ) { if ( 1 === get_the_ID() ) { delete_post_meta( get_the_ID(), 'my_name' ); } return $content; }
通常,您会发现与其他挂钩相关的元数据函数,例如 save_post
和类似操作,但这是更高级工作的主题。也许我们会在今年晚些时候的另一个系列中介绍这一点。
结论
WordPress Codex 中提供了每个 API 函数,因此,如果您想在本系列的下一篇文章之前跳到前面并进行更多阅读,那么请随意这样做。
如前所述,这是对 WordPress Post Meta API 的介绍。通过 Codex、本教程以及提供的源代码中提供的信息,您应该能够开始向与您的每篇帖子相关的数据库写入其他内容。
但请记住,这只是为了演示目的,因为我们有更多信息要介绍。具体来说,我们需要检查数据清理和数据验证。尽管我们首先要讨论其他主题(例如用户元数据、评论元数据等),但我们很快就会讨论更高级的主题。
最终,我们试图为未来的 WordPress 开发人员奠定基础,让他们能够继续为他人、为他们的机构、甚至为他们的项目开发解决方案。
话虽如此,我期待着继续这个系列。请记住,如果您刚刚开始使用,可以查看我的关于如何开始使用 WordPress 的系列,该系列主要针对专门针对 WordPress 初学者的主题。
同时,如果您正在寻找其他实用程序来帮助您构建不断增长的 WordPress 工具集,或者学习代码并更加精通 WordPress,请不要忘记查看我们提供的内容可在 Envato 市场购买。
请记住,您可以在我的个人资料页面上观看我的所有课程和教程,并且可以在我的博客和/或 Twitter(@tommcfarlin)上关注我,我在其中讨论各种软件开发实践以及我们如何在 WordPress 中使用它们.
请随时在下面的提要中留下任何问题或评论,我会尽力回复每个问题或评论。
资源
- 自定义字段
- add_post_when
- update_post_meta
- get_post_when
- 删除_post_meta
- 发布元函数示例
- 回声
- var_dump
以上就是高效地使用 WordPress 帖子元数据的详细内容,更多请关注php中文网其它相关文章!