Как ограничить действия и фильтры «правильно» условиями

Какой из них правилен при добавлении действий / фильтров / etc …. Оба метода работают нормально, и я видел, как люди делают что-то в обоих направлениях, но я предполагаю, что один из них правильный. Моя кишка говорит мне, что обернуть утверждение if вокруг действия только лучше, но я не уверен …

Метод A: Обертка, if вокруг 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); } 

—- ИЛИ —–

Метод B: Обертка, if вокруг определения функции и 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 "Как ограничить действия и фильтры «правильно» условиями"

Между этими двумя методами нет реальной разницы.
При использовании метода A только привязка привязана к условию (т. Е. Функция определяется независимо от того, что), а в методе B – определение функции, а также привязка .

Другое дело – следующий метод (который вы не включили):

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

Поскольку полное условие уже может быть оценено вне функции (т. Е. Непосредственно в файле functions.php ), следует предпочесть метод A / B. В противном случае вы будете подключать свою функцию каждый раз и для всех пользователей, в то время как она используется только администраторами.

Однако существуют условия, которые нельзя поставить (т. Е. Оценивать) за пределы зацепившейся функции, поскольку некоторая переменная и / или объект, который используется в condtion, еще не определены / доступны. В таком случае вам нужно поставить условие внутри функции (как показано в этом ответе).

Пример:

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

Вот еще один способ.

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

Извините за поздний ответ, но ничто из этого не имело для меня смысла, пока я не столкнулся с ситуацией сегодня.

Я закончил тем, что добавил следующую функцию в каталог mu-plugin, который перенаправлял бы не админы на панель инструментов, когда случайно попадал на определенные страницы, на которые они не могли быть.

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

Однако это даст мне белый экран смерти. Поэтому, прочитав комментарий @Rilwis, я попробовал следующее, и он отлично работал.

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

Во всяком случае, чтение комментария @Rilwis к предложению Брэдса заставило меня наконец (вроде) понять, о чем говорил @tf, и о том, как определенные условия не могут быть оценены вне функции. Я надеюсь, что это то, о чем он говорил.