Bulk updates to post_content

时间:2016-10-13 作者:joeyjoejoejrshabidu

好的,我有一个自定义的帖子类型(我们称之为“custompost”),大约有3000篇帖子,每个帖子都有大约150个高级自定义字段数据项。我正在尝试通过我制作的插件更新所有这些内容的post\\u内容:

<?php

/**
 * Plugin Name:       Bulk Post Update
 * Version:           1.0.0
 **/

add_action(\'init\',\'bulk_post_update\');

function bulk_post_update(){

$my_posts = get_posts( array(\'post_type\' => \'custompost\', \'posts_per_page\' => -1 ) );

foreach ( $my_posts as $my_post ):

$my_post->post_content = \'Text I want to update all my post content to\';
wp_update_post( $my_post );

endforeach;
}

?>
如果我只使用一些较小的值,如“posts\\u per\\u page”=>50,那么效果很好,但如果我尝试对所有帖子使用-1,那么我认为会出现内存问题,因为我的站点将变成空白。

不管怎样,要让它工作?通过增加内存或其他方法?

也许是以某种方式将其分50批运行?我该如何以一种不乏味的方式去做这样的事情呢?

欢迎提供任何帮助/建议。

非常感谢。

1 个回复
最合适的回答,由SO网友:Nabil Kadimi 整理而成

<?php

/**
 * Plugin Name: Bulk Post Update
 * Version:     1.0.0
 *
 * @author Nabil Kadimi <[email protected]>
 * $link   http://wordpress.stackexchange.com/a/242499/17187
 **/

add_action( \'init\', function() {

    global $wpdb;

    $table            = $wpdb->posts;
    $post_type        = \'custompost\';
    $new_post_content = \'Text I want to update all my post content to\';

    $affected = $wpdb->query(
        $wpdb->prepare( "UPDATE {$table} SET post_content = %s, WHERE post_type = %s"
            , $new_post_content
            , $post_type
        )
    );

    echo $affected . \' rows modified, please disable code.\' . "\\n";
    echo \'File: \' . __FILE__ . "\\n";
    echo \'Line: \' . __LINE__ . "\\n";
    die();
} );
根据我们的讨论,我相信在PHP和MySQL上用代码动态覆盖内容的强度会降低,我会这样做:

<?php

/**
 * Plugin Name: Override Post Content
 * Version:     1.0.0
 *
 * @author Nabil Kadimi <[email protected]>
 * $link   http://wordpress.stackexchange.com/a/242499/17187
 **/

add_filter( \'the_content\', function( $content ) {

    global $post;
    $custom text = \'blah [blah]\';

    /**
     * Ignore other post types.
     */
    if ( \'custompost\' !== $post->post_type ) {
        return $content;
    }

    /**
     * Return the value I want to override with.
     */
    return do_shortcode( $custom_text );
} );