Иногда встречаются ситуации, когда приложению нужно использовать функциональность, встроенную в WordPress, но при этом по ряду причин не хочется подключать установленные плагины. Типичным примером может являться скрипт, запускаемый cron'ом и, например, рассылающий письма подписавшимся на рассылку пользователям.
Обычно, если нужно подключить WordPress к приложению, поступают так:
require_once(WORDPRESS_DIR . '/wp-config.php');
?>
После этого приложению становятся доступны все функции/переменные WordPress. Тем не менее, у этого подхода есть недостаток: он подключает все активные плагины. Плохо это может быть тем, что каждый плагин может иметь порядочную (в смысле потребляемых ресурсов) инициализационную секцию: например, цена подключения плагина Simple Forum может быть 70 лишних запросов к базе данных.
Разберёмся, из-за чего это происходит (я буду рассказывать на примере WordPress 2.6, но это также относится — с точностью до номеров строк — к WordPress младших версий).
Итак, когда мы подключаем wp-config.php
, в нём определяются всякие константы, после чего управление передаётся файлу wp-settings.php
:
- /* That's all, stop editing! Happy blogging. */
- if ( !defined('ABSPATH') )
- define('ABSPATH', dirname(__FILE__) . '/');
- require_once(ABSPATH . 'wp-settings.php');
Файл wp-settings.php
определяет кучу разных констант, подключает различные модули WordPress, инициализирует глобальные переменные и активирует плагины.
Нам сейчас интересна именно активация плагинов:
- // Check for hacks file if the option is enabled
- if (get_option('hack_file')) {
- if (file_exists(ABSPATH . 'my-hacks.php'))
- require(ABSPATH . 'my-hacks.php');
- }
- if ( get_option('active_plugins') ) {
- $current_plugins = get_option('active_plugins');
- if ( is_array($current_plugins) ) {
- foreach ($current_plugins as $plugin) {
- if ( '' != $plugin && 0 == validate_file($plugin) && file_exists(WP_PLUGIN_DIR . '/' . $plugin) )
- include_once(WP_PLUGIN_DIR . '/' . $plugin);
- }
- }
- }
- require (ABSPATH . WPINC . '/pluggable.php');
Иными словами, сначала подключается my-hacks.php
, если это разрешено настройками, затем подключаются все активные плагины и в самом конце подключается pluggable.php
.
Фактически, если поддержка my-hacks.php
отключена, то у нас нет возможности отредактировать результат вызова get_option('active_plugins');
(я осознанно не предлагаю редактировать исходный код WordPress, ибо, как показывает практика, ничего, кроме головной боли при обновлении из этого не выходит).
В любом случае, my-hacks.php
объявлен устаревшим (deprecated), поэтому полагаться на него будет нехорошо (ибо вполне вероятно, что в версии 2.7 его не будет).
Ключом к решению проблемы является следующее условие: file_exists(WP_PLUGIN_DIR . '/' . $plugin)
. Как я уже писал в статье "Известные и не очень настройки WordPress", эту константу можно переопределить. Отмечу, что в ветке 2.5 вместо WP_PLUGIN_DIR
нужно использовать PLUGINDIR
(а в 2.6, если требуется обратная совместимость, определять нужно обе константы).
Переходим к окончательному решению. Создаём папку wp-content/plugins2
, в неё помещаем символические ссылки на нужные скрипту плагины (если таковых нет, то ничего страшного). Подключение WordPress к приложению будет осуществляться так:
define('WP_PLUGIN_DIR', WP_PATH . '/wp-content/plugins2');
define('PLUGINDIR', 'wp-content/plugins2');
//Если есть острая необходимость, для 2.6 можно определить WP_PLUGIN_URL
//WP_URL . '/wp-content/plugins2'
require_once(WP_PATH . '/wp-config.php');
Всё просто!