Gemeinsame Funktionalität in Plugins und Themes

8

Ich habe kürzlich angefangen, Plugins und Themes zu entwickeln, und festgestellt, dass ich für beide mehrere Funktionen verwenden muss.

Manchmal denke ich darüber nach, zu überprüfen, ob eine Funktion / Klasse vorhanden ist, bevor sie wie in diesem Beitrag angegeben deklariert wurde: Wann soll überprüft werden, ob eine Funktion vorhanden ist?

Aber das wird als schlechte Praxis angesehen. Was ist die beste Vorgehensweise, um Konflikte zu vermeiden und Themen und Plugins unabhängig voneinander zu betreiben, ohne dass ein Thema / Plugin installiert ist?

Jeg Bagus
quelle

Antworten:

12

Aktionen & Filter

Der imho beste Weg ist , um eine Aktion zu bringen Plugin - Funktionen in Themen zu verwenden.

Beispiel 1

Hier ist ein kleines Plugin, um dies zu testen.

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

Innerhalb des Themas:

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

Was jetzt passiert / Das koole Kind

Auf diese Weise müssen wir nicht die Existenz einer Funktion, einer Datei, einer Klasse, einer Methode oder vielleicht sogar eines (mach das nicht!) Globalen überprüfen $variable. Der WP intern global übernimmt dies bereits für uns: Er prüft, ob der Hook-Name der aktuelle Filter ist und hängt ihn an. Wenn es nicht existiert, passiert nichts.

Beispiel 2

Mit unserem nächsten Plugin fügen wir eine Rückruffunktion hinzu, die ein Argument akzeptiert.

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

Innerhalb des Themas:

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

Dieses Mal bieten wir dem Benutzer / Entwickler die Möglichkeit, ein Argument hinzuzufügen. Er kann entweder echo/printdie Ausgabe oder sogar weiter verarbeiten (falls Sie ein Array dafür erhalten).

Beispiel 3

Mit dem dritten Plugin fügen wir eine Rückruffunktion hinzu, die zwei Argumente akzeptiert.

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

Innerhalb des Themas:

<?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} ";
}

Mit diesem Plugin können wir jetzt zwei Argumente einfügen. Wir können es in einem speichern $variableund weiterverarbeiten.

Fazit

Durch die Verwendung von Filtern und Aktionen erzielen Sie eine bessere Leistung, indem Sie unnötige Überprüfungen vermeiden (vergleichen Sie die Geschwindigkeit function_*/class_*/method_*/file_existsoder die Suche nach einem globalen in_array()Filter mit ~ 1k (?) Filtersuchen). Sie vermeiden auch all diese unnötigen Hinweise für nicht gesetzte Variablen usw., da sich das Plugin darum kümmert.

Kaiser
quelle
2
Großartiger Einblick in ein Best-Practice-Thema!
Adam
1
Vielen Dank, Kaiser, Sie kommen mit der bestmöglichen Best Practice für diese Probleme. Danke noch einmal!
Jeg Bagus
Übrigens müssen wir für dieselbe Funktionalität, die zwischen Plugin und Themes geteilt wird, einen anderen Namen geben, oder?
Jeg Bagus
Nehmen wir an, ich habe eine Funktion, die ich jlog aufrufe und die vor der Variablen einfach umschließt und den Inhalt dieser Variablen druckt. Ich füge eine Jlog-Funktion für Themen und Plugins hinzu. Wie kann ich Konflikte verhindern?
Jeg Bagus
1
@JegBagus Du bist ein sehr verwirrter Mann :) Bitte aktualisiere deine Frage mit den genauen Funktionen und erkläre, was sie tun und wo sie etwas tun sollten. Und bitte bereinigen Sie Ihre Kommentare hier. Vielen Dank.
Kaiser