Где размещать сторонние PHP библиотеки в WordPress?
Я разрабатываю несколько плагинов с открытым исходным кодом и тему (все это часть "набора"), которые используют одну и ту же стороннюю PHP библиотеку. Интересно, какой способ включения её в WordPress будет наилучшим. Вот несколько мыслей:
- разместить её в одном из плагинов и требовать установки и активации этого плагина
- создать специальный "базовый" плагин, единственной функцией которого будет подключение этой библиотеки
- разместить её непосредственно в папке
wp-content
Какие у вас мысли по этому поводу?
Если каждый плагин/тема функционирует самостоятельно, то, вероятно, следует включить библиотеку в каждый плагин/тему.
Затем просто проверьте, существует ли класс или функция из сторонней библиотеки, перед тем как подключать её.
<?php
if( class_exists( 'SomeClass' ) )
{
// require/include здесь
}
или
<?php
if( function_exists( 'some_function' ) )
{
// Подключаем здесь
}
В качестве альтернативы, вы можете обернуть каждую функцию/класс/переменную/константу из сторонней библиотеки в проверку на существование, как это делается с pluggable functions.
Если все плагины и тема зависят друг от друга, то разделение их не имеет особого смысла, и вам стоит пересмотреть этот подход.

Плагины имеют разные функции, поэтому их разделяют: вы активируете только то, что вам нужно.
Но все они зависят от фреймворка, поэтому мне нужно включить эту библиотеку. В ней есть автозагрузчик и довольно много классов, поэтому проверка/подключение каждого класса вручную была бы настоящей головной болью. И я не могу просто добавить её в каждый класс, потому что это приведёт к многократной регистрации автозагрузчика.
Сейчас лучшее решение кажется в виде "основного" плагина. Вы активируете его первым, чтобы он подключил все сторонние компоненты, а затем выбираете нужные вам плагины.

Вы мыслите неверно: просто создайте загрузочный файл, включающий что-то, что можно проверить, и который подключает/загружает все классы. Затем подключите этот файл. Одна проверка. Не рассчитывайте, что пользователи догадаются установить второй плагин.

Это как раз мой вопрос: независимо от метода (плагин, загрузчик и т.д.), куда поместить файлы?

Привяжите весь зависимый код к действию в библиотечном плагине.
Пример кода для библиотечного плагина:
add_action( 'plugins_loaded', 'load_library', 0 );
function load_library()
{
# загрузите все необходимые классы и файлы
# Установите переменные $plugin_url и $plugin_directory
do_action( 'library_loaded', $plugin_url, $plugin_directory );
}
В вашем зависимом коде не выполняйте никаких действий до вызова события:
add_action( 'library_loaded', 'start_my_code', 10, 2 );
function start_my_code( $lib_url, $lib_directory )
{
# выполняйте необходимые действия
}
Библиотека обрабатывает все базовые части: проверку версии PHP, константы WordPress, настройки мультисайта и т.д.
Зависимый код не будет выполнять никаких действий, если событие 'library_loaded'
не было вызвано.

Дополняя ответ от chrisguitarguy, если ваши библиотеки представлены в виде PHP-классов, то вы можете использовать функцию spl_autoload_register() для загрузки этих классов, если они еще не были загружены другим плагином. Затем вы можете включить библиотеки в свой плагин и просто использовать их, полагаясь на автозагрузчик классов для их подключения в нужный момент. Также вы можете использовать автозагрузчик для загрузки классов самого вашего плагина.
Например:
define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');
/**
* Автозагрузка классов по мере необходимости
* @param string $class_name имя класса для загрузки
*/
function wpse_31726_autoload($class_name) {
static $classMap = array (
'Wpse31726_Admin' => 'class.Wpse31726_Admin.php',
'Wpse31726_CsvLoader' => 'class.Wpse31726_CsvLoader.php',
'Wpse31726_Plugin' => 'class.Wpse31726_Plugin.php',
'parseCSV' => 'lib/parsecsv/parsecsv.lib.php',
);
if (isset($classMap[$class_name])) {
require WPSE_31726_PLUGIN_ROOT . $classMap[$class_name];
}
}
// Регистрация функции для автозагрузки необходимых классов
spl_autoload_register('wpse_31726_autoload');

Проблема здесь не в автозагрузке, а в том, что "все используют одну и ту же стороннюю PHP-библиотеку."

Как отметил chrisguitarguy, каждый плагин может иметь свою собственную копию библиотеки и таким образом работать практически независимо. Когда каждый плагин вызывается для работы и ему требуется библиотека, он загружает её, если она ещё не была загружена. Автозагрузка классов просто предоставляет удобный способ реализовать часть "загрузить, если ещё не загружена".

Поскольку официального каталога поставщиков не существует, я бы выбрал вариант с "основным" плагином, который ничего не делает, кроме как подключает библиотеку. Затем вы указываете, что ваши плагины требуют этот основной плагин.
Размещение библиотеки в одном из ваших реальных плагинов потребует от пользователя активации этого плагина, даже если он никогда не будет использовать его функциональность. Отдельный основной плагин выглядит более чистым решением.
Прямое размещение в wp-content выглядит наихудшим решением.
