低品質コンテンツを一括「非公開」(下書きに戻す)という作業をすることに。
対象の記事が500記事ほどあり、手動で更新させるとなかなか大変。
また、対象記事についてはタイトルと記事URLが分かっている状態。
そこで、wp-cliというコマンドラインでWordPressの管理を操作できる公式ツールを用いて、記事の一括非公開を行なうことにしました。
エックスサーバー上のWordPressにwp-cliを導入する の続きです。サーバー上にwp-cliを導入できたので、本記事では実際に条件に合致するコンテンツを一括非公開処理していきます。
目次:
- いかにしてwp-cliでURLから複数記事を指定し、更新を行なうか
- wp-cliではURLを直接指定して記事を絞り込むことはできない
- “wp post update”コマンドにおいて、複数記事を指定する方法
- URLから対象記事のIDを抽出して一括更新
- wp post listコマンドの結果をgrepとawkで絞り込む
- 引数のURLをパイプではさむ形へ整形する(Python)
- “wp post update”コマンドで一括非表示(下書き)処理
- “wp post list”コマンドで対象を絞りこんで一括更新(上手くいかず)
- スラッグによる指定で複数記事を指定する
- URLをスラッグの形に整形する(Python)
- スラッグで絞り込んだ内容から”wp post update”で一括更新(本来はできるはず…)
- 非公開とした記事タイトルにテキストを一括追加
いかにしてwp-cliでURLから複数記事を指定し、更新を行なうか
wp-cliではURLを直接指定して記事を絞り込むことはできない
まず、wp-cliにおいては、URLを直接指定する形で記事の絞り込みをかけることができません。
記事の更新を行なう”wp post update”コマンドや、条件に合致する記事をリスト表示する”wp post list”コマンドにおいて、オプションに—url=<url>というオプションがありますが、これはURLによる絞り込みを行なうオプションではありません。
—url=<url>オプション:
Pretend request came from given URL. In multisite, this argument is how the target site is specified.
(意訳)指定されたURLからリクエストが来たように見せかけます。マルチサイトでは、この引数はターゲットサイトを指定する方法です。
—url=<url>オプションは、指定したURLからwp-cliのリクエストを送るようにするだけで、リスト表示の記事をその表示URLから絞り込む機能ではないのです。
“wp post update”コマンドにおいて、複数記事を指定する方法
記事を更新する”wp post update”コマンドにおいて、複数記事を指定する方法として下記2つのいずれかの方法が考えられます。
- 記事IDを複数記述して指定
- ”wp post list”コマンドによって条件絞り込みして指定
それぞれでの方法を説明していきます。
結果としては、後者の”wp post list”コマンドでの絞り込みによる一括更新は上手くいきませんでした。
そこで前者の”記事IDを複数記述して指定”する方法から解説していきます。
URLから対象記事のIDを抽出して一括更新
以下は、対象記事URLリストから記事IDをすべて取得し、記事IDで指定して一括更新する方法です。
wp post listコマンドの結果をgrepとawkで絞り込む
“wp post list”コマンドを実行することで様々な情報を表形式で表示してくれます。
このwp post listの内容にURLを含めたうえ、出力結果を拡張grepコマンドによって複数URLを指定することで、OR検索のようにURLに該当する記事のIDなどを取得することが可能です。
# ID, URLをカラムとして記事すべてを出力 → grep
$ wp post list --fields=ID,url | grep -E \
"https://example.com/post-1|https://example.com/post-2"
上のように、grepに-Eオプションをつけたうえ、1つの文字列の中に複数URLをパイプでつないで含めます。
24609 https://test-live-navi.site/bigolive-message
69 https://test-live-navi.site/17-live-liver-army
今回、必要な出力は記事IDのみなので、上記出力をパイプでawkコマンドへ渡して最初の記事ID部分だけを抽出します。さらに、記事IDの間は半角スペースで区切ります。
$ wp post list -post_title,url | grep -E \
"https://example.com/post-1|https://example.com/post-2"\
| awk '{printf $1 " "}'
24609 69
このように、awkは空白スペースで区切った部分をキャプチャして、キャプチャした部分のみ出力させることが可能です。
(出力の最後の半角スペースはコピーしないようにして処理します)
引数のURLをパイプではさむ形へ整形する(Python)
さて、記事IDの取得方法はわかりましたが、grepへ引数として渡すURLはどのようにしてパイプをはさむ形にすれば良いのでしょうか。
URLは1列の形でテキストファイル(urls.txt)に入っているものとします。
ここではPythonを使って、URLをパイプではさむ形に整形します。
# テキストファイルから1行ずつ読み込む
with open('test_urls.txt') as f:
urls = f.readlines()
# pipe_urlsに処理後のURLを格納
pipe_urls = ''
# 最後のURL部分のみ、後ろにパイプをつけない
for i, url in enumerate(urls):
pipe_url = url.rstrip()
if i == (len(urls) - 1):
pipe_urls += pipe_url
else:
pipe_urls += pipe_url + '|'
# 出力
print(pipe_urls)
この出力をコピーして、先の”wp post list”におけるgrepコマンドの引数とします。
“wp post update”コマンドで一括非表示(下書き)処理
さて、ここまででURLから該当の複数記事IDを取得することができました。
実際に”wp post update”コマンドを用いて、記事を下書きへと変更していきます。
$ wp post update 24609 69 --post_status=draft
Success: Updated post 24609.
Success: Updated post 69.
このように、Successと表示が出たら成功です。
なお、—post_statusオプションのとりうる値はWP_Query()のStatus Parametersのところに記述がありました。
きちんと下書き状態になっているか、”wp post list”コマンドで確認します。
$ wp post list --post__in=69,24609
表示された表のカラム”post_status”がすべてdraftになっていれば、更新成功が確認できたことになります。
“wp post list”コマンドで対象を絞りこんで一括更新(上手くいかず)
””wp post list”コマンドによって条件絞り込みして指定”する方法について。
結果として上手くいきませんでしたが、途中過程として残しておきます。
スラッグによる指定で複数記事を指定する
記事更新を行なう”wp post update”コマンドは、記事IDで対象記事を指定することが原則ですが、引数として”wp post list ~”を渡すことでwp post listコマンドで絞り込んだ対象を更新対象とすることができます。
絞り込みの方法として、WP-Query()におけるpostの該当箇所、Post & Page Parametersのnameパラメータを利用すれば「スラッグ」による指定を行なうことが可能。
スラッグ指定した”wp post list”コマンドで絞り込み、その結果を引数として”wp post update”コマンドで一括処理させることが考えられます。
しかし、—name=”slug”は、(string)とあるように、複数のスラッグを値に取ることができないようでした。
そこで、もう一つの(array)型で引数をとることができるpost_name__inパラメータを利用します。
$ wp post list --post_name__in=slug1,slug2
これで複数のスラッグで絞り込んだ記事を表示させることができました。
URLをスラッグの形に整形する(Python)
さて、複数のスラッグで記事を絞り込めることは分かりましたが、URLをスラッグの形に直し、さらにコンマでつなげるようにするにはどうすれば良いでしょうか。
ここで、URLは1列の形でテキストファイル(urls.txt)に入っているものとします。
実際、Google AnalyticsからエクスポートしたURLは縦1列の形式になります。
ここではPythonを使って、URLをスラッグの形に整形します。
# テキストファイルから1行ずつ読み込む
with open ('urls.py') as f:
urls = f.readlines()
# スラッグ格納先
txt_slugs = ''
for i, url in enumerate(urls):
# スラッグ以外の部分を除去
slug = url.rstrip().replace("https://example.com/", "")
# 最後はコンマを出力させない
if i == (len(urls) - 1):
txt_slugs += slug
else:
txt_slugs += slug + ','
# 別のテキストファイル(slugs.txt)に保存
with open('slugs.txt', 'w') as f:
f.write(txt_slugs)
出力したslugs.txtの内容をコピーしておきます。
スラッグで絞り込んだ内容から”wp post update”で一括更新(本来はできるはず…)
下記は”wp post update”コマンドのExampleから。
# Update all posts of a given post type at once.
$ wp post update $(wp post list --post_type=page --format=ids) --post_author=123
この例にならって、先程取得したスラッグを—post_name__inオプションの値として渡して実行しますが…”ID内容が読めません”とエラーになります。
$ wp post update $(wp post list \
--post_name__in=slug-1,slug-2) --post_status=draft
Error: Unable to read content from 'ID'.
非公開とした記事タイトルにテキストを一括追加
クライアント様から、「非公開にしたことが分かるように、非公開とした記事の記事タイトルに指定のテキストを追加してください」との追加依頼がありました。
WordPress複数の記事タイトル先頭にテキストを一括で追加 にて、その方法を解説しています。
この記事の気になった箇所を読み返す:
- いかにしてwp-cliでURLから複数記事を指定し、更新を行なうか
- wp-cliではURLを直接指定して記事を絞り込むことはできない
- “wp post update”コマンドにおいて、複数記事を指定する方法
- URLから対象記事のIDを抽出して一括更新
- wp post listコマンドの結果をgrepとawkで絞り込む
- 引数のURLをパイプではさむ形へ整形する(Python)
- “wp post update”コマンドで一括非表示(下書き)処理
- “wp post list”コマンドで対象を絞りこんで一括更新(上手くいかず)
- スラッグによる指定で複数記事を指定する
- URLをスラッグの形に整形する(Python)
- スラッグで絞り込んだ内容から”wp post update”で一括更新(本来はできるはず…)
- 非公開とした記事タイトルにテキストを一括追加
Category: WordPress