почему плагины загружаются перед pluggable-функциями
Я получил это изображение из одной электронной книги по разработке плагинов для WP. Не могли бы вы объяснить, почему Плагины загружаются перед Pluggable-функциями.

Прямо из исходного кода файла pluggable.php
:
<?php
/**
* Эти функции могут быть заменены через плагины. Если плагины не переопределяют эти
* функции, тогда будут использованы эти.
*
* @package WordPress
*/
?>
Итак, вот ваш ответ — функции в pluggable.php
предназначены для переопределения плагинами.
По поводу порядка загрузки:
Смотрите эту публикацию Константина Ковшенина. Ключевые моменты (10-15):
wp_get_active_and_valid_plugins()
получает список всех активных файлов плагинов для загрузки и включает их. На этом этапе выполняется код вашего плагина, определяются функции, классы и т.д.- Подключаются
wp-includes/wp-pluggable.php
иwp-includes/wp-pluggable-deprecated.php
, которые содержат функции (и устаревшие функции), которые могут быть переопределены плагинами. Например,wp_mail()
для более продвинутой отправки почты,wp_authenticate()
для альтернативных методов аутентификации и т.д.- Вызывается
wp_set_internal_encoding()
для установки внутренней кодировки согласно опции blog_charset.- Вызывается
wp_cache_postload()
, если включено кэширование объектов.- На этом этапе срабатывает действие
plugins_loaded
. Это самое первое действие (после muplugins_loaded, которое срабатывает до загрузки плагинов WordPress, не относящихся к мультисайту), к которому можно подключиться. Оно происходит до init, так как WordPress ещё не инициализирован полностью.
Итак, упрощённо:
- Загружаются плагины
- Загружается
pluggable.php
- Срабатывает действие
plugins_loaded
Что соответствует ожидаемому порядку.
(Примечание: всё это происходит в wp-settings.php
.)

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

Порядок загрузки соответствует ожиданиям. Смотрите обновленный ответ.

Каждое определение функции в pluggables
предваряется проверкой if(!function_exists('{имя функции}') {
. WordPress проверяет, не определили ли вы вручную любую из этих функций в своих плагинах до того, как определить их самостоятельно.

@EAMann Спасибо, EAMann, теперь мне полностью понятен мой вопрос. Например, если плагин определяет функцию wp_set_current_user
, то в pluggable.php, wp_set_current_user
не будет определена, так как стоит условие if ( !function_exists('wp_set_current_user') ) :
, я правильно понимаю?

Не используйте подключаемые функции!
Пожалуйста, обратите внимание, что вы никогда не можете быть уверены, что последующий плагин не переопределит вашу подключаемую функцию! Я писал об этом в рассылке wp-hackers некоторое время назад.
Также есть другая тема на wp-hackers, где обсуждается, что резервный механизм не реализован. Пожалуйста, ознакомьтесь также с соответствующим тикетом в Trac.
