Bagaimana filter dan pengait benar-benar berfungsi di PHP

21

Bagaimana cara kerja filter dan kait di WordPress?

Saya bertanya tentang sesuatu yang maju. Bagaimana ini diterapkan dalam PHP? Misalnya bagaimana cara mengumpulkan semua kait dari plugin yang berbeda dan "melampirkan" mereka ke kait inti dll.

Aaron Lee
sumber
2
Sejauh yang saya tahu tidak ada 'kait' atau 'filter' di php, ada fungsi. Wordpress memiliki fungsi-fungsi khusus yang sebelum eksekusi mereka menggunakan panggilan balik dari fungsi-fungsi lainnya.
Ofir Baruch
3
@OfirBaruch, saya cukup yakin OP merujuk pada implementasi mereka di WordPress, dan tidak menyarankan ada beberapa implementasi PHP asli darinya.
Tom Auger

Jawaban:

33

Ikhtisar

Pada dasarnya " Plugin API ," yang memanggil Filter dan Hooks, terdiri dari fungsi-fungsi berikut:

  1. apply_filters()- jalankan
  2. do_action- jalankan
  3. apply_filters_ref_array()- jalankan
  4. do_action_ref_array()- jalankan
  5. add_filter()- tambahkan ke tumpukan
  6. add_action()- tambahkan ke tumpukan

Internal Internal

Secara keseluruhan sudah ada beberapa global (apa lagi di dunia WordPress) yang terlibat:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Yang pertama $wp_filteradalah global Arrayyang menyimpan semua nama filter sebagai subarrays. Masing-masing subarrays kemudian memegang lebih banyak subarrays yang dipanggil kembali dipanggil dalam array prioritas.

Singkat secara mendalam

Jadi ketika fungsi eksekusi dipanggil, WordPress mencari array global tersebut untuk kunci-kunci dengan nama itu. Kemudian callback terlampir dijalankan prioritas setelah prioritas. Satu-satunya hal yang terjadi di depan adalah panggilan balik yang melekat pada allfilter.

Saat Anda menambahkan panggilan balik menggunakan add_actionatau add_filter, maka WordPress terlebih dahulu menghitung ID "unik" untuk tidak menimpa panggilan balik yang sudah terlampir.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Kemudian ia menambahkan panggilan balik Anda ke global $wp_filtertumpukan:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Seperti yang Anda lihat, sub array utama adalah $tag(atau nama tindakan / filter), maka semuanya dipanggil dengan prioritas tertentu, dan kemudian string callback / ID "unik" digunakan sebagai kunci.

Kemudian, ketika filter dipanggil - terjadi dengan nama $tag/ action- / filter-name - array dicari dan callback dipanggil. Saat menggunakannya call_user_func_arraytidak terlalu penting berapa banyak argumen yang dilampirkan. WordPress menyelesaikannya dengan sendirinya.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
kaisar
sumber
3
jangan lupa bahwa ketika sedang melalui callback, ia memerintahkan eksekusi beberapa callback pada hook yang sama menggunakan "prioritas" mereka, yang ditetapkan (secara opsional) dengan add_action () dan apply_filters () dan default ke 10.
Tom Auger
1
@TomAuger Silakan menambahkan catatan dan suntingan tambahan untuk jawabannya.
kaiser
5

Kait disertakan dalam file inti WordPress dan beberapa file tema orang tua. Mereka memungkinkan Anda untuk menghubungkan konten di lokasi tertentu dalam file.

Contohnya adalah kait wp_head di WordPress. Anda dapat menggunakan pengait ini di tema anak Anda untuk menambahkan konten di lokasi itu '

Contoh:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Beberapa tema premium juga menyertakan kait tindakan yang dapat Anda gunakan dalam tema anak untuk melakukan hal yang sama. Berikut adalah peta visual yang mencakup semua kait tindakan dan posisi mereka menampilkan konten Anda dalam kerangka tema Genesis.

Contoh:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Inilah yang terlihat seperti kait jika Anda membuka file header.php dalam kerangka tema Genesis:

do_action( 'genesis_header' );

Berikut daftar kait WordPress yang dapat Anda gunakan dengan berbagai cara.

Filter memungkinkan Anda untuk memodifikasi output dari fungsi yang ada dan disertakan dalam file inti WordPress dan beberapa kerangka kerja tema induk seperti Genesis.

Berikut daftar filter yang dapat Anda gunakan dengan Genesis Design Framework

Berikut daftar filter yang disertakan di WordPress

Berikut adalah contoh bagaimana Anda dapat menggunakan filter dalam kerangka tema seperti Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Kode di atas dapat digunakan dalam tema anak untuk memodifikasi kata penulis teks dalam komentar Anda. Ini berfungsi dalam tema apa pun.

Berikut adalah contoh lain yang mengkustomisasi panjang kutipan menjadi 50 kata:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Anda akan menemukan fungsi the_excerpt () di file wp-include / post-template.php.

Begini tampilannya:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Anda juga dapat menggunakan kait dan filter dalam plugin untuk melakukan hal yang persis sama dan kode tidak akan hilang ketika Anda memperbarui tema induk atau WordPress.

Pada dasarnya, kait dan filter memungkinkan Anda untuk menyesuaikan dan memodifikasi WordPress dan tema induk Anda tanpa mengedit file inti WordPress atau file tema induk Anda.

Secara signifikan lebih mudah untuk menyesuaikan tema anak ketika kerangka tema induk menyertakan kait dan filter karena Anda tidak perlu mengedit file templat tema induk. Dengan cara ini Anda dapat dengan aman mengubah tema juga.

Brad Dalton
sumber
2
Ini adalah gambaran umum yang bagus tentang kait dan filter, tapi saya takut benar-benar melewatkan pertanyaan OP, yaitu tentang internal tentang cara kerja kait dan bagaimana WordPress membuat, menyimpan, dan memprosesnya. Jawaban bagus; Anda mungkin harus menautkan ke tutorial Anda di Situs WP.
Tom Auger
Baiklah saya akan menghapusnya. Buruk saya karena saya harus membaca pertanyaan lebih baik tetapi berpikir jawaban yang sudah diberikan akan lebih mudah bagi pemula untuk memahami jika mereka tahu dasar terlebih dahulu.
Brad Dalton
2
Brad, saya membatalkan penghapusan karena saya pikir mungkin berguna untuk memiliki info itu di sini juga. Jika Anda tidak setuju, cukup sebutkan / ping saya di sini dan saya akan menghapusnya lagi.
kaiser