XserverへSSH接続し、WordPressをWP-CLIで操作しようとしたところ、PHPのバージョンやXserver標準のWP-CLIが原因で正常に動作しない問題が発生しました。
最終的には、Xserver標準の /usr/bin/wp を変更するのではなく、
PHP 8.3
+
自分のホームディレクトリにインストールしたWP-CLI
という構成にすることで解決できました。
この記事では、その手順をステップバイステップでまとめます。
今回の環境
今回確認したXserver環境は以下です。
OS: Linux
Shell: /bin/bash
PHP: 8.3.30
MariaDB: 10.5.17
当初、Xserverに入っていたWP-CLIをPHP 8.3で実行すると、
WP-CLI version: 2.4.0
でした。
実際の wp cli info でも、WP-CLI 2.4.0であることを確認できました。
1. Xserver標準のWP-CLIで発生した問題
最初は通常どおり、
wp
を使用していました。
しかし、WordPressの処理を実行するとPHP関連のエラーが発生しました。
そこでPHP 8.3を明示してWP-CLIを実行すると、WordPress自体は動くようになりました。
例えば、
/usr/bin/php8.3 /usr/bin/wp core version
という形です。
ところが今度は、WP-CLIから大量の Deprecated 警告が表示されました。
例:
PHP Deprecated:
Creation of dynamic property
WP_CLI\Dispatcher\CompositeCommand::$longdesc is deprecated
PHP Deprecated:
Creation of dynamic property
WP_CLI\Dispatcher\Subcommand::$longdesc is deprecated
実際に何百行ものDeprecatedメッセージが出力されました。
つまり、
PHP 8.3ではWordPressを動かせる
↓
しかしXserver側のWP-CLIが古い
↓
PHP 8.3で大量のDeprecated警告が出る
という状態でした。
2. まず現在のWP-CLIを確認する
以下を実行します。
wp cli info
確認したいのは主に、
PHP binary
PHP version
WP_CLI phar path
WP-CLI version
です。
また、
which wp
または、
command -v wp
でも実体を確認できます。
Xserver標準のWP-CLIの場合、
/usr/bin/wp
が返ってくることがあります。
3. PHP 8.3を直接指定してみる
Xserverでは今回、
/usr/bin/php8.3
を利用できました。
確認します。
/usr/bin/php8.3 -v
WP-CLIをPHP 8.3で直接実行する場合は、
/usr/bin/php8.3 /usr/bin/wp cli info
とします。
これは一時的な確認方法としては有効です。
ただし、毎回、
/usr/bin/php8.3 /usr/bin/wp
と入力するのは面倒です。
さらに今回の環境では、標準WP-CLIが古かったため、PHP 8.3を使うとDeprecated警告が大量に表示されました。
そこで、WP-CLI自体も新しいものへ変更します。
4. Xserver標準のWP-CLIは変更しない
ここが重要です。
Xserverにある、
/usr/bin/wp
を直接上書きしたり削除したりする必要はありません。
共有サーバーなので、システム側のWP-CLIではなく、
/home/ユーザー名/bin/
に自分専用のWP-CLIを配置します。
今回なら、
/home/wp144924/bin/
です。
5. ~/bin を作成する
SSHで以下を実行します。
mkdir -p "$HOME/bin"
~ や $HOME は、現在ログインしているユーザーのホームディレクトリです。
今回なら、
/home/wp144924
なので、
/home/wp144924/bin
が作成されます。
6. 新しいWP-CLIをダウンロードする
WP-CLIのPHARファイルを、自分の bin ディレクトリへ配置します。
curl -L https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
-o "$HOME/bin/wp-cli.phar"
ダウンロード後、PHP 8.3で直接確認します。
/usr/bin/php8.3 "$HOME/bin/wp-cli.phar" --info
今回導入したものは、
WP-CLI version: 2.12.0
でした。
7. wp と入力するだけでPHP 8.3を使うようにする
毎回、
/usr/bin/php8.3 "$HOME/bin/wp-cli.phar"
と入力するのは面倒なので、ラッパースクリプトを作成します。
cat > "$HOME/bin/wp" <<'EOF'
#!/bin/bash
exec /usr/bin/php8.3 "$HOME/bin/wp-cli.phar" "$@"
EOF
実行権限を付けます。
chmod 700 "$HOME/bin/wp"
WP-CLI本体にも権限を設定しておきます。
chmod 600 "$HOME/bin/wp-cli.phar"
これで、
~/bin/wp
を実行すると、
PHP 8.3
↓
~/bin/wp-cli.phar
という順番で実行されます。
8. ~/bin を /usr/bin より優先する
ここも重要です。
Linuxでは PATH の左側から順番にコマンドを探します。
そのため、
/usr/bin
より、
$HOME/bin
を先にする必要があります。
.bash_profile に以下を設定します。
export PATH="$HOME/bin:$PATH"
注意したいのが、以下です。
PATH=$PATH:$HOME/bin
この書き方では、$HOME/bin が最後に追加されます。
その場合、
/usr/bin/wp
が先に見つかる可能性があります。
今回の目的では、
export PATH="$HOME/bin:$PATH"
とし、$HOME/bin を先頭に置きます。
9. Xserverにnanoがない場合
今回のXserver環境では、
nano ~/.bash_profile
を実行すると、
-bash: nano: コマンドが見つかりません
となりました。
その場合は、
vi ~/.bash_profile
を使うこともできます。
ただし、viに慣れていない場合は、コマンドだけで設定する方が簡単です。
例えば、
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash_profile
とします。
10. PATHの重複に注意する
設定後、
type -a wp
を実行します。
正常なら、
wp は /home/wp144924/bin/wp です
wp は /usr/bin/wp です
のようになります。
これは問題ありません。
1行目の、
/home/wp144924/bin/wp
が実際に使用されます。
2行目の、
/usr/bin/wp
はXserver標準のWP-CLIです。
削除する必要はありません。
同じ ~/bin/wp が何度も表示される場合
例えば、
wp は /home/wp144924/bin/wp です
wp は /usr/bin/wp です
wp は /home/wp144924/bin/wp です
wp は /home/wp144924/bin/wp です
となる場合があります。
これは $PATH に、
/home/wp144924/bin
が複数回入っている可能性があります。
確認します。
echo "$PATH" | tr ':' '\n'
さらに、
grep -n 'HOME/bin' ~/.bash_profile ~/.bashrc 2>/dev/null
でも確認できます。
今回、
PATH=$PATH:$HOME/bin
と、
export PATH="$HOME/bin:$PATH"
の両方が存在していました。
さらに入力ミスで、
export PATHexport PATH="$HOME/bin:$PATH"
となっている行もありました。
不要な行を削除し、
export PATH="$HOME/bin:$PATH"
だけを残します。
11. .bash_profile をコマンドだけで修正する方法
バックアップを取ります。
cp ~/.bash_profile ~/.bash_profile.bak
HOME/bin を含む既存行を削除します。
sed -i '/HOME\/bin/d' ~/.bash_profile
正しい設定を追加します。
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash_profile
その後、一度SSHからログアウトして再接続します。
12. 最終確認
SSHへ再接続後、
command -v wp
を実行します。
以下ならOKです。
/home/wp144924/bin/wp
続いて、
wp cli info
を実行します。
今回の最終状態は以下になりました。
PHP binary: /opt/php-8.3.30/bin/php
PHP version: 8.3.30
MySQL binary: /usr/bin/mariadb
MySQL version: MariaDB 10.5.17
WP_CLI phar path:
phar:///home/wp144924/bin/wp-cli.phar
WP-CLI version: 2.12.0
つまり、
wp
↓
~/bin/wp
↓
PHP 8.3
↓
~/bin/wp-cli.phar
↓
WP-CLI 2.12.0
という構成になりました。
13. Deprecated警告も消えた
Xserver標準のWP-CLIをPHP 8.3で動かしたときは、
PHP Deprecated:
が大量に表示されていました。
しかし、新しいWP-CLIへ切り替えた後は、
wp cli info
を実行してもDeprecated警告は表示されなくなりました。
そのため、単純にエラー表示だけを、
E_DEPRECATED
で非表示にするのではなく、今回のケースではWP-CLI自体を新しくする方が根本的な解決になりました。
14. 通常のWP-CLIコマンドが簡単になる
設定後は、
wp core version
wp plugin list
wp theme list
wp db query "SHOW TABLES;"
などをそのまま実行できます。
以前のように、
/usr/bin/php8.3 /usr/bin/wp ...
と入力する必要はありません。
15. All-in-One WP MigrationのCLIでも利用できた
今回この設定を行った主な目的は、All-in-One WP MigrationのバックアップをWP-CLIから操作することでした。
例えば、
wp ai1wm list-backups
でバックアップ一覧を表示できます。
.wpress の中身を確認する場合は、
wp ai1wm browse-backup バックアップ名.wpress
展開する場合は、
wp ai1wm extract-backup バックアップ名.wpress \
--extract-path="$HOME/ai1wm-check"
実際に復元する場合は、
wp ai1wm restore バックアップ名.wpress --yes
という形で実行できます。
今回、PHP 8.3+WP-CLI 2.12.0の環境に変更したあと、All-in-One WP Migrationからの復元も正常に完了しました。
まとめ
今回のXserver環境では、標準のWP-CLIをそのまま利用すると、現在のWordPress・PHP環境との組み合わせで問題が発生しました。
最終的には、
Xserver標準
/usr/bin/wp
WP-CLI 2.4.0
↓
自分専用
~/bin/wp
↓
PHP 8.3
↓
~/bin/wp-cli.phar
WP-CLI 2.12.0
という構成に変更しました。
ポイントは、Xserver標準のWP-CLIを削除・変更するのではなく、自分のホームディレクトリに新しいWP-CLIを置き、PATHでそちらを優先することです。
設定としては最終的に、
export PATH="$HOME/bin:$PATH"
と、
#!/bin/bash
exec /usr/bin/php8.3 "$HOME/bin/wp-cli.phar" "$@"
の組み合わせになります。
これにより、SSH上では単に、
wp
と入力するだけで、PHP 8.3+新しいWP-CLIを利用できるようになりました。
最終構成
~/.bash_profile
export PATH="$HOME/bin:$PATH"
~/bin/wp
#!/bin/bash
exec /usr/bin/php8.3 "$HOME/bin/wp-cli.phar" "$@"
~/bin/wp-cli.phar
この構成なら、Xserver標準の /usr/bin/wp を残したまま、自分のSSH環境だけWP-CLIを新しくできます。
