Вопрос или проблема
Я хочу запустить скрипт перед тем, как начнется выполнение чего-либо в WordPress.
Я знаю, что это неправильно, но сейчас моя функция находится в файле index.php
перед следующим кодом:
{{{МОЯ ФУНКЦИЯ ЗДЕСЬ}}}
require 'vendor/autoload.php';
use GeoIp2\Database\Reader;
session_start();
if (!isset($_SESSION['country'])) {
$reader = new Reader('db/GeoLite2-Country.mmdb');
$record = $reader->country($_SERVER['REMOTE_ADDR']);
$_SESSION['country'] = $record->country->isoCode;
}
{{{МОЯ ФУНКЦИЯ ЗАКАНЧИВАЕТСЯ ЗДЕСЬ}}}
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define( 'WP_USE_THEMES', true );
/** Загрузка окружения и шаблона WordPress */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
Очевидно, что это переопределяется при обновлении WordPress, так как я могу безопасно и правильно включить свою функцию, пожалуйста?
Я пробовал следующее в файле functions.php
моей темы:
add_action( 'init', 'my_script' );
function my_script() {
// мой скрипт здесь
}
Но это недостаточно рано, может быть, я ошибаюсь?
Может кто-то помочь, пожалуйста?
Большое спасибо
init
не является первым действием, которое выполняется при установке WordPress. Вот основные этапы типичного порядка загрузки.
https://codex.wordpress.org/Plugin_API/Action_Reference
Попробуйте подключиться к ‘muplugins_loaded’. Не думаю, что это условное действие, так что оно должно выполняться каждый раз.
https://codex.wordpress.org/Plugin_API/Action_Reference/muplugins_loaded
<?php
add_action( 'muplugins_loaded', 'my_script' );
function my_script() {
// мой скрипт здесь
}
Первый PHP файл, который WordPress загружает и не перезаписывает при обновлении, это wp-config.php
. На этом этапе WordPress еще не загружен. Вы можете разместить свои функции в начале этого файла.
Вы можете просто разместить свой код в любом файле (с расширением .php
) в папке /wp-content/mu-plugins/
Все PHP файлы в этом каталоге (но не в подкаталогах) автоматически будут выполняться перед запуском любых хуков (да, даже перед muplugins_loaded
).
Это, вероятно, лучшее место для кастомизаций сайта, чем functions.php
темы, так как они сохранятся, если вы измените тему.
Я знаю, что это старый вопрос, но есть еще одно решение. Так как автор говорит “перед абсолютно всем”, я хотел бы упомянуть возможность выполнения PHP кода перед тем, как будет загружено что-либо, включая index.html.
Вы можете установить переменную php ini php_autoprepend_file, которая указывает на скрипт. Этот скрипт будет выполнен первым. Некоторые веб-щиты используют это для защиты от разных видов вредоносного ПО.
Вы можете разместить это в вашем конфигурационном файле Apache:
php_value auto_prepend_file "/var/www/vhosts/example.com/httpdocs/do-this-first.php"
или в файле .htaccess в подкаталоге.
Пример использования: разместите это в admin/ и укажите auto_prepend_file на сценарий, который будет проверять, что доступ имеют только пользователи с определенных IP адрессов.
Очевидно, что, поскольку это выполняется до WordPress, никакие функции WP еще не определены.
Ответ или решение
Для решения задачи запуска скрипта перед выполнением любого кода WordPress, вы можете воспользоваться несколькими подходами, которые обеспечат корректное выполнение пользовательского кода без риска его перезаписи в ходе обновления WordPress. Основная цель — вставить ваш код так, чтобы он выполнялся как можно раньше в процессе выполнения запросов к сайту, но при этом оставался вне зависимости от обновлений WordPress.
Теория
В WordPress существует определенный порядок загрузки файлов и выполнения действий. Задача встраивания пользовательского скрипта сводится к пониманию и управлению этим процессом загрузки. В большинстве случаев для настройки поведения WordPress используются хуки (hooks), посредством которых можно привязывать выполнение вашего кода к определенным этапам загрузки системы: действия (actions) и фильтры (filters).
Однако, если необходимо выполнить код до загрузки ядра WordPress, стоит обратить внимание на файл wp-config.php
, а также на использование папки mu-plugins
.
Примеры
-
Использование файла wp-config.php:
В WordPress файл
wp-config.php
загружается наиболее рано среди несистемных файлов и при этом не перезаписывается при обновлениях. Вы можете разместить ваш код в начале этого файла для его выполнения до загрузки WordPress:<?php // Ваш код здесь
Но помните, что на этом этапе WordPress еще не инициализирован, поэтому недоступны его функции и объекты.
-
Каталог mu-plugins:
В каталоге
wp-content/mu-plugins
можно разместить PHP-файлы. Эти файлы, в отличие от привычных плагинов, загружаются автоматически и еще до того, как любые хуки начнут срабатывать:// Создание файла в wp-content/mu-plugins/my-custom-plugin.php <?php // Ваш код здесь
Код в этих файлах будет загружен до выполнения действия
muplugins_loaded
, что делает этот способ предпочтительным для наиболее ранней загрузки пользовательского кода, который должен выполняться до инициализации системы хуков. -
Использование php_value auto_prepend_file:
Альтернативным подходом может быть использование PHP-директивы
auto_prepend_file
, которая указывает на выполнение определенного скрипта до всего остального:php_value auto_prepend_file "/path/to/do-this-first.php"
Это можно поместить в конфигурацию Apache или
.htaccess
файла. Такой подход гарантирует выполнение кода до обработки любых других файлов, в том числе и WordPress. Однако этот метод требует внешних от WordPress настроек серверного окружения и, соответственно, не обеспечивает доступность функций этой системы.
Применение
Если вам необходимо использовать скрипт для предварительной проверки или установки окружения (например, определения страны пользователя при помощи GeoIP), лучшим решением будет использовать mu-plugins
. Таким образом вы не только гарантируете выполнение кода рано в процессе загрузки сайта, но и обеспечиваете постоянство выполнения независимо от обновлений тем или плагинов.
Если задача стоит более установить контроль доступа или произвести иную глубокую манипуляцию перед выполнением даже этого каталога, auto_prepend_file
обеспечит выполнение ряда задач до инициализации WordPress. Однако данный способ должен использоваться с осторожностью во избежание возможных проблем совместимости и производительности.
Заключение
Безопасность и устойчивость вашего решения напрямую зависит от выбранного вами метода. Поддержание кода вне основных файлов системы позволит избежать его потери при обновлениях WordPress. Важно помнить, что встраивание кода до инициализации необходимых системных файлов WordPress исключает возможность применения функций и методов этой CMS на ранних этапах выполнения сценария. Поэтому стоит внимательно оценить необходимость и реализацию таких решений применительно к вашим задачам.