WP_UPDATE_POST删除CPT中的POST元数据

时间:2016-05-25 作者:Rafael

我有一个名为“directory”的自定义帖子类型,它包括一些元/自定义字段。下面的脚本仅用于在运行时更改post状态。这不在保存帖子的管理面板上。这是一个单独运行的脚本。

require(\'../../../wp-blog-header.php\');
global $wpdb;
global $post;

$directories = get_posts( $get_directories );
foreach ($directories as $directory){
 wp_update_post(array(\'ID\' => $directory->ID,\'post_status\' => \'draft\'));
};
状态更新良好,但自定义元数据被删除。

我见过其他的在管理编辑页面上添加更新时遇到类似问题,但这是它自己的文件。

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

不确定的问题wp_update_post 但这是一个非常简单的SQL查询:

global $wpdb;
$query = "UPDATE ".$wpdb->prefix."posts SET post_status=\'draft\' WHERE ID = \'".$directory->ID."\'";
$wpdb->query($query);

SO网友:Rarst

我认为这不应该在默认情况下发生。通过快速查看代码,更新调用应该影响meta的唯一情况是meta_input 在要应用的参数中。

根据评论,情况可能是您试图与第三方CPT交互,其代码不能很好地处理这种情况。

请注意,“自己的文件”并不重要(而且在使用时是非常糟糕的做法),WP核心仍将引导并加载所有插件。

SO网友:cybmeta

基于的源代码wp_publish_post(), 您可以在不接触元数据的情况下更新post状态,同时也不会丢失post转换操作(代码中缺少这些操作),如下所示:

global $wpdb;
// Unkown $get_directories, you have not set it
// in your sample code, I assume it is correct
$directories = get_posts( $get_directories );
foreach( $directories as $directory ){
    // Skip already draft posts
    if( $directory->post_status != \'draft\' ) {
        $wpdb->update( $wpdb->posts, array( \'post_status\' => \'draft\' ), array( \'ID\' => $directory->ID ) );
        clean_post_cache( $directory->ID );
        $old_status = $directory->post_status;
        $directory->post_status = \'draft\';
        // Perform transition actions
        wp_transition_post_status( \'draft\', $old_status, $directory );
    }
}
您还可以包括更新帖子时触发的其他actinos:

do_action( \'edit_post\', $directory->ID, $post );
do_action( "save_post_{$directory->post_type}", $directory->ID, $directory, true );
do_action( \'save_post\', $directory->ID, $directory, true );
do_action( \'wp_insert_post\', $directory->ID, $directory, true );
但是,正如@Rast所说,您的问题很可能是这些操作中的一些被第三方代码(来自另一个插件或主题)钩住了。这些操作由wp_update_post() 它通常用于更新post元字段,特别是save_post 行动很可能,当这些操作在没有元数据信息的情况下触发时,就像您的代码一样,第三方代码会删除元数据字段。

相关推荐