WordPress自定义字段的几个钩子以及相关用法

在WordPress中如果要更新某个自定义字段,只需要用到函数update_post_meta()就可以了。在执行update_post_meta的时候,WP会查找到你要更新的字段,如果没有符合条件的字段,WP会用add_post_meta添加新的字段,不用人工写判断,很方便。
使用add_post_meta添加新字段时,如果添加了参数$unique为true,WP会查找有没有相同键名(meta_key)的字段,如果有,则不会添加任何东西。
删除自定义字段delete_post_meter也不需要预先判断有无字段,如果没有该字段,delete_post_meter会返回false值。
相关文档:
https://codex.wordpress.org/Function_Reference/add_post_meta
https://codex.wordpress.org/Function_Reference/update_post_meta
https://codex.wordpress.org/Function_Reference/delete_post_meta

以上都是WP开发中的基本知识。在对一些现有插件做二次开发的时候,我们不仅仅要自己更新自定义字段,还要“劫持”插件对自定义字段的更新。
添加字段:

//添加前执行
add_action( "add_post_meta", "brain1981_add_post_meta", 10, 3);
//添加后执行
add_action( "added_post_meta", "brain1981_add_post_meta", 10, 3);
function brain1981_add_post_meta( $post_id, $meta_key, $meta_value ){
        //do something
}

修改字段:

//修改前执行
add_action( "update_post_meta", "brain1981_update_post_meta", 10, 4);
//修改后执行
add_action( "updated_post_meta", "brain1981_update_post_meta", 10, 4);
function brain1981_update_post_meta( $meta_id, $post_id, $meta_key, $meta_value ){
        //do something
}

删除字段:

//删除前
add_action( 'delete_post_meta', 'brain1981_deleted_post_meta', 10, 4 );
//删除后
add_action( 'deleted_post_meta', 'brain1981_deleted_post_meta', 10, 4 );
function brain1981_deleted_post_meta( $meta_ids, $post_id, $meta_key, $only_delete_these_meta_values ){
    if ( $meta_key == 'abc') {//这里往往用于阻止删除,如果在deleted_post_meta钩子中使用,因为字段已经被删除了,所以没有什么用
        //undo something...
    }
}

需要注意的是第一个参数为$meta_ids是一个数组,和添加、修改的第一个参数 $meta_id 有所不同,具体执行的时候需要用foreach循环一下

今天碰到一个有趣的坑,有很多插件是通过请求wp-admin/admin-ajax.php对字段进行了异步删除的,想用delete_post_meta这个钩子挽回这个操作是无力的,然后被我找到一个更神奇的钩子,名字看上去差不多,叫做delete_postmeta(post和meta中间少了一个下横线)。

add_action( "delete_postmeta", "brain1981_delete_postmeta", 10, 1);
function brain1981_delete_postmeta( $meta_ids ){
	foreach ( $meta_ids as $meta_id ) {
		$meta = get_post_meta_by_id($meta_id);
		//do or undo something...
	}
}

delete_postmeta自然也有一个双胞胎兄弟deleted_postmeta,但是这家伙和deleted_post_meta一样没有什么实用价值,因为当你执行deleted_post_meta的时候,字段已经被删除,自然就没法通过get_post_meta_by_id($meta_id)获取字段信息去做别的事情了。

如果插件是通过请求wp-admin/includes/post.php 来操作字段的,那么delete_post_meta是可以派上用场的,而且delete_post_meta可以接收的参数较多,比较好用;delete_postmeta只接受一个参数(字段本身的id),只能自己再多写几行查询,没那么方便。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1833.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注