在发布时自动删除没有值的自定义字段

时间:2012-02-06 作者:Demilio

我有一些自动生成自定义字段的插件。有人知道当我按“发布”时如何自动从帖子中删除空的自定义字段吗?

我可以在functions.php 如果没有值,则执行检查并删除自定义字段?

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

不幸的是,WordPress API似乎假定自定义字段没有“空”值,即update_post_metadelete_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语句。

SO网友:Matt Zimmermann

谢谢Stephen Harris!你真厉害!

此外,如果只想对特定字段执行此操作,可以将特定值放入数组中,并将其与$custom_fields 具有的阵列array_intersect().

$result = !empty(array_intersect($specific_values, $custom_fields));

结束

相关推荐

write in functions.php

我只想在我的函数中添加此代码。php,以便在我的帖子结束后直接显示。目前,我正在将此代码添加到我的单篇文章中。php,但我想在函数中添加它。php,此代码用于获取各个帐户的所有推文,代码如下<?php function parse_twitter_feed($feed, $prefix, $tweetprefix, $tweetsuffix, $suffix) { $feed = str_replace(\"&lt;\", \"<\", $feed);