web-dev-qa-db-fra.com

Imbrication de fonctions dans des fonctions

Je cherche un moyen efficace de regrouper une série de fonctions distinctes mais liées pour un thème enfant que je conçois à l'aide du cadre de thème thématique . Thematic fournit d'excellents crochets d'action et filtres pour le développement de thèmes pour enfants, que j'essaie d'utiliser correctement. J'apporte beaucoup de modifications à la page d'accueil, j'ai donc créé une série de fonctions qui modifient des zones de contenu spécifiques, mais je souhaite uniquement exécuter ces fonctions sur la page d'index de mon site. Auparavant, mon fichier functions.php ressemblait beaucoup à ceci:

<?php
     function home_function_a() {
          if ( is_front_page() ) {
               //Something Near the top of the Home Page
          }
     }
     add_action('thematic_belowheader', 'home_function_a');

     function home_function_b() {
          if ( is_front_page() ) {
               //Something in in the sidebar
          }
     }
     add_filter('thematic_sidebar', 'home_function_b');        

     function home_function_c() {
          if ( is_front_page() ) {
               //Something near the bottom of the page
          }
     }
     add_action('thematic_abovecomments', 'home_function_c');

     // etc, etc, etc

 ?>

La technique ci-dessus fonctionne mais me semble quelque peu inefficace. Je pensais que ce serait bien d'utiliser une approche de fonction imbriquée comme indiqué ci-dessous:

<?php
    function everything_on_the_home_page() {
         if ( is_front_page() ) {

              function home_function_a() {
                   //Something near the top of the Home Page
              }
              add_action('thematic_belowheader', 'home_function_a');

              function home_function_b() {
                   //Something in the sidebar of the Home Page
              }
              add_filter('thematic_sidebar', 'home_function_b');

              function home_function_c() {
                   //Something near the bottom of the Home Page
              }
              add_action('thematic_abovecomments', 'home_function_c');

              // etc, etc, etc              
         }
    }
    add_action('thematic_aboveheader', 'everything_on_the_home_page'); 
 ?>

Ce code semble un peu plus joli et semble fonctionner correctement, mais je voulais vérifier pour vérifier que cette technique est recommandée et kasher. J'ai essayé quelques recherches sur Google pour des articles/messages de forum sur cette approche, mais je n'ai rien trouvé d'utile. Faites-moi savoir si vous pensez que mon arbre de fonctions imbriqué est un bon moyen de résoudre mes problèmes ou si vous avez d'autres suggestions.

Merci pour votre temps! Meilleur, Jonathan

2
jfudem

Cela pourrait paraître plus élégant, mais vous ne voulez pas imbriquer les crochets de cette façon. Vous vous retrouvez maintenant avec des actions ajoutées dans une vérification de logique dans un autre crochet d'action.

Au lieu de cela, gardez vos fonctions aussi granulaires et atomiques que possible et n'accrochez-les que si nécessaire. Votre première technique n'est pas du tout inefficace, c'est la façon dont vous devriez faire les choses.

L’une des conséquences majeures des changements est l’ordre des opérations.

Dans votre premier exemple:

Lorsque vous activez le hook themeatic_sidebar, appelez la fonction home_function_b(). Dans la fonction, vérifiez que vous êtes bien sur la une avant de faire quelque chose.

Dans votre deuxième exemple

Lorsque vous activez le crochet thematic_above_header, vérifiez si vous êtes sur la première page. Ensuite, attendez le hook thematic_sidebar. Ensuite, appelez la fonction home_function_b().

La logique entre chaque exemple est très différente. Disons que home_function_b() doit faire une chose si is_front_page() est vraie et quelque chose d'autre si c'est faux ... votre deuxième exemple ne le permettrait pas du tout.

4
EAMann