在本系列的第一篇文章中,我概述了 WordPress 提供的所有各種類型的元資料、元資料的保存位置以及我們將在本系列中介紹的內容。
此外,我定義了什麼是元資料;它在 WordPress 中的作用,以及它與我們作為開發人員的關係。但介紹的目的就是這樣:對我們將在本系列的其餘部分中涵蓋的內容進行調查。
從這篇文章開始,我們將開始探索 WordPress Post Meta API,了解它為何有用、我們可以用它做什麼,以及如何利用透過 WordPress 應用程式提供的方法。
首先,如果您是高級開發人員,那麼本系列教學不太可能對您有太大幫助。相反,它更適合那些對主題進行過一些工作,可能調整了一些插件代碼,並準備通過向組成其項目的帖子(或帖子類型)添加一些額外信息來更進一步的人。
其次,請注意,本教學中的程式碼範例不 用於生產環境。相反,我們要查看的程式碼並不適合在任何人都可以公開訪問該網站的任何地方使用。
現在,我計劃在完成本系列之後介紹更多該主題的高級技術。但目前,我們只關心 API 的使用。
為什麼呢?報道附加資訊有什麼延遲?簡單來說,它與網站安全有關。具體來說,每當我們將資訊寫入資料庫時,我們都必須假設資料的儲存格式不安全;我們必須清理資料。
我們需要探索一組完全不同的用於清理資料的 API,它們將與元資料 API 結合使用,但這不是這樣做的教程。
我知道,談論這些 API 而無法利用它們可能聽起來有點令人沮喪。但請記住,這只是 API 的介紹。這些教程應該為您提供足夠的信息,以便您開始在計算機上使用帖子元數據,但也應該留下足夠的問題,以便我們可以在未來的系列文章中更深入地探討該主題。
話雖如此,讓我們繼續開始使用 WordPress Post Meta API。請注意:這是一個很長的教學。
在我們查看程式碼之前,請務必確保您擁有必要的工具來瀏覽執行 WordPress 安裝的資料庫。一些可用的工具包括:
但請隨意使用您最喜歡的任何內容。只要您可以查看資料庫中的數據,就可以開始了。
接下來,讓我們了解 WordPress 如何定義貼文元資料。根據法典:
WordPress 能夠允許貼文作者為貼文指派自訂欄位。這種任意的額外資訊稱為元資料。#元資料透過鍵/值對進行處理。鍵是元資料元素的名稱。該值是將顯示在與該資訊關聯的每個帖子的元資料列表中的資訊。
簡單來說,WordPress 允許我們將自訂資訊寫入資料庫,將其與我們想要的任何貼文相關聯,然後根據需要檢索它。此外,資訊使用唯一的鍵/值對儲存。
如果這對您來說很陌生,請不要擔心。這個想法是,對於您儲存的每個值,它都與唯一的鑰匙相關(就像門把手有一個用於解鎖它的唯一鑰匙一樣)。
關鍵是我們如何從帖子中檢索值。但這確實提出了一個問題:如果一篇文章具有多個與其關聯的元數據,會發生什麼?也就是說,如果任何給定的帖子可以同時存儲多個元數據,我們如何檢索唯一的元數據?
當我們開始查看下面的一些範例程式碼時,我們將看到,除了使用儲存資料時使用的金鑰之外,我們還需要將貼文的唯一 ID 傳遞給函數。
不過,沒有什麼比親眼目睹它的實際效果更好的了。因此,假設您在本機電腦上設定了 WordPress,並且可以在預設主題的核心中編輯 functions.php
,那麼讓我們開始吧。
我將使用以下工具:
最重要的是您正在執行 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:
tutsplus-metadata.php
。 完成後,您的檔案系統上應該有以下內容:
最後,我們需要確保將其包含在 functions.php
中。為此,請在 PHP 起始標記下新增以下程式碼行。
<?php include_once( 'tutsplus-metadata.php' );
重新載入您的瀏覽器。如果一切順利,您應該會看到與將檔案新增至 functions.php
之前完全相同的主題。
現在,讓我們開始工作吧。
回想一下我們之前的討論,我們需要三件事才能將元資料加入資料庫:
在本教程中,我們要做的就是添加元數據,這些元數據將顯示在每次安裝 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 应该相对容易。
该函数接受三个参数:
来自法典:
检索帖子的帖子元字段。如果 $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 的定义:
此函数从指定帖子中删除具有指定键或键和值的所有自定义字段。
简短、甜蜜、切中要点。该函数接受三个参数:
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 中使用它們.
請隨時在下面的提要中留下任何問題或評論,我會盡力回覆每個問題或評論。
以上是有效率地使用 WordPress 貼文元數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!