Лечим WP-CLI на хостинге Beget: Ошибка Parse error из-за старой версии PHP
20 мая 2026
Ситуация с Бегет: пробуем выполнить команду типа wp @prod plugin list — и получаешь ошибку:
Parse error: syntax error, unexpected ':', expecting ')' in /home/u/.../wp-content/plugins/my-plugin/includes/Commands.php on line 60
Error: На сайте возникла критическая ошибка.
Знакомо? Если вы на Beget (или любом другом хостинге, где системный PHP отстаёт от жизни), эта заметка — для вас.
Почему так происходит
На Beget по умолчанию установлен PHP 7.4. Даже если вы переключили сайт на PHP 8.2 через панель управления, системный /usr/local/bin/wp всё равно использует старую версию. Проверяем:
$ ssh user@server "head -3 /usr/local/bin/wp"
#!/bin/sh
exec /usr/local/php/cgi/7.4/bin/php /usr/local/bin/wp-cli.phar "$@"
Вот он, корень проблемы. PHP 7.4 захардкожен в скрипте, и никакие переменные окружения вроде WP_CLI_PHP на него не действуют.
А ваш плагин или тема тем временем используют возможности PHP 8.x — именованные аргументы, match-выражения, типизированные свойства. Отсюда и Parse error.
Что не работает
Перед тем как показать решение — что я пробовал и что не сработало:
WP_CLI_PHP=/usr/local/bin/php8.2— системныйwpего игнорирует, потому что путь к PHP захардкожен.- Создание враппера
~/bin/wp— работает при интерактивном SSH, но неинтерактивные сессии WP-CLI не читают.bashrcи~/binне попадает вPATH.
Рабочее решение: WP_CLI_SSH_PRE_CMD
В документации WP-CLI есть механизм WP_CLI_SSH_PRE_CMD — команда, которая выполняется на удалённом сервере перед основным вызовом. Через неё можно переопределить wp как shell-функцию:
WP_CLI_SSH_PRE_CMD='wp() { /usr/local/bin/php8.3 /usr/local/bin/wp-cli.phar "$@"; }' wp @site eval 'echo PHP_VERSION;'
Результат: 8.3.6. Работает!
Но каждый раз писать такую простыню неудобно.
Автоматизируем через хук before_ssh?
Автоматизация через pre-ssh.php
WP-CLI поддерживает файлы-хуки, которые подключаются через require в wp-cli.yml.
Создаём pre-ssh.php в корне проекта:
<?php
/**
* Pre-SSH hook: overrides the remote `wp` command to use php8.3.
*
* The system /usr/local/bin/wp hardcodes PHP 7.4 and ignores WP_CLI_PHP,
* so we redefine wp as a shell function via WP_CLI_SSH_PRE_CMD.
*/
if ( class_exists( 'WP_CLI' ) ) {
WP_CLI::add_hook( 'before_ssh', function () {
putenv( 'WP_CLI_SSH_PRE_CMD=wp() { /usr/local/bin/php8.3 /usr/local/bin/wp-cli.phar "$@"; }' );
} );
}
И подключаем его в wp-cli.yml:
require:
- pre-ssh.php
@site:
ssh: user@server
path: /home/u/user/site.ru/public_html
key: ~/.ssh/id_ed25519
Теперь wp @site plugin list автоматически использует PHP 8.3 — без лишних телодвижений.
Как это работает
- WP-CLI читает
wp-cli.ymlи подгружаетpre-ssh.php - Хук
before_sshсрабатывает перед каждым SSH-соединением - Через
putenv()задаётсяWP_CLI_SSH_PRE_CMD - WP-CLI передаёт эту переменную на сервер и выполняет её содержимое перед основным вызовом
- Shell-функция
wp()переопределяет системныйwp— теперь он вызываетphp8.3вместоphp7.4
Альтернативный путь: починить серверный wp
Если у вас есть root-доступ, можно исправить сам /usr/local/bin/wp:
#!/bin/sh
PHP=${WP_CLI_PHP:-/usr/local/php/cgi/7.4/bin/php}
exec "$PHP" /usr/local/bin/wp-cli.phar "$@"
Тогда WP_CLI_PHP будет работать как положено, и хук не понадобится. Но на shared-хостинге вроде Beget такого доступа обычно нет — поэтому WP_CLI_SSH_PRE_CMD остаётся самым практичным вариантом.
Коротко
- Системный
wpна Beget использует PHP 7.4 — это ломает плагины под PHP 8.x WP_CLI_PHPне помогает — путь к PHP захардкожен- Решение:
WP_CLI_SSH_PRE_CMD+ хукbefore_sshвpre-ssh.php - Один раз настроил — и забыл


