不幸的是,WordPress API似乎假定自定义字段没有“空”值,即update_post_meta
和delete_post_meta
, 如果给定\'\'
作为(上一个)元值,对该键的所有值执行更新/删除操作。
例如,如果自定义字段键有多个与之关联的值,其中一些值是空的,需要删除,这就很困难了。
基本逻辑如下:It will only remove fields where all associated fields are \'empty\'. “empty”的确切含义是什么,您可以通过指定回调来决定array_filter
, 默认情况下,在下面的代码中使用,这包括“0”、false等。
你要找的钩子是save_post
. 这是在点击“更新”/“发布”保存帖子及其所有帖子元后触发的,但也会自动保存。。。
add_action(\'save_post\',\'my_cf_check\');
function my_cf_check($post_id) {
// verify this is not an auto save routine.
if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) return;
//authentication checks
if (!current_user_can(\'edit_post\', $post_id)) return;
//obtain custom field meta for this post
$custom_fields = get_post_custom($post_id);
if(!$custom_fields) return;
foreach($custom_fields as $key=>$custom_field):
//$custom_field is an array of values associated with $key - even if there is only one value.
//Filter to remove empty values.
//Be warned this will remove anything that casts as false, e.g. 0 or false
//- if you don\'t want this, specify a callback.
//See php documentation on array_filter
$values = array_filter($custom_field);
//After removing \'empty\' fields, is array empty?
if(empty($values)):
delete_post_meta($post_id,$key); //Remove post\'s custom field
endif;
endforeach;
return;
}
如上所述,如果自定义字段键有多个与之关联的值,其中一些值为空,则不会删除这些值。这可能适合您使用。似乎没有简单的“WordPress”方法来解决这个问题。一种方法是自定义MYSQL语句。