在本系列的第一篇文章中 ,我概述了WordPress提供的所有各种类型的元数据,将其保存在其中以及我们将在本系列中覆盖的内容。
此外,我定义了什么是元数据。 它在WordPress中的角色,以及它与我们作为开发人员的关系。 但是介绍的目的仅仅是这样:对本系列其余部分将要涵盖的内容进行一次调查。
从这篇文章开始,我们将开始探索WordPress Post Meta API,以了解它为什么有用,可以做什么以及如何利用WordPress应用程序提供的方法。
每个人的免责声明
首先,如果您是高级开发人员,那么本系列教程可能不会对您有太大帮助。 相反,它更适合那些对主题进行了一些工作,也许已经调整了一些插件代码,并准备通过在构成项目的帖子(或帖子类型)中添加一些额外的信息来使其更进一步的人。
其次,请注意,本教程中的代码示例不是 用于生产环境。 取而代之的是,我们将要查看的代码并不意味着可以在任何可以公开访问该网站的地方使用。
现在,我计划在完成本系列的工作之后,将涵盖该主题的更多高级技术。 但就目前而言,我们只需要考虑使用API。
为什么呢? 涵盖其他信息的延迟是什么? 简而言之,它与网站安全性有关。 具体来说,每当我们将信息写入数据库时,都必须假定数据的存储格式不安全。 我们必须清理数据。
我们需要探索一套完全不同的API来清理数据,这些API可以与元数据API一起使用,但这不是本教程。
我知道,谈论这些API而无法利用它们可能听起来有些沮丧。 但是请记住,这只是对API的介绍。 这些教程应该为您提供足够的信息,以便您开始在计算机上使用帖子元数据,但是还应该留下足够的问题,以便我们在以后的系列文章中可以更深入地探讨该主题。
话虽如此,让我们开始使用WordPress Post Meta API。 并警告:这是一个很长的教程。
API简介
在查看代码之前,重要的是要确保您具有必要的工具来浏览运行WordPress安装的数据库。 一些可用的工具包括:
但请随意使用您最喜欢的任何东西。 只要您可以查看数据库中的数据,就可以使用了。
接下来,让我们了解WordPress如何定义帖子元数据。 根据食典 :
WordPress具有允许帖子作者为帖子分配自定义字段的功能。 这种任意的额外信息称为元数据。
元数据通过键/值对进行处理。 关键是元数据元素的名称。 该值是将显示在与该信息相关联的每个单独帖子上的元数据列表中的信息。
简而言之,WordPress允许我们将自定义信息写入数据库,将其与我们想要的任何帖子相关联,然后根据需要进行检索。 此外,使用唯一键/值对存储信息。
编写自己的元数据
如果您觉得这很陌生,请不要担心。 想法是,对于您存储的每个值,它都与唯一键相关(就像门把手具有用于解锁它的唯一键一样)。
关键是我们如何从帖子中检索值。 但这确实引发了一个问题:如果帖子中有多个与之相关联的元数据会发生什么? 也就是说,如果任何给定帖子可以在其旁边存储多条元数据,我们如何检索唯一的元数据?
正如我们将开始查看下面的一些示例代码时所看到的,除了使用存储数据时使用的键外,我们还需要将帖子的唯一ID传递给函数。
不过,没有什么比实际操作效果更好。 因此,假设您已经在本地计算机上设置了WordPress,并且可以在默认主题的核心中编辑functions.php
,那么我们就开始吧。
以供参考
我将使用以下工具:
最重要的是,您正在同时运行WordPress和上述主题。
最后,如果您对另一个IDE和数据库前端比较满意,那就完全可以了。
在本文的简介中,我们涵盖了很多信息,但是随着我们不仅着眼于Post Meta API,而且也着眼于其他API,它将会派上用场。 因此,请保持这种想法。 我还将在以后的文章中引用此特定文章。
让我们深入研究API。
重要提示
我们合并代码的方式不是更改主题,实现此功能或与API交互的专业方法。 我们这样做是为了初学者进入WordPress开发的第一步。
在后续系列中,我们将采用本系列所做的工作,并将其提取到一个更具可维护性的插件中,该插件还更加关注可维护性,安全性等等。
目前,我们专注于API的基础知识。
准备主题
记住,我使用的是WordPress的基本安装以及二十六个主题的演示,我们将在本教程以及本系列的其余教程中看到这些演示。
其次,我们将在functions.php
进行更改。 通常,这不是进行此更改的最佳位置。 但是,请确保您已阅读以上说明,然后再继续。
话虽如此,让我们假设您正在运行服务器,IDE已准备就绪,并且在编辑器中functions.php
。 尽管您的屏幕截图可能看起来有些不同,但它应该类似于以下内容:
使用functions.php
的挑战在于,它已经充满了有助于增强现有主题的代码。 尽管我们最终将在以后的系列文章中将代码移动到插件中,但至少让我们迈出第一步,使我们的文件自成一体。
使用您选择的IDE:
- 在二十十六个主题的根目录中创建一个新文件。
- 将文件命名为
tutsplus-metadata.php
。
完成后,您的文件系统上应该有以下内容:
最后,我们需要确保将其包含在functions.php
。 为此,请在打开的PHP标记下添加以下代码行。
<?php
include_once( 'tutsplus-metadata.php' );
重新加载浏览器。 如果一切顺利,在将文件添加到functions.php
之前,您应该完全看到该主题。
现在,让我们开始工作。
入门
回想一下我们之前的讨论,我们需要三件事将元数据添加到数据库中:
- 帖子ID
- 可以用来识别元数据的唯一密钥
- 我们将要存储的值,以后再使用
对于本教程,我们要做的只是添加将出现在默认Hello World上的元数据! 每个WordPress安装中的标准帖子。
假设我们要添加一些包含我们名称的元数据。 因此,我们将使用的元密钥是my_name
,而我们将使用的值是您的名字。 就我而言,是“汤姆·麦克法兰”。
我们要做的第一件事是定义一个挂接到the_content
的函数。 这将允许我们在函数运行时输出文本。 如果您不熟悉钩子, 请阅读本系列 。
您的初始代码应如下所示:
<?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
的布尔值,如果我们只想确保所添加的值是$unique
,则它允许我们传递true
。
您此时可能要删除现有记录。 如果不是,那很好-只需为my_name
键使用其他值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
创建的相同键的记录,而您只想更新其中一个记录。 要更新该数据,您需要传递与该记录对应的值。
有什么不同?
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
- 元数据密钥
- 一个可选的布尔值,用于是否要以字符串或数组的形式获取值(如果未指定任何内容,则数组为默认值)
从食典 :
检索帖子的meta字段。 如果$ single为假,将是一个数组。 如果$ single为true,则将是元数据字段的值。
似乎很容易。 因此,考虑到我们源代码的最后位置现在所在的位置,我想说我们可以通过调用get_post_meta( get_the_ID(), 'my_name' );
来检索信息get_post_meta( get_the_ID(), 'my_name' );
。
上面的代码将返回一个数组。
多个值
每当您听到短语“多个值”时,使用您正在使用的编程语言来考虑数组或某种类型的数据收集都会很有帮助。
在我们的示例中,请考虑何时使用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;
}
然后,当调用该函数时,您将获得保存为元值的任何值。 与必须处理可能包含或不包含相似信息的一组记录和数组相比,这非常简单。
删除元数据
处理帖子元数据的最后一点与能够删除它有关。 这很容易,但是我们需要了解一些细微差别,以确保我们有效地做到这一点。
但是首先,这是食典的定义:
此函数从指定的帖子中删除具有指定键或键和值的所有自定义字段。
简短,甜美并切入要点。 该函数接受三个参数:
- 帖子的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的简介。 通过本法典,本教程以及提供的源代码中提供的信息,您应该能够开始将其他内容写入与每个帖子相关的数据库。
但是请记住,这是出于演示目的,因为我们需要介绍更多信息。 具体来说,我们需要检查数据清理和数据验证。 尽管我们首先要涵盖其他主题(例如用户元数据,评论元数据等),但我们将很快转向更高级的主题。
最终,我们正在努力为未来的WordPress开发人员奠定基础,从他们开始为其他人,他们的代理商甚至他们的项目开发解决方案时开始。
话虽如此,我期待继续本系列。 记住,如果您只是入门,那么可以阅读我的有关如何开始使用WordPress的系列文章,该系列集中于专门针对WordPress初学者的主题。
同时,如果您正在寻找其他实用程序来帮助您构建不断增长的WordPress工具集或用于研究代码并精通WordPress的代码,请别忘了看看Envato中提供的功能市场 。
记住,您可以在个人资料页面上捕获我的所有课程和教程,还可以通过@tommcfarlin 在我的博客和/或Twitter上关注我,在那里我讨论了各种软件开发实践以及如何在WordPress中使用它们。
请不要在下面的提要中留下任何问题或评论,我将尽力回答每个问题或评论。
翻译自: https://code.tutsplus.com/tutorials/how-to-work-with-wordpress-post-metadata--cms-25715