とある事情により、あるキーワードを含む投稿をすべて非公開にしたい、ということはよくあることだと思います。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を取得して加工する
ね、簡単でしょう?
[amazonjs asin="4873116783" locale="JP" title="詳解 WordPress"]