このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています

WordPressでカスタムポストの複数記事の特定文字を一括変更するPHPコード

何十、何百と記事を投稿したあとにある言葉が日本語が間違っていたなんてことはないでしょうか?

ひとつひとつの記事を管理画面から修正するなんて考えたら気が重くなります。

効率よく複数記事の内容を変更する方法は何個かあると思いますが今回はPHPプログラムを書いて変更する処理を書いていきます。

間違っている状況例

  • 本文中の「(仮)」が不要になったので一括で削除したい
  • カスタム投稿のpost_typeは「cp」

前提条件

  • htaccessが操作できる環境である
  • phpMyAdminなどは使えない

最初にサーバーのアクセスできる場所にフォルダを作ります。

そのフォルダにhtaccessファイルを作成しIPアドレスでアクセス制限をかけます

mkdir ./tmp

cd ./tmp

touch .htacces
# AccessControl IP/HOST
order deny,allow
deny from all
allow from 127.0.0.1 # ←ここにIPアドレスを指定

このフォルダにPHPファイルを作成します

// wp-load.phpの読み込み
require_once( dirname( __FILE__ ) . '/../wp-load.php' );

function get_edit_cs_id() {
    // wpdbクラスの読み込み
    global $wpdb;

    // 対象の行データを取得する
    $sql = <<< __EOS__
SELECT * FROM wp_posts
WHERE 1=1
AND post_type = 'cs'
AND post_status = 'publish'
LIMIT 1
__EOS__;

    $res = $wpdb->get_results( $wpdb->prepare( $sql ) );

    return $res;
}

function update_edit_cs( $post_id, $content ) {
    global $wpdb;

    $wpdb->update(
        'wp_posts',
        array(
            'post_content' => $content
        ),
        array( 'ID' => $post_id )
    );
}

$pattern = "/(仮)/";
$replace = "";

$cnt = 0;
$max = 1000; // 1000以上の可能性もあるが負荷を考えとりあえずの上限をつけている

for ( $i = 0; $i <= $max; $i++ ) {

    echo "{$i}の処理を開始します<br>";

    $res = array();
    $res = get_edit_cs_id();

    if ( $res ) {
        $content = $res[0]->post_content;

        if ( preg_match ( $pattern, $content ) === 1) {
            $after = preg_replace ( $pattern, $replace, $content, 1 );
            // IDを指定してテーブルをUPDATE
            update_edit_cs( $res[0]->ID, $after );
            echo "{$i}の変換を行いました<br>";
            $cnt ++;
        }
    }

    echo "{$i}の処理を終了しました<br>";
}

echo '全ての処理が終了しました。<br>';
echo "◎処理件数:{$cnt}件<br>";

PHPコードができたらIPアドレスで制限されたフォルダ「tmp」にPHPファイルをアップします。

ブラウザでそのPHPファイルにアクセスしたら処理のスタートです。

うまくいけばカスタムポスト「cs」の公開中の記事から文字列「(仮)」が消えます。

もしphpMyAdminが操作可能ならばPHPを使用しないでMySQLのREPLACEを使う可能性もあります。