Como restringir ações e filtros “adequadamente” por condições

Qual é correto ao adicionar ações / filtros / etc … Ambos os methods funcionam bem e eu vi as pessoas fazerem as duas coisas, mas eu suponho que uma esteja correta. Meu intestino me diz que envolver a afirmação if em torno da ação só é melhor, mas não tenho certeza …

Método A: Embalagem if torno 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); } 

—- OU —–

Método B: Envoltório if torno de definição de function e 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); } 

Solutions Collecting From Web of "Como restringir ações e filtros “adequadamente” por condições"

Não há diferença real entre os dois methods.
Ao usar o método A, apenas a conexão é vinculada à condição (isto é, a function é definida independentemente do que), enquanto que no método B a definição da function, bem como a conexão é.

Outra coisa é o seguinte método (que você não incluiu):

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

Uma vez que a condição completa já pode ser avaliada fora da function (ou seja, diretamente no arquivo functions.php ), o método A / B deve ser preferido. Caso contrário, você faria sua function de cada vez e para todos os usuários, enquanto ela é usada apenas pelos administradores.

Existem, no entanto, condições, que não podem ser colocadas (ou seja, avaliadas) fora da function ganhadora, uma vez que algumas variables ​​e / ou objects que são utilizados na seção ainda não estão definidos / acessíveis. Nesse caso, você deve colocar a condição dentro da function (como mostrado nesta resposta).

Um exemplo:

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

Aqui está outra maneira.

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

Desculpe pela resposta tardia, mas nada disso realmente fazia sentido ainda até encontrar uma situação hoje.

Acabei adicionando a seguinte function no diretório mu-plugin que redirectia não administradores para o painel quando acidentalmente atingindo certas páginas que não deveriam estar em.

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

No entanto, isso me daria a canvas branca da morte. Então, depois de ler o comentário @Rilwis, tentei o seguinte e funcionou bem.

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

De qualquer forma, a leitura do comentário @Rilwis sobre a sugestão de Brads me fez finalmente (tipo de) perceber o que o @tf estava falando e como certas condições não podem ser avaliadas fora da function. Espero que seja assim que ele estava falando.