Выделение wp_nav_menu () Класс Предка w/o Дети в Военно-морской Структуре?

(Примечание модераторов: был первоначально назван "wp_nav_menu класс Предка без детей в структуре навигации"),

У меня есть a wp_nav_menu в моем заголовке, который имел три страницы в нем. Когда я нахожусь на одной из тех страниц, li содержание той страницы в меню получает класс .current_page_item. Эти три страницы имеют шаблоны, и эти шаблоны содержат пользовательские запросы для получения всех сообщений определенного типа контента. В действительности воспринятые "дети" этой высокоуровневой страницы не являются на самом деле детьми, они только имеют тип контента, который я связал с той высокоуровневой страницей с помощью шаблона.

Я хотел бы, чтобы элементы меню верхнего уровня получили a 'current-ancestor' класс, когда пользователь просматривает единственную страницу определенного типа сообщения, снова, связанный с той страницей только в пользовательском запросе в шаблонном файле.

Надежда, которая имеет смысл - в противном случае, сообщила мне, где я потерял Вас! Очень цените любую справку.

- Отредактированный для специфических особенностей: Например, у меня есть статическая страница под названием Семинары, которая использует шаблон. Его краткий заголовок является семинарами. Шаблон имеет пользовательскую функцию get_posts и цикл в ней, который вытягивает и показывает все сообщения пользовательского типа контента, названного семинарами. Если я нажимаю на один из заголовка этих семинаров, я взят к полному содержанию той части содержания. Структура постоянной ссылки пользовательского типа сообщения установлена на семинары/постимя, поэтому поскольку пользователь видит его, эти части содержания являются детьми страницы Workshops, когда в действительности они - весь один тип контента, но не связанный со страницей. Именно тот разрыв я должен эффективно закрыться в меню, выделив пункт меню 'Workshops' при просмотре содержания типа 'семинар'.

Снова, надежда, которая имеет смысл, я думаю, что сказал 'семинар' вверх 20 раз в одном абзаце!

30
19.10.2010, 02:49
7 ответов

Существует простое решение. Забудьте создавать страницы для каждого типа сообщения именно так, у Вас могут быть военно-морские объекты, потому что, как Вы узнали, WP не имеет никакого способа распознать, что пользовательские типы, которые Вы просматриваете, связаны с той страницей.

Вместо этого создайте настраиваемую ссылку по внешности> Меню. Просто поместите URL, который возвратит Ваш пользовательский тип и даст ему маркировку, затем нажать "Add to Menu".

http://example.com/workshops/

или non-pretty-permalinks:

http://example.com/?post_type=workshops

это одно просто создаст военно-морскую кнопку, которая показывает все сообщения с тем пользовательским типом сообщения и также добавит класс текущего пункта меню, когда Вы нажали тот военно-морской объект - но это еще не добавит военно-морской класс ни на каком URL кроме этого

Затем после того как это создается, войдите в конфигурацию для того нового объекта и введите краткий заголовок пользовательского типа сообщения в поле "Title Attribute" (Вы могли также использовать поле описания, но что каждый скрыт в администраторских экранных опциях по умолчанию).

Теперь, необходимо сцепиться nav_menu_css_class фильтр (который уволен за каждый военно-морской объект) и проверка, если просматриваемое содержание имеет тип сообщения, обозначенный в Вашем пользовательском военно-морском объекте:

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
    $post_type = get_query_var('post_type');
    if ($item->attr_title != '' && $item->attr_title == $post_type) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}

В этом случае мы собираемся проверить, что содержание поля Title Attribute не пусто и если они соответствуют текущему запрашиваемому post_type. Если так, мы добавляем класс текущего пункта меню к его массиву класса, затем возвращаем измененный массив.

Вы могли изменить это для простого соответствия заголовку военно-морского объекта, но если по некоторым причинам Вы хотите к заголовку военно-морской объект по-другому, чем простой краткий заголовок типа сообщения, с помощью поля Title Attribute или Description дает Вам ту гибкость.

Теперь любому времени, Вы просматриваете единственный объект (или вероятно даже архивируют списки) типа сообщения, который соответствует военно-морскому пункту меню, тот объект, дадут текущий пункт меню класса CSS, таким образом, Ваше выделение будет работать.

Никакие страницы или шаблоны страницы не необходимы ;-) Запрос URL заботится о выборке правых штанг. Ваш шаблон цикла заботится об отображении вывода запроса. Эта функция заботится о распознавании, что показывают и добавляющей класс CSS.

ПРЕМИЯ

Можно даже автоматизировать использование процесса wp_update_nav_menu_item, при наличии пунктов меню, автоматически сгенерированных для всех Ваших типов сообщения. Для этого примера Вы должны были бы сначала получить $menu_id из военно-морского меню Вы хотите это объекты, добавленные к.

$types = get_post_types( array( 'exclude_from_search' => false, '_builtin' => false  ), 'objects' );
foreach ($types as $type) {
    wp_update_nav_menu_item( $menu_id, 0, array(
        'menu-item-type' => 'custom',
        'menu-item-title' => $type->labels->name,
        'menu-item-url' => get_bloginfo('url') . '/?post_type=' . $type->rewrite['slug'],
        'menu-item-attr-title' => $type->rewrite['slug'],
        'menu-item-status' => 'publish'
        )
    );
}
29
19.02.2020, 21:54
  • 1
    , Это - материал! Я использую шаблоны страницы только потому, что макеты довольно сложны для тех страниц и только перечисляют страницы прочь, однако я могу все еще использовать тот фильтр, который Вы обеспечили для проверки страницы ID. Природа этой темы - то, что опции темы заставляют Вас совпадать, страницы ('домой' эта страница, 'об' эта страница, и т.д.), так, чтобы работал отлично. Спасибо за (невероятно подробный) помощь! –  Gavin 19.10.2010, 14:59
  • 2
    я должен был удалить current_page_parent от элемента навигации, который был моим блогом - но иначе он работал. спасибо –  pkyeck 10.10.2011, 17:58
  • 3
    спасибо, это не работало на меня с тех пор $item->attr_title вытащенный ЗАГОЛОВОК, и я записал заголовок в прописных буквах. таким образом, я изменил атрибут на $item->post_name и теперь это хорошо работает для меня. –  honk31 29.11.2013, 19:42
  • 4
    я пытался заставить код работать на мою тему, но не могу получить его работа. Там будет никакой класс не относился к моему родительскому элементу в меню, когда я нахожусь на пользовательском типе сообщения portfolio. Я использовал выше кода. Какова может быть проблема? –  Casper 25.03.2014, 17:51

вместо использования

$post_type = get_query_var ('post_type');

Вы могли бы хотеть попробовать:

$post_type = get_post_type ();

Поскольку иногда тип сообщения не установлен в var запроса. Дело обстоит так для значения по умолчанию post_type "сообщения", поэтому если Вы хотите выделить сообщение, которое было перечислено от страницы списка, необходимо будет использовать это. get_very_var () просто возвращает пустую строку для типов сообщения, которые не являются пользовательскими.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
    $post_type = get_post_type();
    if ($item->attr_title != '' && $item->attr_title == $post_type) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}
4
19.02.2020, 21:54

@Somatic - это - fantasic! Я изменил Ваш код немного, таким образом, он также работает на определенную Таксономию (который я использую только для связанного post_type). Идея состоит в том, чтобы использовать атрибут Заголовка пункта меню для хранения и названия post_type И названия таксономии, разделенной точкой с запятой и затем взорванной функцией.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {

    # get Query Vars
    $post_type = get_query_var('post_type');  
    $taxonomy = get_query_var('taxonomy');

    # get and parse Title attribute of Menu item
    $title = $item->attr_title; // menu item Title attribute, as post_type;taxonomy
    $title_array = explode(";", $title);
    $title_posttype = $title_array[0];
    $title_taxonomy = $title_array[1];

    # add class if needed
    if ($title != '' && ($title_posttype == $post_type || $title_taxonomy == $taxonomy)) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}
2
19.02.2020, 21:54

Здесь мое решение, если Вы хотите работать с wp_list_pages.

добавьте это в своем functions.php

add_filter('page_css_class', 'my_page_css_class', 10, 2);
function my_page_css_class($css_class, $page){
    $post_type = get_post_type();
    if($post_type != "page"){
        $parent_page = get_option('page_for_custom_post_type-'.$post_type);
        if($page->ID == $parent_page)
            $css_class[] = 'current_page_parent';
    }
    return $css_class;
}

Теперь просто добавьте в wp_options таблице новую строку с option_name page_for_custom_post_type-xxxx и option_value с идентификатором страницы, который Вы хотите соединить.

Возможно, Вы распознали, что уже существует опция, названная page_for_posts. Если u только имеют 1 пользовательский тип сообщения, можно установить страницу в/wp-admin/options-reading.php в выпадающем, и навигация установит current_page правильно.

Я думаю, что ядро Wordpress должно расширить этот раздел с помощью выпадающего для каждого зарегистрированного типа сообщения.

2
19.02.2020, 21:54

Хорошая Телесная работа.

К сожалению, я не добираюсь, как можно перечислить пользовательские типы сообщения на странице путем, Вы объясняете. Если я не использую страницу-portfolio.php и добавляю его к странице, все, что я получаю, 404 страницы.

Если мне действительно нравится Gavin, делает, я изменил Вас, функционируют немного, чтобы также удалить "current_page_parent" из страницы блога как это.

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($css_class, $item) {
$post_type = get_query_var('post_type');

if (get_post_type()=='portfolio') {
    $current_value = "current_page_parent"; 
    $css_class = array_filter($css_class, function ($element) use ($current_value) { return ($element != $current_value); } );
}

if ($item->attr_title != '' && $item->attr_title == $post_type) {       
    array_push($css_class, 'current_page_parent');
};
return $css_class;

}

0
19.02.2020, 21:54

Я решил придерживаться страниц и использовать шаблонное имя страницы в качестве класса на военно-морском объекте. Это позволяет мне стараться не загромождать атрибут заголовка, который мне не нравились приблизительно некоторые из других решений.

add_filter('nav_menu_css_class', 'mbudm_add_page_type_to_menu', 10, 2 );
//If a menu item is a page then add the template name to it as a css class 
function mbudm_add_page_type_to_menu($classes, $item) {
    if($item->object == 'page'){
        $template_name = get_post_meta( $item->object_id, '_wp_page_template', true );
        $new_class =str_replace(".php","",$template_name);
        array_push($classes, $new_class);
        return $classes;
    }   
}

Мне также добавили классы тела к header.php

<body <?php body_class(); ?>>

Наконец это решение требует, чтобы некоторая дополнительная CSS применила выбранное/активное состояние к Вашим военно-морским пунктам меню. Я использую его для показа архивов таксономии и пользовательских типов сообщения, связанных со страницей как дети этой страницы:

/* selected states - include sub pages for anything related to products */
#nav-main li.current-menu-item a,
body.single-mbudm_product #nav-main li.lp_products a,
body.tax-mbudm_product_category #nav-main li.lp_products a,
#nav-main li.current_page_parent a{color:#c00;}
2
19.02.2020, 21:54
  • 1
    Это дало мне следующую ошибку: Warning: join() [function.join]: Invalid arguments passed in /home/path/to/wp-includes/nav-menu-template.php on line 76 Какая-либо идея, что произошло здесь? –  Jeff K. 21.10.2011, 03:04
  • 2
    О, я думаю, что вижу то, что происходит. Это - потому что Вы возвращаете $classes в если оператор. Просто перемещение return $classes снаружи и после этого if кажется, решает вышеупомянутую ошибку. –  Jeff K. 21.10.2011, 04:14

@Somatic - Большой код! Я действительно вносил одно изменение сам. Я хотел сохранить Атрибут Заголовка для его намеченной цели, так вместо этого я поместил, Пользовательский краткий заголовок Типа Сообщения в Отношениях Ссылки (XFN) усовершенствовал свойства меню, которые можно включить в Экранных Опциях. Я изменил

if ($item->attr_title != '' && $item->attr_title == $post_type) {

и измененный это на

if ($item->xfn != '' && $item->xfn == $post_type) {
1
19.02.2020, 21:54

Теги

Похожие вопросы