[WordPress] 本文中にあるキーワードを含む投稿を一撃で下書きにする


とある事情により、あるキーワードを含む投稿をすべて非公開にしたい、ということはよくあることだと思います。WordPressの管理画面から1つ1つポチポチと探して非公開にするのはあまりにも非現実的なので、sqlで検索してwp-cliで一撃下書きにしてしまえば、抜け漏れがなくスグに作業が終わります。wp-cliをインストールしていない場合は、公式サイト か、さくらのレンタルサーバーにwp-cliでWordPressをインストールしよう を参考にしてください。

■ 本文中のキーワードに「札幌」を含む投稿を検索する

今回は、本文中のキーワードに「札幌」を含む投稿をすべて非公開(下書き)にしたい場合を想定しています。



DB名がwp_HANAMOGERA の場合、こんな感じで 投稿のID(ID)、post_status、タイトル(post_title)を検索します。DB名がわからない場合は、wp-config.phpを確認してくださいね。

[nullpopopo@blog ~]$ mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';" | egrep "[[:space:]]publish"
49      publish s/linux/relax/ ヾ(´ー`)ノシ 温泉だー!おんせんだー!
891     publish [Amazon][EC2] アカウント作成~最初のインスタンスを作る 2/2
2568    publish [USP友の会]第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) で話してきたよ
3547    publish [寄稿]シェルスクリプトマガジン vol.22 特集記事書きました
4145    publish livedoorのWeather Hacksを取得して加工する

これで、投稿本文中のキーワードに「札幌」を含む投稿が一覧になりました。ここで必要なのはIDなので、これを引っこ抜いてforループでまわしてpost_statusをpublishからdraftへ一撃変更します。

■ post_status 一撃変更

以下のコマンドで post_status を一撃変更します。WP_PATH 変数には、あらかじめ wp-config.php があるディレクトリを指定しておきましょう。

[nullpopopo@blog ~]$ WP_PATH=/home/nullpopopo/public_html/
[nullpopopo@blog ~]$ for POSTS in $(mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';" | egrep "[[:space:]]publish" | awk '{print $1}'); do wp --path=${WP_PATH} post update ${POSTS} --post_status=draft ; done

それでは確認してみましょう。

[nullpopopo@blog ~]$ mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';"
49      draft   s/linux/relax/ ヾ(´ー`)ノシ 温泉だー!おんせんだー!
891     draft   [Amazon][EC2] アカウント作成~最初のインスタンスを作る 2/2
2568    draft   [USP友の会]第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) で話してきたよ
2575    inherit 札幌時計台
3547    draft   [寄稿]シェルスクリプトマガジン vol.22 特集記事書きました
4145    draft   livedoorのWeather Hacksを取得して加工する
4432    inherit s/linux/relax/ ヾ(´ー`)ノシ 温泉だー!おんせんだー!
4433    inherit [Amazon][EC2] アカウント作成~最初のインスタンスを作る 2/2
4434    inherit [USP友の会]第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) で話してきたよ
4435    inherit [寄稿]シェルスクリプトマガジン vol.22 特集記事書きました
4436    inherit livedoorのWeather Hacksを取得して加工する

このように、投稿がdraftになりました。ただし、リビジョンがカウントアップされたので、 inherit としても投稿が生成されてしまいました。ちょっと見づらいので出力結果をgrepしてみましょう。

[nullpopopo@blog ~]$ mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';"  | egrep -v inherit
49      draft   s/linux/relax/ ヾ(´ー`)ノシ 温泉だー!おんせんだー!
891     draft   [Amazon][EC2] アカウント作成~最初のインスタンスを作る 2/2
2568    draft   [USP友の会]第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) で話してきたよ
3547    draft   [寄稿]シェルスクリプトマガジン vol.22 特集記事書きました
4145    draft   livedoorのWeather Hacksを取得して加工する

これらのdraftにした投稿をふたたび公開する(publishにする)にはこうします。

[nullpopopo@blog ~]$ WP_PATH=/home/nullpopopo/public_html/
[nullpopopo@blog ~]$ for POSTS in $(mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';" | egrep "[[:space:]]draft" | awk '{print $1}'); do wp --path=${WP_PATH} post update ${POSTS} --post_status=publish ; done

今度は、先ほどdraftにした投稿が公開されたことを確認してみましょう。

[nullpopopo@blog ~]$ mysql -N -s wp_HANAMOGERA -e "SELECT ID,post_status,post_title FROM wp_posts WHERE post_content LIKE '%札幌%';" | egrep "[[:space:]]publish"
49      publish s/linux/relax/ ヾ(´ー`)ノシ 温泉だー!おんせんだー!
891     publish [Amazon][EC2] アカウント作成~最初のインスタンスを作る 2/2
2568    publish [USP友の会]第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) で話してきたよ
3547    publish [寄稿]シェルスクリプトマガジン vol.22 特集記事書きました
4145    publish livedoorのWeather Hacksを取得して加工する

ね、簡単でしょう?