web-dev-qa-db-ja.com

条件によってアクションとフィルタを「適切に」制限する方法

どちらがアクション/フィルタなどを追加するときに正しいです。両方の方法はうまく働きます、そして、私は人々が両方の方法をするのを見ました、しかし、私は1つが正しいと思います。私の直感は、アクションの周りだけにif文をラップするほうが良いと私に言っていますが、私はよくわかりません...

方法A:ifadd_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 -----

方法B:関数定義とadd_actionの両方をifで囲む:

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

2つの方法の間に実質的な違いはありません。
メソッドAを使用する場合、フックのみが条件にバインドされます(つまり、関数は関係なく定義されます)。一方、メソッドBでは/が使用されます。definitionと同様にフッキングです。

もう1つの方法は、次の方法です(これには含まれていません)。

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をお勧めします。それ以外の場合は、管理者だけが使用している関数everytimeおよびallusersをフックします。

しかしながら、条件において利用される何らかの変数および/またはオブジェクトはまだ定義されていない/アクセス可能ではないので、フックされた関数の外側に置く(すなわち評価する)ことができない条件がある。そのような場合、あなたは(この答えに示すように)関数の中に条件を置かなければなりません。

例:

// 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

これは別の方法です。

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

返事が遅れて申し訳ありませんが、今日の状況に遭遇するまで、それは私にとって意味がありませんでした。

私は、誤って特定のページにアクセスしたときに、管理者以外をダッシュ​​ボードにリダイレクトする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');

とにかく、Bradsの提案についての@Rilwisのコメントを読むことで、ついに私は@ t fが何について話していたのか、そしてどのように特定の条件が関数の外で評価できないのか理解しました。私はこれが彼が話していたものであることを望みます。

1
Bryan Willis