Funzionalità condivisa in plugin e temi


8

Di recente ho iniziato a sviluppare plugin e temi e ho scoperto che ho bisogno di utilizzare diverse funzioni di entrambi.

A volte penso di verificare se la funzione / classe esiste prima dichiarata come detto in questo post: Quando verificare se esiste una funzione

Ma questa è considerata una cattiva pratica. Quali sono le migliori pratiche per prevenire i conflitti e far funzionare i temi e i plugin in modo indipendente senza un tema / plugin installato?

Risposte:


12

Azioni e filtri

Il modo migliore imho è usare un'azione per inserire le funzioni del plugin nei temi.

Esempio 1

Ecco un piccolo plugin per testarlo.

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

All'interno del tema:

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

Cosa succede adesso / The kool kid

In questo modo non dobbiamo controllare l'esistenza di una funzione, un file, una classe, un metodo o forse persino un (non farlo!) Globale $variable. Il WP intern global lo prende già per noi: controlla se il nome hook è il filtro corrente e lo collega. Se non esiste, non succede nulla.

Esempio n. 2

Con il nostro prossimo plug-in, allegheremo una funzione di callback che accetta un argomento.

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

All'interno del tema:

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

Questa volta, offriamo all'utente / sviluppatore la possibilità di aggiungere un argomento. Può o echo/printl'output o persino elaborarlo ulteriormente (nel caso in cui tu abbia un array in cambio).

Esempio n. 3

Con il terzo plug-in, alleghiamo una funzione di callback che accetta due argomenti.

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

All'interno del 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} ";
}

Questo plugin ora ci consente di inserire due argomenti. Possiamo salvarlo in un $variableulteriore processo.

Conclusione

Con l'utilizzo di filtri e azioni si ottengono prestazioni migliori evitando controlli non necessari (confrontare la velocità function_*/class_*/method_*/file_existso la ricerca di un globale con in_array()ricerche di filtro per ~ 1k (?)). Eviti anche di avere tutte quelle Notifiche non necessarie per non impostare variabili, ecc., Poiché il plugin si preoccupa di questo.


2
Ottima conoscenza di un argomento di buone pratiche!
Adam,

1
Grazie Kaiser, vieni con le migliori pratiche possibili per questo problema. grazie ancora!
Jeg Bagus,

tra l'altro, dobbiamo dare un nome diverso per la stessa funzionalità condivisa tra plugin e temi giusto?
Jeg Bagus,

diciamo che ho una funzione che chiamo jlog che eseguirà il wrapping semplice prima della variabile e stamperà il contenuto di quella variabile. aggiungo la funzione jlog su temi e plugin, come posso evitare qualsiasi conflitto?
Jeg Bagus,

1
@JegBagus Sei un uomo molto confuso :) Aggiorna la tua domanda con le esatte funzioni e spiega cosa stanno facendo e dove dovrebbero fare qualcosa. E per favore ripulisci i tuoi commenti qui. Grazie.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.