Które jest ładowane jako pierwsze między functions.php, widżetami i wtyczkami?

78

Klient pyta, czy konkretna wtyczka karuzelowa, której używa, może zostać widgetizowana. Oznacza to, że powinienem utworzyć widget wewnątrz functions.php, który wywołuje funkcję wtyczki. Oznacza to, że kod wtyczki musi zostać załadowany jako pierwszy, aby funkcja była dostępna dla WordPress po załadowaniu pliku functions.php, prawda? Czy to zadziała?

pixeline
źródło

Odpowiedzi:

185

Wtyczki są ładowane tuż przed kompozycją (tak, szukałem pretekstu do użycia tego):

wprowadź opis zdjęcia tutaj

Jednak błędem jest myślenie o jednym z punktów wykonania kodu. W większości przypadków wszystko należy initzaczepić i wykonać nie wcześniej niż zaczepienie. Według Codexu rejestracja widżetu register_widget()powinna być uzależniona widget_init.

Ponieważ kolejność ładowania nie ma znaczenia w tym przypadku, będziesz mieć wszystko ładowane przez widżet czasu, który tego potrzebuje.

Rarst
źródło
3
Obciążenie rdzenia WP nigdy nie będzie miało sensu.
gagarine
7
Czy jest szansa, że ​​uda nam się uzyskać zaktualizowany wykres w 2016 roku? ;-)
jgraup
9
@jgraup mówisz, że jak rzeczy zmieniają się w rdzeniu WordPress ... :)
Rarst
1
@Rarst, touché ;-)
jgraup
2
@IsaacLubow tak, rzeczy w więcej niż jednej kolumnie działają dla tych odpowiednich kontekstów, ponieważ widać, że ta sama znacząca część obciążenia podstawowego jest zawsze zaangażowana w każde żądanie.
Rarst
16

Ciekawym podejściem byłoby wylistowanie wszystkich haków do pliku w sekwencji wykonania.

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);

}

Otrzymasz wynik w ten sposób:

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
...
many many more action hooks
...
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

Uwaga: pełna lista po prostu nie mogła zmieścić się w limicie 30 000 znaków na post WPSO, więc usunąłem wiele haczyków akcji.

Umieść powyższy kod we wtyczce. Jeśli zrobisz to z motywów functions.php, nie złapiesz plugins_loaded. Kolejny dowód, że wtyczki są ładowane przed motywem.

Możliwości tego sprawdzenia jest wiele, ale pamiętaj, że wyniki będą różne dla różnych szablonów stron, do których zadzwonisz, lub jeśli jesteś na pulpicie nawigacyjnym.

Po prostu nazwałem to ze strony /?p=1Hello World.

Jeśli nie masz aktywowanej żadnej wtyczki, możesz umieścić ten kod w mu-pluginsfolderze.

Być może lepiej jest użyć WP FS API , ale ten sposób jest naprawdę zwięzły.

prosti
źródło
Wtyczki wp-admin są ładowane po motywie lub w kolejności instalacji ... a wtyczki front-end są ładowane przed motywem ...
Vishal Kumar Sahu
3

Możesz mieć widget wewnątrz pliku .php wtyczki (i mieć wspólną zmienną globalną, z której mogą korzystać obydwoje), jeśli o to pytasz. Oto samouczek z przykładowym kodem, na który natknąłem się jakiś czas temu.

Oto lista działań uruchamianych podczas typowego żądania , w kolejności wykonywania. # 2 i # 10 sugerują, że wtyczki ładują się najpierw; nie jestem pewien co do funkcji.php.

montrealist
źródło
1
Prawidłowo, wtyczki są ładowane przed plikami motywów. Jeśli wtyczka zawiera kod, ale nie widżet, którego chcesz, możesz zdefiniować widżet w pliku functions.php motywu.
goldenapples