ページ内のメタキーの値に基づいて、さまざまなナビゲーションメニュー項目のクラスを変更する方法を見つけようとしています。
現在メニューは次のようになっています。
<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クラス機能を使用して手動でメニューエディタに戻ることはできません。ユーザーはその領域にアクセスすることはできません。ユーザーが実際のページ編集モードのメタボックスドロップダウンメニューからさまざまなクラスを設定できることが重要です。
私の髪の毛を引っ張っているのですが、それがうまくいかないようです、不可能でしょうか。
編集:私の質問を更新しました
あなたのコードは、グローバルな$post
が閲覧されている投稿/ページを参照しているからではありません(もしあれば)。 nav_menu_css_class
で渡されるのはメニュー項目です - これは特定の投稿タイプです。そのプロパティには、次のものがあります。object
name__
object_id
も格納します
ですから、あなたがしたいことは、その用語が実際に投稿(またはカスタム投稿タイプ)を参照しているかどうかを確認し、object_id
をget_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);
テストしないで、これを試してください。
私は$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;
}