如何按条件“适当”地限制操作和过滤

时间:2014-02-03 作者:Bryan Willis

添加操作/过滤器等时,哪一个是正确的。。。。这两种方法都很好,我看到人们都是这样做的,但我认为其中一种方法是正确的。我的直觉告诉我,将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);
}

3 个回复
最合适的回答,由SO网友:tfrommen 整理而成

这两种方法之间没有真正的区别
使用方法A时,只有hooking 绑定到条件(即,无论什么情况都定义函数),而在方法B中definition 以及hooking

另一件事是以下方法(您没有包括):

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。否则,您将挂接函数every 时间和时间all 用户,而它仅由管理员使用。

然而,由于条件中使用的某些变量和/或对象尚未定义/可访问,因此存在无法置于挂钩函数之外(即,计算)的条件。在这种情况下,必须将条件放入函数中(如此答案所示)。

An example:

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

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

SO网友:Brad Dalton

还有另一种方法。

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

SO网友:Bryan Willis

很抱歉反应太晚,但直到今天我遇到了一个情况,我才真正明白这一切。

最后,我在mu插件目录中添加了以下功能,当非管理员意外点击某些他们不应该在的页面时,该功能会将非管理员重定向到仪表板。

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对Brads建议的评论,我终于(有点)意识到了@t f所说的是什么,以及某些条件是如何在函数之外无法评估的。我希望这就是他所说的。

结束

相关推荐

Shotcode error on functions

您好,我有一个生成错误的短代码。有人能帮忙吗?add_shortcode(\'do-action\', \'do_action_shortcode\'); function do_action_shortcode($atts, $content = \'\') {   ob_start();   do_action($content);   $out = ob_get_contents();   ob_end_clean();   return $