Fungsionalitas bersama dalam plugin dan tema

8

Saya baru-baru ini mulai mengembangkan plugin dan tema dan saya menemukan bahwa saya perlu menggunakan beberapa fungsi pada keduanya.

Kadang saya berpikir untuk memeriksa apakah fungsi / kelas ada sebelum dideklarasikan seperti yang dikatakan pada posting ini: Kapan memeriksa apakah ada fungsi

Tapi itu dianggap sebagai praktik buruk. Apa praktik terbaik untuk mencegah konflik dan menjaga tema & plugin berfungsi secara independen tanpa satu tema / plugin diinstal?

Jeg Bagus
sumber

Jawaban:

12

Tindakan & Filter

Cara terbaik imho adalah menggunakan tindakan untuk membawa fungsi plugin ke dalam tema.

Contoh 1

Ini ada sedikit plugin untuk menguji ini.

<?php 
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
    echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );

Di dalam tema:

<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );

Apa yang sekarang terjadi / Anak kool

Dengan cara ini kita tidak perlu memeriksa keberadaan fungsi, file, kelas, metode, atau bahkan global (jangan lakukan ini!) $variable. WP intern global sudah mengambil ini untuk kita: Ini memeriksa apakah nama hook adalah filter saat ini dan melampirkannya. Jika tidak ada, tidak ada yang terjadi.

Contoh # 2

Dengan plugin kami berikutnya, kami melampirkan fungsi panggilan balik yang mengambil satu argumen.

<?php 
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
    return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );

Di dalam tema:

<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );

Kali ini, kami menawarkan pengguna / pengembang kemungkinan untuk menambahkan argumen. Dia bisa echo/printoutput, atau bahkan memprosesnya lebih lanjut (jika Anda mendapat array sebagai balasan).

Contoh # 3

Dengan plugin ketiga, kami melampirkan fungsi panggilan balik yang membutuhkan dua argumen.

<?php 
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
    return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );

Di dalam tema:

<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
     " "
    ,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
     // Highlight the $thing
     if ( strstr( 'World', $part ) 
     {
         echo "<mark>{$part} </mark>";
         continue;
     }
     echo "{$part} ";
}

Plugin ini sekarang memungkinkan kita untuk memasukkan dua argumen. Kita dapat menyimpannya ke dalam $variabledan memprosesnya lebih lanjut.

Kesimpulan

Dengan menggunakan filter dan tindakan, Anda memberikan kinerja yang lebih baik dengan menghindari pemeriksaan yang tidak perlu (bandingkan kecepatan function_*/class_*/method_*/file_existsatau pencarian global dengan in_array()pencarian filter ~ 1k (?)). Anda juga menghindari memiliki semua Pemberitahuan yang tidak perlu itu untuk tidak mengatur variabel, dll., Karena plugin peduli tentang ini.

kaisar
sumber
2
Wawasan hebat tentang topik praktik terbaik!
Adam
1
Terima kasih kaiser, Anda datang dengan praktik terbaik terbaik untuk masalah ini. Terima kasih lagi!
Jeg Bagus
btw, kita perlu memberikan nama berbeda untuk fungsi yang sama yang dibagikan di antara plugin & tema, kan?
Jeg Bagus
katakanlah saya memiliki fungsi saya sebut jlog yang akan melakukan pembungkus sederhana pra ke variabel dan mencetak konten dari variabel tersebut. saya menambahkan fungsi jlog pada tema dan plugin, bagaimana saya bisa mencegah konflik?
Jeg Bagus
1
@ JegBagus Anda adalah orang yang sangat bingung :) Perbarui pertanyaan Anda dengan fungsi yang tepat dan jelaskan apa yang mereka lakukan dan di mana mereka seharusnya melakukan sesuatu. Dan tolong bersihkan komentar Anda di sini. Terima kasih.
kaiser