web-dev-qa-db-fra.com

Fonctionnalité partagée dans les plugins et les thèmes

J'ai récemment commencé à développer des plugins et des thèmes et j'ai constaté que je devais utiliser plusieurs fonctions des deux.

Parfois, je pense à vérifier si la fonction/la classe existe avant d’être déclarée comme indiqué sur ce message: Quand vérifier si une fonction existe

Mais cela est considéré comme une mauvaise pratique. Quelle est la meilleure pratique pour éviter les conflits et conserver le fonctionnement indépendant des thèmes et des plugins sans qu'un seul thème/plugin soit installé?

8
Jeg Bagus

Actions et filtres

Le meilleur moyen à l’imho est d’utiliser une action pour intégrer des fonctions de plug-in dans des thèmes.

Exemple 1

Voici un petit plugin pour tester cela.

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

Dans le thème:

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

Qu'est-ce qui se passe maintenant/le kool kid

De cette façon, nous n'avons pas à vérifier l'existence d'une fonction, d'un fichier, d'une classe, d'une méthode ou même d'un $variable global (ne le faites pas!). Le WP intern global prend déjà cela pour nous: il vérifie si le nom du hook est le filtre actuel et le joint. Si ça n'existe pas, rien ne se passe.

Exemple n ° 2

Avec notre prochain plugin, nous attachons une fonction de rappel qui prend un argument.

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

Dans le thème:

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

Cette fois, nous offrons à l'utilisateur/développeur la possibilité d'ajouter un argument. Il peut soit echo/print la sortie, soit même la traiter ultérieurement (au cas où vous auriez un tableau en retour).

Exemple n ° 3

Avec le troisième plugin, nous attachons une fonction de rappel qui prend deux arguments.

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

Dans le thème:

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

Ce plugin nous permet maintenant d'insérer deux arguments. Nous pouvons l'enregistrer dans un $variable et le traiter ultérieurement.

Conclusion

En utilisant des filtres et des actions, vous améliorez les performances en évitant les vérifications inutiles (comparez la vitesse de function_*/class_*/method_*/file_exists ou la recherche d'un filtre global avec in_array() pour des recherches de filtre de ~ 1k (?)). Vous évitez également d'avoir tous ces avis inutiles pour ne pas définir de variables, etc., car le plugin s'en préoccupe.

12
kaiser