高洺峰 發表於 2023-6-26 00:00:00

WordPress中编写自定义存储字段的相关PHP函数解析

<p>
WordPress 的自定义字段就是文章的 meta 信息(元信息),利用这个功能,可以扩展文章的功能,是学习 WordPress 插件开发和主题深度开发的必备知识,方便给文章储存一些额外的自定义内容。</p>
<p>
自定义字段不光给插件开发者使用,WordPress 的特色图像、自定义页面模板等功能的信息都储存在自定义字段的表单里边。</p>
<p>
在文章编辑器界面的 “自定义栏目” 板块可以管理除了名字开头是 “_” 的字段(没有 “自定义栏目” 板块请在右上角的 “显示选项” 开启),所以很多 WordPress 自己使用的自定义字段无法在此管理。<br><strong>存储原理</strong></p>
<p>
自定义字段非常灵活,首先来说一下它的储存原理和为什么这么灵活。数据库中,储存文章的 wp_posts 表单,只有默认的 20 个项目,用于储存必须的文章信息。</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中编写自定义存储字段的相关PHP函数解析" alt="WordPress中编写自定义存储字段的相关PHP函数解析" src="https://zhuji.jb51.net/uploads/img/202305/1a429785031d5d9a556cf6662ea756c9.jpg"></p>
<p>
而存储自定义字段的 wp_postmeta 表,却只有四个项目,分别是 meta_id(自定义字段的 ID)、post_id(自定义字段属于的文章的 ID)、meta_key(自定义字段的名字)和 meta_value(自定义字段的值),一般我们只需要注意 meta_key 和 meta_value 两个项目即可。</p>
<p>
正是因为这样,每篇文章都可以有相同名字但不同值的自定义字段,而且可以有无限个自定义字段,任何的插件和主题都可以利用自定义字段对文章信息进行扩展。</p>
<p>
一篇文章的自定义字段的名字是可以重复的。</p>
<p>
<strong>添加字段</strong></p>
<p>
自定义字段可以在文章编辑页面操作,但本文主要写关于开发的事情。</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中编写自定义存储字段的相关PHP函数解析" alt="WordPress中编写自定义存储字段的相关PHP函数解析" src="https://zhuji.jb51.net/uploads/img/202305/ecc26a72b56fe5cb3e07d000f1ee4fd6.jpg"></p>
<p>
添加自定义字段,可以使用 add_post_meta() 函数:</p>
<div>
<pre>
add_post_meta( $post_id, $meta_key, $meta_value, $unique );
</pre>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
参数:</p>
<p>
$post_id</p>
<p>
(整数)(必须)添加自定义字段的文章的 ID.</p>
<p>
默认值:None</p>
<p>
$meta_key</p>
<p>
(字符串)(必须)自定义字段的名称。</p>
<p>
默认值:None</p>
<p>
$meta_value</p>
<p>
(混合)(必须)自定义字段的值。</p>
<p>
默认值:None</p>
<p>
$unique</p>
<p>
(布尔)(可选)如果已经有相同名字的字段,是否重复添加。True 允许;False 不允许。</p>
<p>
默认值:False</p>
<p>
<strong>更新字段</strong></p>
<p>
要更新一个字段的值,可以使用 update_post_meta() 函数:</p>
<div>
<pre>
update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );
</pre>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
参数:</p>
<p>
$post_id</p>
<p>
(整数)(必须)更新自定义字段的文章的 ID.</p>
<p>
默认值:None</p>
<p>
$meta_key</p>
<p>
(字符串)(必须)更新的自定义字段的名称。</p>
<p>
默认值:None</p>
<p>
$meta_value</p>
<p>
(混合)(必须)更新的自定义字段的值。</p>
<p>
默认值:None</p>
<p>
$prev_value</p>
<p>
(混合)(可选)此参数只有在一篇文章有多个相同名称的自定义字段时才有用。如果留空,则更新所有同名的字段,否则则更新和此参数值相同的值的字段。</p>
<p>
默认值:空字符串</p>
<p>
<strong>获取字段</strong></p>
<p>
获取字段可以使用 get_post_meta() 函数:</p>
<div>
<pre>
get_post_meta( $post_id, $key, $single );
</pre>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
参数:</p>
<p>
$post_id</p>
<p>
(整数)(必须)要获取字段的文章 ID,如果在循环中,可以使用 get_the_ID() 来设置。</p>
<p>
默认值:None</p>
<p>
$key</p>
<p>
(字符串)(可选)要获取的字段的名称。</p>
<p>
默认值:None</p>
<p>
$single</p>
<p>
(布尔)(可选)如果为 True 则返回一个字符串;如果为 False 则返回数组,且相同键值的自定义字段的值会按照添加顺序组合成一个序列数组。</p>
<p>
默认值:False</p>
<p>
例子</p>
<p>
下边是一个浏览统计的简单例子:</p>
<div>
<pre>
function Bing_statistics_visitors( $cache = false ){
if( !is_singular() ) return;
global $post;
$id = $post-&gt;ID;
if( get_post( $id )-&gt;post_status != 'publish' ) return;
$post_views = (int) get_post_meta( $id, 'views', true );
update_post_meta( $id, 'views', ( $post_views + 1 ) ) || add_post_meta( $id, 'views', 1, true );
}
add_action( 'wp_head', 'Bing_statistics_visitors' );
</pre>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<div>
<p>
获取计数:</p>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<div>
<pre>
function Bing_get_views(){
global $post;
$views = number_format( (int) get_post_meta( $post-&gt;ID, 'views', true ) );
return $views;
}

</pre>
</div>
<p>
<strong>不可见的自定义字段</strong><br>
虽然在数据库里存在很多 WordPress 自己创建的自定义字段,但是在文章编辑器的 “自定义栏目” 里却并没有显示(没有 “自定义栏目” 板块请在右上角的 “显示选项” 开启),比如特色图像、自定义页面模板和评论是否开启等等。</p>
<p>
如果仔细观察,会发现这些自定义字段的名字都是以下划线 “_” 开头的,所以说,以下划线 “_” 开头的自定义字段并不会显示给用户,the_meta() 函数也不会输出,对用户来说是隐藏的。</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中编写自定义存储字段的相关PHP函数解析" alt="WordPress中编写自定义存储字段的相关PHP函数解析" src="https://zhuji.jb51.net/uploads/img/202305/b21947fe81538867b826ffdb86bd0e74.jpg"></p>
<p>
利用这个特性,我们可以把不想让用户随便修改的字段、会让用户感到困惑的字段,比如已经提供设置界面的设置选项、缓存数据等等,以免出现错误。</p>
<p>
下边是一个小例子:</p>
<div>
<pre>
add_post_meta( get_the_ID(), '_time_diff', time() );
</pre>
</div>
<p>
另外,如果自定义字段储存的内容是数组即使名字前边不是下划线 “_” 也不会显示。</p>
頁: [1]
查看完整版本: WordPress中编写自定义存储字段的相关PHP函数解析