web-dev-qa-db-ja.com

いくつかのナビゲーションメニューフィルタは何もしません

それで、私はプラグインを書き込もうとしていました、そして私は'nav_menu_link_attributes'フィルタを使う必要があります。フィルタを追加しようとしましたが、応答しませんでした。つまり、フィルタが呼び出されると、途中でプロセスが終了するようにしました。

 ... 
クラス定義内の#
 
パブリック関数__construct(){
 add_filter( 'wp_nav_menu_objects'、array($ this、 ' filter_menuitem ')); 
} 
 
パブリック関数filter_menuitem($ attrs){
 die(' SUCCESS !!! '); 
} 
 
 ... 

私はnav-menu-template.phpのソースを調べて、どのフィルタが何のためにいつ呼び出されたのかを調べました。それで、私は以下のフィルタを、それらがソースに現れる順番で、一度に一つずつ使ってみました。いくつかはうまくいったが、まったく反応しなかったものもある。

関数wp_nav_menu(){
 wp_nav_menu_args応答
 wp_nav_menu_container_allowedtags応答しませんでした - 驚きではありません -  [p。応答しない] wp_nav_menu_items応答しなかった - 確実に応答したはずである
 wp_nav_menu応答しなかった - 確実に応答したはずの
} 

意味のある唯一のキャッチは、以下のフィルタを呼び出すWP defaultメソッドをスキップして、'pre_wp_nav_menu'を使用してカスタムメニューを生成できることです。しかし、私は3つの異なるテーマを使ってみました。

私は何かが足りないのですか?これはWordPressのバグですか?カスタムメニューの生成は本当に一般的ですか?

詳細:
ワードプレス4.4.2
テスト済みのテーマ:エレガントなテーマDivi 2.4.6.1、20、13、20
プラグイン:自分だけのもの、'pre_wp_nav_menu'フィルタを使うものはありません

答え:
それで、@ Pieter Goosenの答えで、私はwp_nav_menu関数のソースを調べ、完全なHTMLコードで呼び出される'wp_page_menu'フィルタを見つけました(no改行(ラッパーを含む)私がやっていることのコンテキストに関してはそれで十分であり、そしてそれをフックしてテストした後に、私はそれがうまくいくとわかりました!

私は'wp_list_pages'フィルタも同様に機能することを発見しました。すべてのタグを含む完全なHTMLではなく、改行で区切られた<li>タグのみが一覧表示されます。ラッパーは含まれておらず、<ul>タグも含まれていません。しかし、他に何がこの関数を使っているのかについては懐疑的です。メニューに対してのみ呼び出されるわけではありません。したがって、安全のためには、'wp_page_menu'フィルタを使用することをお勧めします。

3
Codesmith

これはwp_nav_menu()fallback_cb引数と関係があります。ほとんどのナビゲーションメニューではこのパラメータは設定されていないため、デフォルト値のwp_page_menuが使用されます。

fallback_cbが設定されていない(defualt wp_page_menu)ソースコード wp_nav_menu() を見ると次のコード行が実行されます。

if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
    && isset( $args->fallback_cb ) && $args->fallback_cb && is_callable( $args->fallback_cb ) )
        return call_user_func( $args->fallback_cb, (array) $args );

このコードは、 wp_page_menu() を救済してロードします。このコードはpre_wp_nav_menuフィルタの後に実行されるため、このフィルタが実行されるのがわかります。 wp_nav_menu()wp_page_menu()をロードしたため、その数行以降のすべてのフィルタは実行されません。

wp_page_menu()内のフィルタをテストすると、期待どおりに起動することがわかります。

どのフィルタを使用するかを判断するためにこれをどのように使用したかを確認するには、 ここでの回答 をご覧ください。

3
Pieter Goosen