web-dev-qa-db-ja.com

ナビゲーションメニューのCSSクラスをボディに追加

現在のメニュー項目のCSSクラス(およびその親と先祖のクラス)を現在のページ本体クラスに追加します。

たとえば、現在のメニュー項目にCSSクラス "products"([Appearance] - [Menus]で定義)がある場合、対応するページの本文にもクラス "products"が含まれているはずです。

それが誰にとっても理にかなっているなら、どのようにそれをするのかのアイデアはありますか?

" 現在、親、そして祖先のメニュー項目IDをbody_class()に追加するにはどうすればいいですか? "を見ています私の場合はうまくいく。

2
dvd3141

これが、Mridul Aggarwalのヒントのおかげで、私がなんとかまとめることができたことです。

function pa_assign_menu_class_to_body(){
  // 'main' is the theme_location, set earlier using register_nav_menus()
  $menu_name = 'main';
  $class_list = array();

  if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);

    // _wp_menu_item_classes_by_context() adds current, current_item_parent and current_item_ancestor to the appropriate arrays in the provided variable
    _wp_menu_item_classes_by_context( $menu_items );

    $classes = array();

    foreach($menu_items as $menu_item) {
      if ($menu_item->current == 1) {
        $classes['current'] = $menu_item->classes;
      }
      if ($menu_item->current_item_parent == 1) {
        $classes['parents'] = $menu_item->classes;
      }
      if ($menu_item->current_item_ancestor == 1) {
        $classes['ancestors'] = $menu_item->classes;
      }
    }

    // create a one-dimensional array of unique classes
    foreach($classes as $class) 
      foreach ($class as $cls) $class_list[] = $cls;
    $class_list = array_values(array_unique($class_list));
  }
  // if, for some reason, we have no results, we need to assign a default class otherwise WordPress complains
  if (empty($class_list)) $class_list[] = 'default';
  return $class_list;
}
add_filter( 'body_class', 'pa_assign_menu_class_to_body');

この関数は、menu-item-typeクラスもすべて追加するので、少しも多くします。私が本当に欲しいのは、ユーザーがWordPressのメニュー管理画面のCSSクラスフィールドに入力したカスタムCSSクラスだけです。それらのクラスだけを抽出する方法についてのどんな考えでも大歓迎です。

1
dvd3141

カスタムクラスのみを取得するために上記のコードにわずかな変更を加えてください。カスタムクラスは常に最初の項目です。

function pa_assign_menu_class_to_body(){
  // 'main' is the theme_location, set earlier using register_nav_menus()
  $menu_name = 'main';
  $class_list = array();

  if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);

    // _wp_menu_item_classes_by_context() adds current, current_item_parent and current_item_ancestor to the appropriate arrays in the provided variable
    _wp_menu_item_classes_by_context( $menu_items );

    $classes = array();

    foreach($menu_items as $menu_item) {
      if ($menu_item->current == 1) {
        $classes['current'] = $menu_item->classes;
      }
      if ($menu_item->current_item_parent == 1) {
        $classes['parents'] = $menu_item->classes;
      }
      if ($menu_item->current_item_ancestor == 1) {
        $classes['ancestors'] = $menu_item->classes;
      }
    }

    // create a one-dimensional array of unique classes
    foreach($classes as $class) 
      foreach ($class as $cls) $class_list[] = $cls;
    $class_list = array_values(array_unique($class_list));
  }
  // if, for some reason, we have no results, we need to assign a default class otherwise WordPress complains
  if (empty($class_list)) $class_list[] = 'default';
  //Gets first class if custom. If not, returns null.
  if ($class_list[0] != 'menu-item') {
      $class_list_return[] = $class_list[0];
  } else {
      $class_list_return[] = null;
  }
  return $class_list_return;
}
add_filter( 'body_class', 'pa_assign_menu_class_to_body');

EDIT:これと元のフィルタはデフォルトのクラスを置き換えます。追加したいだけの場合は...

function pa_assign_menu_class_to_body($classes){
  // 'main' is the theme_location, set earlier using register_nav_menus()
  $menu_name = 'main';
  $class_list = array();

  if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);

    // _wp_menu_item_classes_by_context() adds current, current_item_parent and current_item_ancestor to the appropriate arrays in the provided variable
    _wp_menu_item_classes_by_context( $menu_items );

    foreach($menu_items as $menu_item) {
      if ($menu_item->current == 1) {
        $classes['current'] = $menu_item->classes;
      }
      if ($menu_item->current_item_parent == 1) {
        $classes['parents'] = $menu_item->classes;
      }
      if ($menu_item->current_item_ancestor == 1) {
        $classes['ancestors'] = $menu_item->classes;
      }
    }

    // create a one-dimensional array of unique classes
    foreach($classes as $class) 
      foreach ($class as $cls) $class_list[] = $cls;
    $class_list = array_values(array_unique($class_list));
  }
  // if, for some reason, we have no results, we need to assign a default class otherwise WordPress complains
  if (empty($class_list)) $class_list[] = 'default';
  //Gets first class if custom. If not, returns null.
  if ($class_list[0] != 'menu-item') {
      $class_list_return[] = $class_list[0];
  } else {
      $class_list_return[] = null;
  }
  return array_merge($classes, $class_list_return);
}
add_filter( 'body_class', 'pa_assign_menu_class_to_body');
0
Dadiocoleman

答え you linked で、var_dump($dosmenu);行のすぐ上に_wp_menu_item_classes_by_context( $dosmenu );を実行します。その変数はあなたが望むクラスで既に初期化されているはずです。

その後、foreachループをそれに応じて調整し、その関数をbody_classへのフィルタとして使用することができます。

Adminに設定されたクラスは、キー_menu_item_classesを持つポストメタとして保存され、これはwp_get_nav_menu_itemsの呼び出しで自動的に初期化されます。

0
Mridul Aggarwal