Где размещать сторонние PHP библиотеки в WordPress?

21 окт. 2011 г., 16:12:56
Просмотры: 17K
Голосов: 9

Я разрабатываю несколько плагинов с открытым исходным кодом и тему (все это часть "набора"), которые используют одну и ту же стороннюю PHP библиотеку. Интересно, какой способ включения её в WordPress будет наилучшим. Вот несколько мыслей:

  • разместить её в одном из плагинов и требовать установки и активации этого плагина
  • создать специальный "базовый" плагин, единственной функцией которого будет подключение этой библиотеки
  • разместить её непосредственно в папке wp-content

Какие у вас мысли по этому поводу?

2
Комментарии

Это разработка для личного использования на одном сайте или для нескольких сайтов / публичного релиза?

Rarst Rarst
21 окт. 2011 г. 16:21:46

Это набор плагинов с открытым исходным кодом. Я обновляю вопрос, чтобы это уточнить.

gou1 gou1
21 окт. 2011 г. 16:31:59
Все ответы на вопрос 4
4

Если каждый плагин/тема функционирует самостоятельно, то, вероятно, следует включить библиотеку в каждый плагин/тему.

Затем просто проверьте, существует ли класс или функция из сторонней библиотеки, перед тем как подключать её.

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include здесь
}

или

<?php
if( function_exists( 'some_function' ) )
{
   // Подключаем здесь
}

В качестве альтернативы, вы можете обернуть каждую функцию/класс/переменную/константу из сторонней библиотеки в проверку на существование, как это делается с pluggable functions.

Если все плагины и тема зависят друг от друга, то разделение их не имеет особого смысла, и вам стоит пересмотреть этот подход.

21 окт. 2011 г. 16:47:22
Комментарии

Плагины имеют разные функции, поэтому их разделяют: вы активируете только то, что вам нужно.

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

Сейчас лучшее решение кажется в виде "основного" плагина. Вы активируете его первым, чтобы он подключил все сторонние компоненты, а затем выбираете нужные вам плагины.

gou1 gou1
21 окт. 2011 г. 17:13:06

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

chrisguitarguy chrisguitarguy
21 окт. 2011 г. 17:24:45

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

gou1 gou1
21 окт. 2011 г. 17:38:50

О, я бы разместил их в папке library внутри каждого плагина/темы. Затем в основном файле плагина выполнить проверку и подключить их при необходимости.

chrisguitarguy chrisguitarguy
21 окт. 2011 г. 17:56:44
0

Привяжите весь зависимый код к действию в библиотечном плагине.

Пример кода для библиотечного плагина:

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' не было вызвано.

12 янв. 2013 г. 19:25:10
2

Дополняя ответ от 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');
13 янв. 2013 г. 02:34:01
Комментарии

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

gou1 gou1
15 февр. 2013 г. 17:57:32

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

webaware webaware
16 февр. 2013 г. 00:51:37
1

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

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

Прямое размещение в wp-content выглядит наихудшим решением.

21 окт. 2011 г. 16:47:53
Комментарии

Изначально я тоже так думал, но выяснил, что недостаточно просто подключить свои библиотеки в одном активном плагине: иногда (например, при его активации) файл "основного" плагина может не подгружаться.

gou1 gou1
21 окт. 2011 г. 18:19:09