为所有帖子分配/更新自定义字段值(如何才能仅分配给没有自定义字段值的帖子?)

时间:2021-03-08 作者:batuhan

我的意思是;有7000多个职位。有些人有私人空间,但有些人没有。我想在不包含自定义字段的字段中批量添加自定义字段,并更新其值。

创建了以下插件代码来更新所有帖子的元值。我只想把它添加到不包含元值的帖子中。我该怎么做?

    <?php
/*
Plugin Name: Update MetaData for Posts
Description: Enable this plugin to update the metadata for all the posts
Author: JackJohansson
Version: 1.0
Author URI: http://example.com
*/
// Run the loop when the plugin is activated
register_activation_hook(__FILE__, \'update_my_metadata\');
function update_my_metadata(){
    $args = array(
        \'post_type\' => \'post\', // Only get the posts
        \'post_status\' => \'publish\', // Only the posts that are published
        \'posts_per_page\'   => -1 // Get every post
    );
    $posts = get_posts($args);
    foreach ( $posts as $post ) {
        // Run a loop and update every meta data
        update_post_meta( $post->ID, \'meta-key\', \'meta_value\' );
    }
}
?>

1 个回复
SO网友:Antti Koskinen

您可以使用meta_query parameter (和Query all posts where a meta key does not exist) 将查询限制为仅具有或不具有特定元值的帖子。

$query = new WP_Query(array(
    \'post_type\' => \'post\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => -1,
    \'meta_query\' => array(
        array(
            \'key\' => \'your_meta_key\',
            \'compare\' => \'NOT EXISTS\',
        ),
    ),
    \'no_found_rows\' => true,
    \'fields\' => \'ids\',
));

if ( $query->posts ) {
    array_walk(
        $query->posts,
        function($post_id, $index) {
            update_post_meta( $post_id, \'your_meta_key\', \'meta_value\' );
        }
    );
}
此外,根据您的主机,您可能需要对posts_per_page 并多次运行脚本(可能是cronjob?)如果不使用-1作为数千篇帖子的查询,可能会导致网站崩溃,或者执行时间可能会耗尽