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


8

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 / classe existe avant de déclarer comme dit sur ce post: 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 faire en sorte que les thèmes et plugins fonctionnent indépendamment sans qu'un seul thème / plugin ne soit installé?

Réponses:


12

Actions et filtres

La meilleure façon à mon humble avis est d'utiliser une action pour intégrer des fonctions de plugin 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' );

À l'intérieur du thème:

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

Que se passe-t-il maintenant / The 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 peut-être même d'un (ne faites pas ça!) Global $variable. 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. S'il n'existe pas, rien ne se passe.

Exemple # 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' );

À l'intérieur du 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/printla sortie, soit même la traiter plus loin (au cas où vous auriez un tableau en retour).

Exemple # 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' );

À l'intérieur du 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 désormais d'insérer deux arguments. Nous pouvons l'enregistrer dans un $variableet le traiter ultérieurement.

Conclusion

En utilisant des filtres et des actions, vous donnez de meilleures performances en évitant les vérifications inutiles (comparez la vitesse function_*/class_*/method_*/file_existsou la recherche d'un global avec in_array()des recherches de filtre de ~ 1k (?)). Vous évitez également d'avoir tous ces avis inutiles pour les variables non définies, etc., car le plugin se soucie de cela.


2
Grand aperçu d'un sujet de meilleure pratique!
Adam

1
Merci kaiser, vous venez avec les meilleures pratiques possibles pour ces problèmes. Merci encore!
Jeg Bagus

btw, nous devons donner un nom différent pour la même fonctionnalité partagée entre le plugin et les thèmes non?
Jeg Bagus

disons que j'ai une fonction que j'appelle jlog qui fera un simple wrapping pré pour les variables et imprimera le contenu de ces variables. j'ajoute une fonction jlog sur les thèmes et plugin, comment puis-je éviter tout conflit?
Jeg Bagus

1
@JegBagus Vous êtes un homme très confus :) Veuillez mettre à jour votre question avec les fonctions exactes et expliquer ce qu'elles font et elles devraient faire quelque chose. Et veuillez nettoyer vos commentaires ici. Merci.
kaiser
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.