web-dev-qa-db-ja.com

WPメニューでショートコードを使用する WP 3.1(nav_menu_objectsから)

この新しいプラグインを見つけました

http://wpsmith.net/wordpress/creating-multiple-custom-menus-in-wordpress-3-1

ユーザーがログインしていない場合は、walkerクラスによって解析される前に、新しい3.1フック(wp_nav_menu_objects)を使用して特定のnav-menu-itemをnav-menu-item配列から削除します。プラグインは特定のCSSを使用します。削除する項目を決定するための識別子としての-class。

そのため、特定のメニュー項目の表示に関する高度な条件付きセットを使用するために、ナビゲーションメニュー項目の説明にショートコードを使用できないのではないかと考えていました(xページの表示、donなど)。ページyに表示しない、または特に便利な方法:ウォーカーによって配列が解析される前に、それらをnav_menu_item配列に挿入することによって、子ページ/カテゴリなどを自動的に含める

しかし追加

add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’);

ページが正しく読み込まれません。空白ページエラーではありませんが、ナビゲーションメニューのコンテナーdivの直後にページのレンダリングが停止します。この目的のためにネイティブWPショートコード機能を使用する方法はありますか?それとも、nav-item-contentsを分析する関数内にカスタムショートコードパーサを作成する必要があるでしょうか?

アイデアをありがとう!

2
youngmicroserf

問題は、do_shortcode()が最初のパラメータに文字列を期待しているのに対し、wp_nav_menu_objectsがメニューオブジェクトの配列を渡していることです。

あなたはdo_shortcodeにあなた自身のラッパー関数を書かなければならないでしょう、このような何か...

function my_nav_menu_objects_shortcode_mangler($items) {
    foreach ($items as $item) {
        $item->classes = explode(' ', do_shortcode(implode(' ', (array)$item->classes)));
    }
    return $items;
}

うまくいくかもしれません。 wp-includes/nav-menu-template.phpのソースを見てナビゲーションメニューオブジェクト($ item)の構造を調べてから、どのプロパティをどのように変更するのが最適か、またどのようにフォーマットし、どのようにそれを文字列に変換するのかあなたはそれの上にショートコードを走らせることができます、など)。

ただし、そのようなロジックを実装する他の手段は、ショートコード機能をハッキングするよりも優れている可能性があります。

また、そのモデルを使用すると、メニュー項目の1つのプロパティにショートコードを設定して別のプロパティの出力を変更することはできません。メニュー項目ラベルにショートコードを設定できずクラス。そのようには動作しません。

1
wyrfel

たとえば優先順位を11に変更するとどうなりますか。

add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’, 11);

これがshortcodes.phpのthe_contentにフィルタが追加される方法です。参照してください: http://codex.wordpress.org/Function_Reference/do_shortcode

0
aendrew