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

Ответ на первый вопрос:
В файле
wp-settings.php
WordPress сначала проверяет наличие обязательных плагинов (плагины в необязательной папкеmu-plugins
) и загружает их.Затем, если у вас мультисайтовая установка, он проверяет плагины, активированные для всей сети, и загружает их.
После этого он проверяет все остальные активные плагины, просматривая запись
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
и других подобных функций.

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

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

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

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

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

Я считаю полезным включать в свой плагин действие с "поздней загрузкой", которое выполняется после загрузки всех плагинов, вот так:
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);
}
Немного запутанно (я знаю), но это гарантирует, что хуки в других плагинах будут созданы до их добавления, независимо от порядка загрузки плагинов.

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

Изначально я пришел на эту страницу с тем же вопросом, что и первый пользователь. Оба ответа от @SeventhSteel и @Clinton содержат очень полезную информацию, но требуют дополнительного изучения. Как указано в этих ответах, правильно написанный плагин будет использовать хуки и будет содержать вызов, похожий на следующий:
add_action('init', 'function_to_add');
Первый параметр — это "название действия", к которому привязана ваша функция (второй параметр). Указанное действие является основным фактором, определяющим, когда ваш плагин загружается. Есть необязательный третий параметр (приоритет), который дает некоторый контроль над тем, в каком месте среди этой группы загружается ваша функция. (Хотя это не очень точно, поскольку часто сложно узнать приоритеты всех установленных плагинов.) В WordPress Codex есть отличный список всех доступных хуков действий с пояснениями для различных типов запросов.
Что касается второго вопроса, как указано в документации Plugin Basics:
Когда WordPress загружает список установленных плагинов на странице "Плагины" в админ-панели, он ищет в папке plugins (и её подпапках) PHP-файлы с комментариями заголовка плагина WordPress.
Таким образом, файл в вашем плагине с заголовком (согласно документации, он должен быть только один) загружается первым. См. ответ @Clinton для рекомендаций по работе с несколькими хуками в одном плагине.
Если вы попали на этот ответ (как и я) как начинающий разработчик плагинов для WordPress, в Plugin Handbook WordPress можно найти гораздо больше полезной информации.

О зависимостях между плагинами: я обнаружил, что самый простой способ контролировать порядок их загрузки — это обернуть init
следующим образом:
add_action('init', 'init_first', 11); в first_plugin.php
add_action('init', 'init_second', 12); в second_plugin.php
Таким образом, фактический порядок загрузки может оставаться случайным, но порядок выполнения будет определяться установленным приоритетом.
Яаков.
