В каком порядке WordPress загружает файлы плагинов?

27 авг. 2012 г., 00:28:41
Просмотры: 39.2K
Голосов: 30

В каком порядке загружаются плагины в WordPress?

И внутри папки конкретного плагина, какой порядок загрузки соблюдается?

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

С помощью этого плагина можно выполнять глубокую отладку: https://wordpress.org/plugins/whats-running/ Он выводит список всех требуемых файлов в WordPress.

Szépe Viktor Szépe Viktor
25 окт. 2014 г. 19:22:53
Все ответы на вопрос 4
6
37

Ответ на первый вопрос:

  1. В файле wp-settings.php WordPress сначала проверяет наличие обязательных плагинов (плагины в необязательной папке mu-plugins) и загружает их.

  2. Затем, если у вас мультисайтовая установка, он проверяет плагины, активированные для всей сети, и загружает их.

  3. После этого он проверяет все остальные активные плагины, просматривая запись active_plugins в таблице базы данных wp_options, и перебирает их. Плагины будут перечислены в алфавитном порядке.

Вот порядок, в котором WordPress загружает почти всё: http://codex.wordpress.org/Action_Reference#Actions_Run_During_a_Typical_Request

Дело в том, что обычно неважно, в каком порядке загружается каждый отдельный плагин, потому что правильно написанные плагины используют хуки WordPress, которые позволяют подключать функциональность в определённые моменты позднее во время запуска WordPress. (Правильно написанные плагины также добавляют префиксы к своим функциям и классам, чтобы избежать конфликтов.)

Подробнее о API плагинов: http://codex.wordpress.org/Plugin_API/

Ответ на второй вопрос:

Полностью зависит от плагина. WordPress загружает только один файл в плагине — обычно это файл с именем the-plugin-name.php, содержащий в начале заголовок, описание, автора и т.д. Дальнейшая загрузка остальных файлов плагина лежит на самом плагине, с использованием require_once, wp_enqueue_script и других подобных функций.

27 авг. 2012 г. 00:58:45
Комментарии

Если я создам плагин, а потом выпущу дополнение к нему, которое должно запускаться после основного плагина, как я могу гарантировать такой порядок выполнения?

urok93 urok93
27 авг. 2012 г. 09:21:44

Это действительно зависит от того, что вы пытаетесь сделать. Но в целом вы можете настроить каждый из них на выполнение через определенный хук с помощью функции add_action(), где можно задать приоритет. http://codex.wordpress.org/Function_Reference/add_action

SeventhSteel SeventhSteel
27 авг. 2012 г. 16:31:32

@SeventhSteel Но что, если один плагин зависит от хука, созданного другим плагином? Если один плагин использует apply_filters() для создания хука, но запускается до плагина, который использует add_filter(), будет ли это работать? Логично предположить, что apply_filters() уже сработает, поэтому вызовы add_filter() во втором плагине ничего не сделают. Имеет ли значение порядок загрузки плагинов при использовании только хуков, создаваемых плагинами?

trusktr trusktr
1 июл. 2013 г. 20:15:12

Важно то, что уже загружено к моменту выполнения apply_filters(). add_filter() должен выполниться до apply_filters(). Если add_filter() находится в файле плагина и не внутри другой функции, он выполнится на хуке plugins_loaded, что обычно происходит до того, как вам понадобится apply_filters().

SeventhSteel SeventhSteel
21 нояб. 2014 г. 19:28:20

Частый сценарий - когда несколько плагинов добавляют свой контент после the_content -- как определяется порядок их отображения?

Dan Knauss Dan Knauss
23 мар. 2017 г. 18:12:47

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

Philip Philip
11 июл. 2023 г. 19:42:42
Показать остальные 1 комментариев
2
17

Я считаю полезным включать в свой плагин действие с "поздней загрузкой", которое выполняется после загрузки всех плагинов, вот так:

add_action('plugins_loaded', 'my_late_loader');

Функция my_late_loader затем инициируется после всех других плагинов, что позволяет мне использовать хуки, определенные другими плагинами, в моей собственной функции my_other_function, которая вызывается внутри my_late_loader

/**
 * Функция поздней загрузки для действий, которые должны выполняться 
 * после загрузки всех плагинов
 */
function my_late_loader(){
    add_action( 'some_hook', 'my_other_function', 10, 1);
}

Немного запутанно (я знаю), но это гарантирует, что хуки в других плагинах будут созданы до их добавления, независимо от порядка загрузки плагинов.

10 июл. 2017 г. 15:43:56
Комментарии

Не существует такого понятия, как создание экшена/фильтра/хука, поэтому это не требуется. Вы можете вызвать add_filter() или add_action() в любой момент, и с этого момента любой вызов apply_filter() или do_action() с тем же именем приведёт к выполнению вашей функции.

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

fietserwin fietserwin
2 апр. 2023 г. 12:56:07

Фильтры и экшены выполняются в определённом порядке, если вы хотите, чтобы экшен выполнялся после всех остальных, то можно использовать этот подход. Конечно, вы можете создавать экшены и фильтры. Я не понимаю, что вы пытаетесь сказать в своём комментарии.

Clinton Clinton
3 апр. 2023 г. 17:50:31
0

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

add_action('init', 'function_to_add');

Первый параметр — это "название действия", к которому привязана ваша функция (второй параметр). Указанное действие является основным фактором, определяющим, когда ваш плагин загружается. Есть необязательный третий параметр (приоритет), который дает некоторый контроль над тем, в каком месте среди этой группы загружается ваша функция. (Хотя это не очень точно, поскольку часто сложно узнать приоритеты всех установленных плагинов.) В WordPress Codex есть отличный список всех доступных хуков действий с пояснениями для различных типов запросов.

Что касается второго вопроса, как указано в документации Plugin Basics:

Когда WordPress загружает список установленных плагинов на странице "Плагины" в админ-панели, он ищет в папке plugins (и её подпапках) PHP-файлы с комментариями заголовка плагина WordPress.

Таким образом, файл в вашем плагине с заголовком (согласно документации, он должен быть только один) загружается первым. См. ответ @Clinton для рекомендаций по работе с несколькими хуками в одном плагине.

Если вы попали на этот ответ (как и я) как начинающий разработчик плагинов для WordPress, в Plugin Handbook WordPress можно найти гораздо больше полезной информации.

30 сент. 2020 г. 19:52:26
0

О зависимостях между плагинами: я обнаружил, что самый простой способ контролировать порядок их загрузки — это обернуть init следующим образом:

add_action('init', 'init_first', 11); в first_plugin.php

add_action('init', 'init_second', 12); в second_plugin.php

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

Яаков.

4 мая 2021 г. 18:02:24