WordPressをコマンドラインでいじる

フリーランスになってからありがたいことにここ数か月、デスマ級に仕事がありました。
全部終わったわけではないですがようやくひと段落したので久々に記事を書きたいと思います。

今回はWordpressをコマンドラインから制御する方法です。
今後Wordpressをコマンドラインから制御するのを書くことが多いと思いますので、まずは基本から。

コマンドライン制御といえばWP-CLIだろJK、というのが一般的とは思いますが、私にはどうもなじまなかったので、WordpressのAPIを直接叩いて投稿しています。
WP-CLIでも、自前のコマンドが作成できたりするようですが、そういうのを調べる前にいろいろとやってしまったので・・・
WP-CLIはWP-CLIでいろいろ機能があるようなので、いずれいろいろと試してみたいところではあります。

閑話休題
予定表.comでは大量の商品データを投稿するのにコマンドラインからの投稿を行っていて、そこで使用している方法です。

基本的にはPHPスクリプトの頭の方でこちら

<?php

chdir( "/[path]/[to]/html/" );
$_SERVER['HTTPS'] = 'on'; // SSLサイトの場合
require_once 'wp-load.php';

このおまじないの後でWordpressの内部APIが使えます。([path]/[to]/html の部分はWordpressをインストールしたパスに置き換え。)

SSL導入済みサイトでget_site_url()(他にも影響あるAPIがあるかもしれません)を使う場合は$_SERVER['HTTPS’]の指定が必要です。
get_site_url() APIは$_SERVER['HTTPS’]の値を見てサイトがSSL対応かを判定しているからです。
「WordPress アドレス (URL)」や「サイトアドレス (URL)」からSSLの可否を判断していません。
本来httpサーバが自動設定してくれるのを期待しますが、cliでは設定されません。
SSL対応している場合はwp-config.phpで記述して常時するのが良いのかもしれません。

参考:https://wpdocs.osdn.jp/管理画面での_SSL_通信

おまじないの後に例えば

$my_post = array(
    'post_title'        => 'テスト2',
    'post_name'         => 'postname',
    'post_content'      => '記事本文2',
    'post_status'       => 'publish',
    'post_date'         => '2021/12/08',
    'post_author'       => 1,
);
$post_id = wp_insert_post( $my_post, true );

とすれば記事が投稿できます。

WordPressと同じパスにコマンドライン用のスクリプトを置くように説明しているサイトもありますが、セキュリティ上よろしくないので、chdirで移動してからrequire_onceすることで、別パスに置いたスクリプトでも動作するようにしています。

注意点としては、WordpressのAPIはメモリを大量に喰うものがあります。
正確に測定したわけではないですが、感触的にはWP_Queryクラスやadd_post_meta、update_post_meta、あたりが喰っている印象です。
これらのメモリ喰いAPIをループで呼び続けるとメモリを喰い潰して上限に引っ掛かってPHPスクリプトが落ちます。
なので、それらを使う場合は別PHPスクリプトにしてsystem関数などで別プロセスにするのが良いでしょう。
(別プロセスにすると終了時にメモリを解放してくれます)
本来WordpressはWebからだと1回づつ表示を行って終了するので、そういう重い処理は想定されてないようです。

以上です。

PHP,Wordpress

Posted by kisara