web-dev-qa-db-fra.com

Comment limiter les actions et les filtres "correctement" en fonction des conditions

Laquelle est correcte lors de l'ajout d'actions/filtres/etc ... Les deux méthodes fonctionnent bien et j'ai vu des personnes faire les choses dans les deux sens, mais je suppose qu'une est correcte Mon instinct me dit que la déclaration if autour de l'action est meilleure, mais je ne suis pas sûr ...

Méthode A: Habillage if autour de add_action:

function unregister_default_wp_widgets() {
    unregister_widget('WP_Widget_Pages');
    unregister_widget('WP_Widget_Calendar');
    unregister_widget('WP_Widget_Archives');
    unregister_widget('WP_Widget_Links');
    unregister_widget('WP_Widget_Meta');
    unregister_widget('WP_Widget_Search');
    unregister_widget('WP_Widget_Text');
    unregister_widget('WP_Widget_Categories');
    unregister_widget('WP_Widget_Recent_Posts');
    unregister_widget('WP_Widget_Recent_Comments');
    unregister_widget('WP_Widget_RSS');
    unregister_widget('WP_Widget_Tag_Cloud');
    unregister_widget('WP_Nav_Menu_Widget');
}

if( !current_user_can('administrator') ) {
    add_action('widgets_init', 'unregister_default_wp_widgets', 1);
}

---- OR -----

Méthode B: Enrouler if autour de la définition de fonction et du add_action:

if( !current_user_can('administrator') ) {

    function unregister_default_wp_widgets() {
        unregister_widget('WP_Widget_Pages');
        unregister_widget('WP_Widget_Calendar');
        unregister_widget('WP_Widget_Archives');
        unregister_widget('WP_Widget_Links');
        unregister_widget('WP_Widget_Meta');
        unregister_widget('WP_Widget_Search');
        unregister_widget('WP_Widget_Text');
        unregister_widget('WP_Widget_Categories');
        unregister_widget('WP_Widget_Recent_Posts');
        unregister_widget('WP_Widget_Recent_Comments');
        unregister_widget('WP_Widget_RSS');
        unregister_widget('WP_Widget_Tag_Cloud');
        unregister_widget('WP_Nav_Menu_Widget');
    }

    add_action('widgets_init', 'unregister_default_wp_widgets', 1);
}
4
Bryan Willis

Il n'y a pas de réelle différence entre les deux méthodes.
Lors de l’utilisation de la méthode A, seul le raccord est lié à la condition (c’est-à-dire que la fonction est définie quoi qu’il en soit), méthode B la ( définition de la fonction ainsi que le accroissement est.

Une autre chose est la méthode suivante (que vous n’avez pas incluse):

function my_hooked_function() {
    if (! current_user_can('administrator')) {
        $some_var = 'some value';
        some_function($some_var);
    }
} // function my_hooked_function

add_action('widgets_init', 'my_hooked_function');

Étant donné que la condition complète peut déjà être évaluée en dehors de la fonction (c'est-à-dire directement dans votre fichier functions.php), la méthode A/B doit être préférée. Sinon, vous accrocheriez votre fonction à chaque fois et pour tous les utilisateurs , tandis que il est utilisé uniquement par les administrateurs.

Il existe cependant des conditions qui ne peuvent pas être placées (c'est-à-dire évaluées) en dehors de la fonction accrochée, car une variable et/ou un objet utilisé dans la situation n'est pas encore défini/accessible. Dans un tel cas, vous devez mettre la condition à l'intérieur de la fonction (comme indiqué dans cette réponse).

Un exemple:

// NOT working
if (is_front_page())
    add_action('shutdown', function() { echo 'Front'; });

// WORKING
add_action('shutdown', function() { if (is_front_page()) echo 'Front'; });
5
tfrommen

Voici un autre moyen.

function unregister_default_wp_widgets() {
if( !current_user_can('update_core') ) {
    unregister_widget('WP_Widget_Pages');
    unregister_widget('WP_Widget_Calendar');
    unregister_widget('WP_Widget_Archives');
    unregister_widget('WP_Widget_Links');
    unregister_widget('WP_Widget_Meta');
    unregister_widget('WP_Widget_Search');
    unregister_widget('WP_Widget_Text');
    unregister_widget('WP_Widget_Categories');
    unregister_widget('WP_Widget_Recent_Posts');
    unregister_widget('WP_Widget_Recent_Comments');
    unregister_widget('WP_Widget_RSS');
    unregister_widget('WP_Widget_Tag_Cloud');
    unregister_widget('WP_Nav_Menu_Widget');
    }
}
add_action('widgets_init', 'unregister_default_wp_widgets', 1);
3
Brad Dalton

Désolé pour la réponse tardive, mais rien de tout cela n’avait vraiment de sens jusqu’à ce que j’ai rencontré une situation aujourd’hui.

J'ai fini par ajouter la fonction suivante dans le répertoire mu-plugin, qui redirigerait les non-administrateurs vers le tableau de bord lors de la frappe accidentelle de certaines pages auxquelles ils n'étaient pas supposés être.

function wp_admin_pages_redirect_to() {
  global $pagenow;
  $admin_pages = array(
                            'themes.php',
                            'edit-tags.php?taxonomy=post_tag',
                            'options-general.php',
                    );
  if(in_array($pagenow, $admin_pages)) {
    wp_redirect( admin_url('/') ); exit;
  }
}

if( !current_user_can('administrator') ) {
add_action('admin_init', 'wp_admin_pages_redirect_to');
}

Cependant, cela me donnerait l'écran blanc de la mort. Donc, après avoir lu les commentaires de @Rilwis, j’ai essayé ce qui suit et cela a bien fonctionné.

function wp_admin_pages_redirect_to() {
if( !current_user_can('administrator') ) {
  global $pagenow;
  $admin_pages = array(
                            'themes.php',
                            'edit-tags.php?taxonomy=post_tag',
                            'options-general.php',
                    );
  if(in_array($pagenow, $admin_pages)) {
    wp_redirect( admin_url('/') ); exit;
  }
}
}
add_action('admin_init', 'wp_admin_pages_redirect_to');

Quoi qu'il en soit, la lecture du commentaire de @Rilwis sur la suggestion de Brad m'a enfin permis de comprendre (en quelque sorte) ce dont @tf parlait et comment certaines conditions ne peuvent pas être évaluées en dehors de la fonction. J'espère que c'est ce dont il parlait.

1
Bryan Willis