Di antara functions.php, widget, dan plugin, mana yang dimuat lebih dulu?

77

Pelanggan bertanya apakah plugin korsel tertentu yang ia gunakan dapat dibuat widget. Itu berarti saya harus membuat widget di dalam functions.php yang memanggil fungsi plugin. Itu berarti bahwa kode plugin harus dimuat terlebih dahulu agar fungsinya tersedia untuk WordPress ketika file functions.php dimuat, kan? Apakah itu akan berhasil?

Pixeline
sumber

Jawaban:

184

Plugin dimuat tepat sebelum tema (ya, saya sudah mencari alasan untuk menggunakan ini):

masukkan deskripsi gambar di sini

Namun salah untuk menganggapnya sebagai titik eksekusi kode. Untuk kebanyakan kasus, semuanya harus terhubung dan dieksekusi tidak lebih awal dari inithook. Menurut Codex, pendaftaran widget register_widget()harus dikaitkan dengan widget_init.

Karena urutan beban itu tidak masalah untuk kasus ini, Anda akan memiliki semua yang dimuat oleh widget waktu yang membutuhkannya dalam hal apa pun.

Jarang
sumber
3
WP core load tidak akan pernah masuk akal.
gagarine
7
Apakah ada peluang kita mendapatkan grafik yang diperbarui pada tahun 2016? ;-)
jgraup
9
@ jgraup Anda mengatakan bahwa hal-hal seperti berubah di inti WordPress ... :)
Rarst
1
@ Pertama, sentuh ;-)
jgraup
2
@IsaacLubow ya, hal-hal di lebih dari satu kolom dijalankan untuk konteks masing-masing, karena Anda dapat melihat potongan signifikan yang sama dari beban inti selalu terlibat untuk setiap permintaan.
Jarang
16

Salah satu pendekatan yang menarik adalah dengan mendaftar semua kait ke file dalam urutan eksekusi.

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

}

Dan Anda akan mendapatkan output seperti ini:

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

Perhatikan bahwa daftar lengkap tidak dapat memenuhi batasan 30.000 karakter per posting WPSO, jadi saya menghapus banyak kait tindakan.

Masukkan kode di atas di dalam plugin. Jika Anda melakukannya dari tema functions.phpAnda tidak akan menangkap plugins_loaded. Satu lagi bukti plugin dimuat sebelum tema.

Barang yang mungkin dari pemeriksaan ini banyak, tetapi harap dicatat hasilnya akan berbeda untuk template halaman berbeda yang akan Anda panggil, atau jika Anda berada di dashboard.

Saya cukup memanggil ini dari /?p=1atau halaman Hello World.

Jika Anda tidak mengaktifkan satu plugin, Anda dapat memasukkan kode ini ke mu-pluginsfolder.

Mungkin lebih baik menggunakan WP FS API , tetapi cara ini benar-benar singkat.

prosti
sumber
Di dalam plugin wp-admin dimuat setelah tema atau dalam urutan instalasi ... dan di plugin front-end dimuat sebelum tema ...
Vishal Kumar Sahu
3

Anda dapat memiliki widget di dalam file .php plugin (dan memiliki variabel global bersama yang keduanya dapat gunakan), jika itu yang Anda tanyakan. Ini tutorial dengan kode sampel yang saya temukan beberapa waktu lalu.

Juga, berikut adalah daftar tindakan yang dijalankan selama permintaan biasa , sesuai urutan eksekusi. # 2 dan # 10 menyarankan agar plugin memuat lebih dulu; tidak yakin tentang functions.php.

montrealis
sumber
1
Benar, plugin dimuat sebelum file tema. Jika plugin menyertakan kode, tetapi bukan widget yang Anda inginkan, Anda dapat menentukan widget di functions.php tema Anda.
goldenapples