“快速编辑”>更新将清除我的自定义元值

时间:2010-12-06 作者:Scott B

我为每篇文章启用了两个自定义元字段,scottb\\u customHeader和scottb\\u customTitle

只要我使用完整的编辑功能来编辑帖子,这些就可以了。但是,当我单击“快速编辑”,然后单击“更新”时,我为帖子定制的元数据将被清除。我需要做什么来解决?

代码如下。。。

add_action(\'save_post\', \'custom_add_save\');


function custom_add_save($postID){
    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) {
        return $postID;
    }
    else
    {
        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID))
        {
        $postID = $parent_id;
        }

        if ($_POST[\'scottb_customHeader\']) 
        {
            update_custom_meta($postID, $_POST[\'scottb_customHeader\'], \'_scottb_customHeader\');
        }
        else
        {
            update_custom_meta($postID, \'\', \'_scottb_customHeader\');
        }
        if ($_POST[\'scottb_customTitle\']) 
        {
            update_custom_meta($postID, $_POST[\'scottb_customTitle\'], \'_scottb_customTitle\');
        }
        else
        {
            update_custom_meta($postID, \'\', \'_scottb_customTitle\');
        }
    }
}

function update_custom_meta($postID, $newvalue, $field_name) {
    // To create new meta
    if(!get_post_meta($postID, $field_name)){
    add_post_meta($postID, $field_name, $newvalue);
    }else{
    // or to update existing meta
    update_post_meta($postID, $field_name, $newvalue);
    }
}

5 个回复
最合适的回答,由SO网友:MathSmath 整理而成

将隐藏标志与自定义字段一起添加到后期编辑表单。类似于

<input type="hidden" name="my_hidden_flag" value="true" />
然后,将所有自定义的save\\u post内容包装在该标志的检查中。然后,您也不必再检查autosave常量——如果该标志不存在,则它是快速编辑或autosave。

function custom_add_save($postID){

    // Only do this if our custom flag is present
    if (isset($_POST[\'my_hidden_flag\'])) {

        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID)) {
            $postID = $parent_id;
        }

        if ($_POST[\'scottb_customHeader\']) {
            update_custom_meta($postID, $_POST[\'scottb_customHeader\'], \'_scottb_customHeader\');
        } else {
            update_custom_meta($postID, \'\', \'_scottb_customHeader\');
        }

        if ($_POST[\'scottb_customTitle\']) {
            update_custom_meta($postID, $_POST[\'scottb_customTitle\'], \'_scottb_customTitle\');
        } else {
            update_custom_meta($postID, \'\', \'_scottb_customTitle\');
        }

    }

}

SO网友:Nicolas Guillaume

我也有同样的问题。只需在save_post 动作挂钩回调函数(用于保存自定义数据的函数)。

// handle the case when the custom post is quick edited
// otherwise all custom meta fields are cleared out
if (wp_verify_nonce($_POST[\'_inline_edit\'], \'inlineeditnonce\'))
      return;
它的实际功能:它检查快速保存wp_nonce_field 存在和return如果是这样的话。无需在表单中创建其他隐藏字段。

SO网友:Patryk Godowski

这个问题已经很老了,但我认为这个问题仍然存在。

老实说,这里没有好的答案,因为这里没有关于安全的东西。您将数据保存到数据库而不检查其源。。。

您应该使用nonce来验证数据源-由于这一点,它们不会被QuickEdit覆盖(或删除)。WordPress为此提供UTIL

添加到表单:

wp_nonce_field(\'my_custom_page\', \'_my_custom_page\');
而不是在调用save函数时:

if (!wp_verify_nonce( $_POST[\'_my_custom_page\'], \'my_custom_page\' )) { return $post_id; }
您应该为每个自定义帖子执行此操作。

SO网友:Foxinni

发生的情况是:对\'save_post\' 无法处理自定义字段中的新数据。因此,当save post运行时,它会丢失所有自定义字段$\\u post数据,因此会删除字段值,而不会留下任何内容。

FIX:

无论在哪里add_action(\'save_post\',\'your_new_action\'); 是的,如果您处于“编辑”屏幕(快速编辑发生的位置),则可以使其提前返回:

 global $current_screen;    
 if($current_screen->base == \'edit\') return $post_id;
或者,您可以检查$\\u POST操作是否为内联保存(快速编辑的操作名称),然后再不执行任何操作,从而保留自定义字段值:

 if( $_POST[\'action\'] != \'inline-save\' ) { echo \'Do this then..\'; }
如果您不确定这些片段放在哪里,我可能需要进一步阐述。但我希望它能帮助有类似问题的人。

SO网友:Tim Bunch

这里的问题是,WP发现您的字段没有设置,您告诉WP清除它们。如果字段不存在,请不要清除它。如果字段存在但为空,请将其清除。

    if ( isset( $_POST[$meta_key] ) ){
        $meta_value = $_POST[$meta_key];
        if ($meta_value) {
            update_term_meta($term_id, $meta_key, $meta_value);
        } else {
            delete_term_meta($term_id, $meta_key);
        }
    }

结束

相关推荐