Cover Image for Лечим WP-CLI на хостинге Beget: Ошибка Parse error из-за старой версии PHP

Лечим 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 — без лишних телодвижений.

Как это работает

  1. WP-CLI читает wp-cli.yml и подгружает pre-ssh.php
  2. Хук before_ssh срабатывает перед каждым SSH-соединением
  3. Через putenv() задаётся WP_CLI_SSH_PRE_CMD
  4. WP-CLI передаёт эту переменную на сервер и выполняет её содержимое перед основным вызовом
  5. 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
  • Один раз настроил — и забыл