почему плагины загружаются перед pluggable-функциями

17 янв. 2012 г., 18:24:46
Просмотры: 1.42K
Голосов: 4

Схема вызова URL в WordPress

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

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

Пожалуйста, обратите внимание на лицензию. Весь контент здесь распространяется под лицензией GNU GPL. Если изображение не подпадает под эту лицензию, пожалуйста, удалите его и замените собственным. В противном случае небеса могут обрушиться вам на голову.

kaiser kaiser
17 янв. 2012 г. 20:15:51
Все ответы на вопрос 2
5

Прямо из исходного кода файла pluggable.php:

<?php
/**
 * Эти функции могут быть заменены через плагины. Если плагины не переопределяют эти
 * функции, тогда будут использованы эти.
 *
 * @package WordPress
 */
?>

Итак, вот ваш ответ — функции в pluggable.php предназначены для переопределения плагинами.

По поводу порядка загрузки:

Смотрите эту публикацию Константина Ковшенина. Ключевые моменты (10-15):

  1. wp_get_active_and_valid_plugins() получает список всех активных файлов плагинов для загрузки и включает их. На этом этапе выполняется код вашего плагина, определяются функции, классы и т.д.
  2. Подключаются wp-includes/wp-pluggable.php и wp-includes/wp-pluggable-deprecated.php, которые содержат функции (и устаревшие функции), которые могут быть переопределены плагинами. Например, wp_mail() для более продвинутой отправки почты, wp_authenticate() для альтернативных методов аутентификации и т.д.
  3. Вызывается wp_set_internal_encoding() для установки внутренней кодировки согласно опции blog_charset.
  4. Вызывается wp_cache_postload(), если включено кэширование объектов.
  5. На этом этапе срабатывает действие plugins_loaded. Это самое первое действие (после muplugins_loaded, которое срабатывает до загрузки плагинов WordPress, не относящихся к мультисайту), к которому можно подключиться. Оно происходит до init, так как WordPress ещё не инициализирован полностью.

Итак, упрощённо:

  1. Загружаются плагины
  2. Загружается pluggable.php
  3. Срабатывает действие plugins_loaded

Что соответствует ожидаемому порядку.

(Примечание: всё это происходит в wp-settings.php.)

17 янв. 2012 г. 18:40:19
Комментарии

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

A.C.Balaji A.C.Balaji
17 янв. 2012 г. 18:48:08

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

Chip Bennett Chip Bennett
17 янв. 2012 г. 19:12:40

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

EAMann EAMann
17 янв. 2012 г. 19:32:37

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

A.C.Balaji A.C.Balaji
17 янв. 2012 г. 19:48:12

Вы правы. Если вы определяете функцию в своем собственном плагине, WordPress будет использовать вашу версию вместо версии из pluggables.php.

EAMann EAMann
17 янв. 2012 г. 20:29:56
0

Не используйте подключаемые функции!

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

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

17 янв. 2012 г. 20:21:18