Где разместить стороннюю библиотеку PHP?

8

Я разрабатываю пару плагинов с открытым исходным кодом и тему (все это часть «комплекта»), которые все используют одну и ту же стороннюю библиотеку PHP. Мне интересно, как лучше всего включить его в Wordpress. Вот несколько мыслей:

  • поместите его в один из плагинов и потребуйте, чтобы плагин был установлен и активирован
  • создать специальный «основной» плагин, который ничего не делает, кроме него
  • положить прямо в wp-content

Есть мысли на этот счет?

gou1
источник
Это разработка для частного использования на одном сайте или нескольких сайтах / в публичной версии?
Rarst
Это для набора плагинов с открытым исходным кодом. Я обновляю вопрос, чтобы указать на это.
gou1

Ответы:

5

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

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

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include here
}

или

<?php
if( function_exists( 'some_function' ) )
{
   // Require/include stuff here
}

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

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

chrisguitarguy
источник
Плагины имеют разные функции, отсюда и разделение: вы активируете только то, что хотите. Но все зависит от фреймворка, поэтому мне нужно включить эту библиотеку. У него есть автозагрузчик, и довольно много классов, поэтому проверка / требование для каждого класса будет действительно трудной задачей. И я не могу выбросить его в каждый класс, потому что он будет регистрировать автозагрузчик несколько раз. В данный момент лучшим решением является плагин «core». Сначала вы активируете его, поэтому для него требуются все сторонние компоненты, а затем выбираете нужные плагины.
gou1
Вы думаете об этом неправильно: просто создайте файл начальной загрузки, включающий что-то, что вы можете проверить, который включает / требует все классы. Затем потребуйте этот файл. Один чек. Не рассчитывайте на то, что ваши пользователи поймут, что им нужно установить второй плагин.
chrisguitarguy
Это как раз мой вопрос: каким методом (плагином, загрузчиком и т. Д.) Куда поместить файлы?
gou1
О, я бы положил их в libraryпапку в каждом плагине / теме. Затем в вашем основном файле плагина запустите проверку и включите их при необходимости.
chrisguitarguy
3

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

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

add_action( 'plugins_loaded', 'load_library', 0 );

function load_library()
{
    # load all the classes and files you need
    # Set up $plugin_url and $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 )
{
    # do stuff
}

Библиотека обрабатывает все основные части: проверяет правильность версии PHP, константы WordPress, настройки нескольких сайтов и т. Д.

Другой код ничего не сделает, если действие 'library_loaded'не вызывается.

Фуксия
источник
1

Помимо ответа chrisguitarguy, если ваши библиотеки представлены в виде классов PHP, вы можете использовать spl_autoload_register () для загрузки этих классов, если они еще не были загружены другим плагином. Затем вы можете связать библиотеки в свой плагин и просто использовать их, полагаясь на загрузчик классов, чтобы включить их при необходимости. Вы также можете использовать загрузчик классов для загрузки классов вашего собственного плагина.

например

define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');

/**
* autoload classes as/when needed
* @param string $class_name name of class to attempt to load
*/
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];
    }
}

// register function for autoloading required classes
spl_autoload_register('wpse_31726_autoload');
webaware
источник
Проблема здесь не в автозагрузке, а в том, что «все используют одну и ту же стороннюю библиотеку PHP».
gou1
1
Согласно chrisguitarguy, каждый может иметь свою собственную копию библиотеки и, таким образом, работать по существу независимо. Так как каждый призван работать и, следовательно, требует библиотеки, они загружают ее, если она еще не загружена. Автозагрузка классов просто предоставляет удобный способ обращения к биту «загрузить его, если он еще не загружен».
webaware
0

Поскольку официального каталога поставщиков не существует , я бы выбрал «основной» плагин, который не делает ничего, кроме библиотеки. Вы тогда заставляете свои плагины требовать того основного плагина.

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

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

Герт
источник
Сначала я тоже об этом думал, но обнаружил, что недостаточно просто включить включение ваших библиотек в один активированный плагин: иногда (например, при его активации) файл плагина «core» не требуется ,
gou1