Intereting Posts
Добавление поля пользовательского идентификатора в категории Почему моя рабочая пользовательская таксономия не в массиве get_taxonomies? Почему сгенерированный POT-файл из WordPress.org не добавляет мое описание плагина в файл POT? Как создать страницу, содержащую список названий сообщений из определенных категорий? Когда я должен использовать API Transients? Условный wp_enqueue_script на странице Измените отображение API настроек (do_settings_sections) Как отключить многопользовательскую функцию WordPress 3.0? Передача переменной в качестве параметра URL – проблемы безопасности? Проблема с использованием add_rewrite_rule () для отправки запросов по пользовательским полям импорт пользователей, где пароль предоставляется как md5 + много метаданных Сохранение социальной доли после изменения WordPress Permalinks WordPress JQuery Fade in, Эффект Fade out Быстрый способ добавить страны в качестве обычного таксономического термина? Получите меньший размер изображения, get_the_post_thumbnail

Фильтр wp-custom-menu удаляет класс current_page_item

После добавления wp-custom-menu-filter plugin – чтобы скрыть некоторые пункты меню для не зарегистрированных пользователей, класс current_page_item исчез из моего меню. $item->classes в walker – пустой массив, а не обычный page-item-$id , current_page_item .

Я посмотрел на источник, но он не модифицирует массив классов, поэтому я не знаю, что происходит. Вот соответствующая часть кода.

 function wps_custom_nav_menu_items( $args ){ global $wpcmfp_settings; $nav_item_db_id = $args[1]->ID; $nav_menu = wp_get_object_terms( $nav_item_db_id, 'nav_menu' ); $menu_id = $nav_menu[0]->term_id; // Get the class to exclude if ( !is_user_logged_in() ) { $exclusion_class = $wpcmfp_settings[ 'menu-' . $menu_id . '-loggedout' ]; } else { $exclusion_class = $wpcmfp_settings[ 'menu-' . $menu_id . '-loggedin' ]; } $nav_items = wp_get_nav_menu_items( $menu_id ); // Cycle through all nav_items foreach ( $nav_items as $nav_item ) { // Cycle through all classes for ( $i=0; $i < count( $nav_item->classes ); $i++ ) { $exclude = false; // if nothing is there set to add if ( strlen ( $nav_item->classes[ $i ] ) < 1 ) { $exclude = false; } else { // if matches add to exclusion array & break loop if ( $nav_item->classes[ $i ] == $exclusion_class ) { $excluded_nav_items[] = $nav_item; $exclude = true; break; } } } if ( $exclude != true ) $modified_nav_items[] = $nav_item; } return $modified_nav_items; } add_filter( 'wp_nav_menu_objects', 'wps_custom_nav_menu_items' , 10 , 3); 

Я использую пользовательский хостинг страниц, я пробовал использовать по умолчанию, без эффекта, и пользовательский интерфейс отлично работает без этого плагина. Вот код ходока:

 class My_Walker_Page extends Walker_Nav_Menu { protected $_counter = 0; protected $_itemsPerColumn = 1; function start_lvl(&$output, $depth) { $this->_counter = 0; $output .= '<some html>'; } function end_lvl(&$output, $depth) { $output .= '<some html>'; $this->_counter = 0; } function start_el(&$output, $page, $depth, $args, $current_page = null) { $args = ( array ) $args; if ($depth == 0) { return parent::start_el ( $output, $page, $depth, $args, $current_page ); } if ($depth == 1) { extract ( $args, EXTR_SKIP ); $output .= '<dt><a href="' . esc_attr ( $page->url ) . '" title="' . esc_attr ( wp_strip_all_tags ( apply_filters ( 'the_title', $page->title, $page->ID ) ) ) . '">' . $link_before . apply_filters ( 'the_title', $page->title, $page->ID ) . $link_after . '</a>'; if (! empty ( $page->description )) { $output .= '<span class="menu_item_description">' . $page->description . '</span>'; } $output .= '</dt>'; $this->_counter ++; if ($this->_counter % $this->_itemsPerColumn == 0) { $output .= '</dl><dl>'; } } } function end_el(&$output, $page, $depth) { if ($depth == 0) { return parent::end_el ( &$output, $page, $depth ); } } function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) { if (! $element) return; $id_field = $this->db_fields ['id']; if ($depth == 0) { $this->_itemsPerColumn = ceil ( count ( $children_elements [$element->$id_field] ) / 4 ); } return parent::display_element ( $element, $children_elements, $max_depth, $depth, $args, $output ); } } 

Я в порядке с другим способом скрыть пункты меню для не зарегистрированных пользователей, вместо исправления плагина, но так как я никогда не использовал wp_nav_menu_objects я действительно не знаю, что происходит.

Solutions Collecting From Web of "Фильтр wp-custom-menu удаляет класс current_page_item"

После нескольких часов отладки я узнал, что wps_custom_nav_menu_items () фактически получает nav_menu_items с классами, применяемыми _wp_menu_item_classes_by_context, но вместо их использования он перезагружает все меню из базы данных! Поэтому, если вы измените

 $nav_items = wp_get_nav_menu_items( $menu_id ); 

к

 $nav_items = $args; 

(или просто удалите строку и переименуйте аргумент функции), она работает так, как ожидалось.