web-dev-qa-db-ja.com

ナビゲーションメニュー - メタキーに基づいてクラスを追加

ページ内のメタキーの値に基づいて、さまざまなナビゲーションメニュー項目のクラスを変更する方法を見つけようとしています。

現在メニューは次のようになっています。

<li class="menu-item-1">Menu item 1</li>
<li class="menu-item-2">Menu item 2</li>
<li class="menu-item-3">Menu item 3</li>
<li class="menu-item-4">Menu item 4</li>
<li class="menu-item-5">Menu item 5</li>

カスタムキーを使用して、各ページから個々のキーを取得し、それらを対応するメニュー項目に配置します。

<li class="menu-item-1 pink">Menu item 1</li>
<li class="menu-item-2 yellow">Menu item 2</li>
<li class="menu-item-3 green">Menu item 3</li>
<li class="menu-item-4 pink">Menu item 4</li>
<li class="menu-item-5 bordeaux">Menu item 5</li>

これは私がこれまでに持っているものです:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
    global $post;
    $colorcode = get_post_meta($post->ID, 'color_dropdown', true);
    if(is_page()) {
        $classes[] = $colorcode;
    }
    return $classes;
}

つまり、メタキーの値が割り当てられているページにアクセスしたときにだけ、クラスにメタキーを追加し、それをすべてのメニュー項目に追加します。

CSSクラス機能を使用して手動でメニューエディタに戻ることはできません。ユーザーはその領域にアクセスすることはできません。ユーザーが実際のページ編集モードのメタボックスドロップダウンメニューからさまざまなクラスを設定できることが重要です。

私の髪の毛を引っ張っているのですが、それがうまくいかないようです、不可能でしょうか。

編集:私の質問を更新しました

1
INT

あなたのコードは、グローバルな$postが閲覧されている投稿/ページを参照しているからではありません(もしあれば)。 nav_menu_css_classで渡されるのはメニュー項目です - これは特定の投稿タイプです。そのプロパティには、次のものがあります。objectname__

  • リンクが投稿を参照している場合は投稿タイプ
  • リンクが分類学用語ページを参照している場合は分類学
  • カスタムリンクの場合は 'custom'

object_idも格納します

  • リンクが投稿を参照している場合は投稿ID
  • リンクが分類学用語ページを参照している場合は用語ID
  • カスタムリンクの投稿ID

ですから、あなたがしたいことは、その用語が実際に投稿(またはカスタム投稿タイプ)を参照しているかどうかを確認し、object_idget_post_meta()に渡すことです。

function wpse51076_special_nav_class($classes, $item){
    if( 'post' == $item->object ){
            $colorcode = get_post_meta($item->object_id, 'color_dropdown', true);
           $classes[] = $colorcode;
    }
    return $classes;
}
add_filter('nav_menu_css_class' , 'wpse51076_special_nav_class' , 10 , 2);
2
Stephen Harris

テストしないで、これを試してください。
私は$post->ID$item->IDに置き換えました、うまくいくはずです。

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
    global $post;
    $colorcode = get_post_meta($item->ID, 'color_dropdown', true);
    if(is_page()) {
        $classes[] = $colorcode;
    }
    return $classes;
}
0
janw