Intereting Posts
Создание фильтра поиска через плагин Панель администратора (панель инструментов) не отображается в пользовательском файле PHP, который загружает WordPress Как я могу исправить эти проблемы, создаваемые плагином Themecheck Где хранятся пользовательские значения полей в базе данных Как изменить <html lang = "bg-BG", но только для одной страницы Как загрузить post_meta для пользовательского типа сообщения через Ajax Как получить (уникальное) название страницы? ОГРАНИЧИТЬ РЕДАКТИРОВАНИЕ файлов PHP? почему этот код pre_get_posts не работает? Как установить плагин только из файла PHP? Разрешить пользователям редактировать виджеты Удаление области пользовательского виджета WordPress 4.4 Уведомления обновления базы данных Woocommerce автоматически запускаются на многопользовательском Показывать 1 сообщение и после определенной даты показать следующий Как сделать ссылку на разные категории, которые в них загружают разные меню?

Выделение текущего элемента подстраниц настраиваемых сообщений типов, перечисленных wp_list_pages

В приведенном ниже коде перечислены сами пользовательские типы сообщений и его дочерние элементы на боковой панели. Код работает отлично, но не выделяет вспомогательные страницы.

В functions.php :

 if(!function_exists('get_post_top_ancestor_id')){ /** * Gets the id of the topmost ancestor of the current page. Returns the current * page's id if there is no parent. * * @uses object $post * @return int */ function get_post_top_ancestor_id(){ global $post; if($post->post_parent){ $ancestors = array_reverse(get_post_ancestors($post->ID)); return $ancestors[0]; } return $post->ID; }} 

и добавление этого кода на боковой панели:

 <ul> <?php $getid=get_post_top_ancestor_id(); #echo $getid; global $post; $post=get_post($getid); setup_postdata($post); ?> <?php if (is_single($post->ID)) {$pg_li .="current_page_item";} else { $pg_li .="page_item";} ?> <h3><?php the_title();?></h3> <p></p> <li class="<?php echo $pg_li; ?>"> <a href="<?php the_permalink(); ?>">BIOGRAPHY</a> </li> <li class="<?php echo $pg_li; ?>"> <?php $args=array( 'post_type'=>'artists', 'child_of'=>$getid , 'sort_column'=>'menu_order', 'hierarchical' => 1, 'title_li'=>__('') ); wp_list_pages( $args ); wp_reset_query(); ?></li> </ul> 

Я не знаком с PHP, и друг помог мне написать этот код. Итак, что мне не хватает, чтобы выделить текущее подменю этого настраиваемого типа сообщений?

Проблема с этим кодом заключается в том, что запрос изменяется, а current_page_item теряется. Это часть, вызывающая проблемы.

 $post = get_post( $getid ); setup_postdata( $post ); 

Если вы закомментируете эти две строки, вы увидите, что current_page_item появляется.

Есть также некоторые вторичные проблемы с этим кодом, которые не имеют отношения к основной проблеме.

  1. <p></p> не должен существовать как дочерний элемент <ul> . Разрешено только <li> .
  2. <h3>...</h3> также не должен существовать как дочерний элемент <ul> по тем же причинам, что и # 1.
  3. Оператор if устанавливающий класс CSS для ссылки «Биография», вернет true на любой отдельной странице, а не только на родительскую страницу.
  4. wp_list_pages() выводит список пар <li>...</li> поэтому его не нужно обертывать другой парой тегов <li>...</li> .

Следующий код исправляет все проблемы.

 <?php $getid = get_post_top_ancestor_id(); global $post; ?> <h3><?php echo get_the_title( $getid );?></h3> <ul> <?php if ( $post->ID == $getid ) { $pg_li .= "current_page_item"; } else { $pg_li .= "page_item"; } ?> <li class="<?php echo $pg_li; ?>"> <a href="<?php echo get_permalink( $getid ); ?>">BIOGRAPHY</a> </li> <?php $args=array( 'post_type' => 'artists', 'child_of' => $getid, 'sort_column' => 'menu_order', 'hierarchical' => 1, 'title_li' => __('') ); wp_list_pages( $args ); ?> </ul> 

Для этого есть исправление, вот билет: https://core.trac.wordpress.org/changeset/27755

Если вам это нужно срочно, вы можете попробовать

Оригинальный ответ от @goldenapples, вот ссылка:

Динамическая навигация для пользовательских типов сообщений (страниц)

 function wp_list_post_types( $args ) { $defaults = array( 'numberposts' => -1, 'offset' => 0, 'orderby' => 'menu_order, post_title', 'order' => 'ASC', 'post_type' => 'page', 'depth' => 0, 'show_date' => '', 'date_format' => get_option('date_format'), 'child_of' => 0, 'exclude' => '', 'include' => '', 'title_li' => __('Pages'), 'echo' => 1, 'link_before' => '', 'link_after' => '', 'exclude_tree' => '' ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); $output = ''; $current_page = 0; // sanitize, mostly to keep spaces out $r['exclude'] = preg_replace('/[^0-9,]/', '', $r['exclude']); // Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array) $exclude_array = ( $r['exclude'] ) ? explode(',', $r['exclude']) : array(); $r['exclude'] = implode( ',', apply_filters('wp_list_post_types_excludes', $exclude_array) ); // Query pages. $r['hierarchical'] = 0; $pages = get_posts($r); if ( !empty($pages) ) { if ( $r['title_li'] ) $output .= '<li class="pagenav">' . $r['title_li'] . '<ul>'; global $wp_query; if ( ($r['post_type'] == get_query_var('post_type')) || is_attachment() ) $current_page = $wp_query->get_queried_object_id(); $output .= walk_page_tree($pages, $r['depth'], $current_page, $r); if ( $r['title_li'] ) $output .= '</ul></li>'; } $output = apply_filters('wp_list_pages', $output, $r); if ( $r['echo'] ) echo $output; else return $output; }