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


Posted in PHP onDecember 25, 2015

WordPress 的自定义字段就是文章的 meta 信息(元信息),利用这个功能,可以扩展文章的功能,是学习 WordPress 插件开发和主题深度开发的必备知识,方便给文章储存一些额外的自定义内容。

自定义字段不光给插件开发者使用,WordPress 的特色图像、自定义页面模板等功能的信息都储存在自定义字段的表单里边。

在文章编辑器界面的 “自定义栏目” 板块可以管理除了名字开头是 “_” 的字段(没有 “自定义栏目” 板块请在右上角的 “显示选项” 开启),所以很多 WordPress 自己使用的自定义字段无法在此管理。
存储原理

自定义字段非常灵活,首先来说一下它的储存原理和为什么这么灵活。数据库中,储存文章的 wp_posts 表单,只有默认的 20 个项目,用于储存必须的文章信息。

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

而存储自定义字段的 wp_postmeta 表,却只有四个项目,分别是 meta_id(自定义字段的 ID)、post_id(自定义字段属于的文章的 ID)、meta_key(自定义字段的名字)和 meta_value(自定义字段的值),一般我们只需要注意 meta_key 和 meta_value 两个项目即可。

正是因为这样,每篇文章都可以有相同名字但不同值的自定义字段,而且可以有无限个自定义字段,任何的插件和主题都可以利用自定义字段对文章信息进行扩展。

一篇文章的自定义字段的名字是可以重复的。

添加字段

自定义字段可以在文章编辑页面操作,但本文主要写关于开发的事情。

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

添加自定义字段,可以使用 add_post_meta() 函数:

add_post_meta( $post_id, $meta_key, $meta_value, $unique );

参数:

$post_id

(整数)(必须)添加自定义字段的文章的 ID.

默认值:None

$meta_key

(字符串)(必须)自定义字段的名称。

默认值:None

$meta_value

(混合)(必须)自定义字段的值。

默认值:None

$unique

(布尔)(可选)如果已经有相同名字的字段,是否重复添加。True 允许;False 不允许。

默认值:False

更新字段

要更新一个字段的值,可以使用 update_post_meta() 函数:

update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );

参数:

$post_id

(整数)(必须)更新自定义字段的文章的 ID.

默认值:None

$meta_key

(字符串)(必须)更新的自定义字段的名称。

默认值:None

$meta_value

(混合)(必须)更新的自定义字段的值。

默认值:None

$prev_value

(混合)(可选)此参数只有在一篇文章有多个相同名称的自定义字段时才有用。如果留空,则更新所有同名的字段,否则则更新和此参数值相同的值的字段。

默认值:空字符串

获取字段

获取字段可以使用 get_post_meta() 函数:

get_post_meta( $post_id, $key, $single );

参数:

$post_id

(整数)(必须)要获取字段的文章 ID,如果在循环中,可以使用 get_the_ID() 来设置。

默认值:None

$key

(字符串)(可选)要获取的字段的名称。

默认值:None

$single

(布尔)(可选)如果为 True 则返回一个字符串;如果为 False 则返回数组,且相同键值的自定义字段的值会按照添加顺序组合成一个序列数组。

默认值:False

例子

下边是一个浏览统计的简单例子:

function Bing_statistics_visitors( $cache = false ){
  if( !is_singular() ) return;
  global $post;
  $id = $post->ID;
  if( get_post( $id )->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' );
获取计数:
function Bing_get_views(){
  global $post;
  $views = number_format( (int) get_post_meta( $post->ID, 'views', true ) );
  return $views;
}

不可见的自定义字段
虽然在数据库里存在很多 WordPress 自己创建的自定义字段,但是在文章编辑器的 “自定义栏目” 里却并没有显示(没有 “自定义栏目” 板块请在右上角的 “显示选项” 开启),比如特色图像、自定义页面模板和评论是否开启等等。

如果仔细观察,会发现这些自定义字段的名字都是以下划线 “_” 开头的,所以说,以下划线 “_” 开头的自定义字段并不会显示给用户,the_meta() 函数也不会输出,对用户来说是隐藏的。

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

利用这个特性,我们可以把不想让用户随便修改的字段、会让用户感到困惑的字段,比如已经提供设置界面的设置选项、缓存数据等等,以免出现错误。

下边是一个小例子:

add_post_meta( get_the_ID(), '_time_diff', time() );

另外,如果自定义字段储存的内容是数组即使名字前边不是下划线 “_” 也不会显示。

PHP 相关文章推荐
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
Jan 07 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
PHP模块化安装教程
Jun 01 PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
PHP加密解密实例分析
Dec 25 #PHP
PHP时间类完整实例(非常实用)
Dec 25 #PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 #PHP
php实现scws中文分词搜索的方法
Dec 25 #PHP
php自定义分页类完整实例
Dec 25 #PHP
php导出生成word的方法
Dec 25 #PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 #PHP
You might like
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
php去除HTML标签实例
2013/11/06 PHP
PHP 验证登陆类分享
2015/03/13 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
RxJS的入门指引和初步应用
2019/06/15 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
Python动态加载模块的3种方法
2014/11/22 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
接口可以包含哪些成员
2012/09/30 面试题
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
料理师求职信
2014/01/30 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫