Что загружается первым: functions.php (тема), виджеты или плагины?
Клиент спрашивает, можно ли сделать виджет из определенного плагина карусели. Это означает, что я должен создать виджет внутри functions.php, который будет вызывать функцию плагина. Следовательно, код плагина должен загрузиться первым, чтобы функция была доступна для WordPress при загрузке файла functions.php, верно? Будет ли это работать?

Плагины загружаются непосредственно перед темой (да, я искал повод использовать это):
Однако ошибочно рассматривать любое из них как точку выполнения кода. В большинстве случаев весь код должен быть подключен через хуки и выполняться не раньше хука init
. Согласно Кодексу, регистрация виджета с помощью register_widget()
должна быть привязана к хуку widget_init
.
Поэтому порядок загрузки в данном случае не имеет значения - к моменту, когда виджету потребуются ресурсы, всё уже будет загружено в любом случае.

@jgraup ты говоришь так, будто что-то меняется в ядре WordPress... :)

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

Один из интересных подходов — это запись всех хуков в файл в порядке их выполнения.
add_action( 'all', '_20161224_printer' );
function _20161224_printer( $r ){
$line = microtime(true)*10000 . ' ' . $r . "\n";
$fp = fopen( ABSPATH . 'hooks.txt', 'a+');
fwrite($fp, $line);
fclose($fp);
}
И вы получите вывод примерно такого вида:
14825992300742 pre_option_blog_charset
14825992300743 option_blog_charset
14825992300743 plugins_loaded
14825992300744 load_default_widgets
14825992300745 load_default_embeds
14825992300745 wp_audio_extensions
14825992300745 wp_audio_embed_handler
14825992300746 wp_video_extensions
14825992300746 wp_video_embed_handler
14825992300746 sanitize_comment_cookies
14825992300747 pre_option_permalink_structure
14825992300747 option_permalink_structure
14825992300748 pre_option_wp_user_roles
14825992300748 option_wp_user_roles
14825992300749 wp_roles_init
14825992300749 setup_theme
14825992300749 pre_option_template
14825992300750 option_template
14825992300750 template
14825992300750 theme_root
14825992300751 template_directory
14825992300751 pre_option_stylesheet
14825992300751 option_stylesheet
14825992300751 stylesheet
14825992300752 theme_root
14825992300752 stylesheet_directory
14825992300752 pre_option_WPLANG
14825992300753 query
14825992300754 default_option_WPLANG
14825992300755 locale
14825992300755 override_unload_textdomain
14825992300755 unload_textdomain
14825992300755 override_load_textdomain
14825992300756 load_textdomain
14825992300756 load_textdomain_mofile
14825992300756 locale
...
много-много других хуков
...
14825992302886 wp_parse_str
14825992302886 nonce_life
14825992302886 salt
14825992302886 wp_parse_str
14825992302887 esc_html
14825992302887 logout_url
14825992302887 clean_url
14825992302887 gettext
14825992302887 wp_after_admin_bar_render
14825992302888 pre_option_template
14825992302888 option_template
14825992302888 template
14825992302888 theme_root
14825992302888 template_directory
14825992302889 parent_theme_file_path
14825992302889 shutdown
Обратите внимание, что полный список просто не влез бы в ограничение WPSO в 30 000 символов на пост, поэтому я удалил множество хуков.
Поместите этот код в плагин. Если вы добавите его в
functions.php
темы, то не сможете перехватить хукplugins_loaded
. Ещё одно доказательство того, что плагины загружаются раньше темы.
Такой подход может быть полезен во многих случаях, но учтите, что вывод будет различаться в зависимости от вызываемого шаблона страницы или при работе в админ-панели.
Я просто вызвал его на странице /?p=1
(Hello World).
Если у вас не активировано ни одного плагина, можно поместить этот код в папку mu-plugins
.
Возможно, лучше использовать WP FS API, но этот способ действительно лаконичен.

Вы можете разместить виджет внутри .php файла плагина (и использовать общую глобальную переменную, которую они оба смогут использовать), если это то, о чем вы спрашиваете. Вот учебник с примером кода, который я нашел некоторое время назад.
Также, вот список действий, выполняемых во время типичного запроса, в порядке их выполнения. Пункты #2 и #10 указывают, что плагины загружаются первыми; не уверен насчет functions.php.
