Intereting Posts
Одна установка WordPress, обслуживающая несколько виртуальных хостов Изменены параметры постоянных ссылок, как перенаправить сообщения в Nginx? Текстовые фрагменты, разделяемые сообщениями WP застрял с запросом на MySQL, когда сайт возобновлен В чем смысл синтаксиса gettext? Как можно программно удалить элемент меню? Пользовательские изображения тегов сообщений, которые не отображаются с помощью ACF Код для отображения отдельного Single.php является переопределяющим нормальным single.php, тоже изображения не отображаются, несмотря на использование add_theme_support («пост-эскизы»); Исключить конкретную запись из отображения child index.php не перезаписывает родительский index.php в двадцать четырнадцатой теме Объектно-ориентированный плагин, добавьте действие и переменные Исправлена ​​ошибка URL-адреса пользовательского сообщения Отображать дочерние сообщения из определенной категории Визуальный редактор не показывает разные заголовки

Нет ссылки на пустой странице в wp_list_pages

В настоящее время я использую

<?php wp_list_pages( 'post_type=region&title_li=' ); ?> 

Чтобы получить иерархический список области моих пользовательских сообщений. Он работает отлично. Я получил это:

  • Европа
    • Бельгия
    • Франция
  • Азия
    • Китай

Со ссылкой на каждый элемент. НО некоторые страницы не имеют содержания. Это просто для создания иерархии. В этом примере ASIA не имеет контента.

Поэтому я хотел бы создать этот список меню, но если на странице нет контента -> нет ссылки для этого элемента.

Поэтому, я полагаю, мне нужно использовать другой способ, чем wp_list_pages. Но какой?

Вы можете мне помочь ?

Спасибо !

Solutions Collecting From Web of "Нет ссылки на пустой странице в wp_list_pages"

wp_list_pages() использует ходунка с именем Walker_Page чтобы отобразить его вывод, и это можно переопределить.

Ниже приведена настроенная версия Walker_Page::start_el() . Сначала код был скопирован из ядра, затем перед выводом ссылки была добавлена ​​простая проверка. Если в сообщении нет содержимого, заголовок будет помечен тегом <span> а не <a> .

Здесь изменяется выделение:

  ... // Modification: If a posts content is empty, do not link the item. Instead use a span tag to wrap the text. $maybe_link_item = empty( $page->post_content ) ? '<li class="%s"><span class="no-link">%3$s%4$s%5$s</span>' : '<li class="%s"><a href="%s">%s%s%s</a>'; $output .= $indent . sprintf( $maybe_link_item, // Modification: Using this variable instead of '<li class="%s"><a href="%s">%s%s%s</a>' $css_classes, get_permalink( $page->ID ), $args['link_before'], /** This filter is documented in wp-includes/post-template.php */ apply_filters( 'the_title', $page->post_title, $page->ID ), $args['link_after'] ); ... 

Вот полный ходок:

 class WPSE_Walker_Page extends Walker_Page { // Copied from Walker_Page::start_el() core version v4.7.4. /** * Outputs the beginning of the current element in the tree. * * @see Walker::start_el() * @since 2.1.0 * @access public * * @param string $output Used to append additional content. Passed by reference. * @param WP_Post $page Page data object. * @param int $depth Optional. Depth of page. Used for padding. Default 0. * @param array $args Optional. Array of arguments. Default empty array. * @param int $current_page Optional. Page ID. Default 0. */ public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) { if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { $t = "\t"; $n = "\n"; } else { $t = ''; $n = ''; } if ( $depth ) { $indent = str_repeat( $t, $depth ); } else { $indent = ''; } $css_class = array( 'page_item', 'page-item-' . $page->ID ); if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { $css_class[] = 'page_item_has_children'; } if ( ! empty( $current_page ) ) { $_current_page = get_post( $current_page ); if ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) { $css_class[] = 'current_page_ancestor'; } if ( $page->ID == $current_page ) { $css_class[] = 'current_page_item'; } elseif ( $_current_page && $page->ID == $_current_page->post_parent ) { $css_class[] = 'current_page_parent'; } } elseif ( $page->ID == get_option('page_for_posts') ) { $css_class[] = 'current_page_parent'; } /** * Filters the list of CSS classes to include with each page item in the list. * * @since 2.8.0 * * @see wp_list_pages() * * @param array $css_class An array of CSS classes to be applied * to each list item. * @param WP_Post $page Page data object. * @param int $depth Depth of page, used for padding. * @param array $args An array of arguments. * @param int $current_page ID of the current page. */ $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); if ( '' === $page->post_title ) { /* translators: %d: ID of a post */ $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID ); } $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; // Modification: If a posts content is empty, do not link the item. Instead use a span tag to wrap the text. $maybe_link_item = empty( $page->post_content ) ? '<li class="%s"><span class="no-link">%3$s%4$s%5$s</span>' : '<li class="%s"><a href="%s">%s%s%s</a>'; $output .= $indent . sprintf( $maybe_link_item, // Modification: Using this variable instead of '<li class="%s"><a href="%s">%s%s%s</a>' $css_classes, get_permalink( $page->ID ), $args['link_before'], /** This filter is documented in wp-includes/post-template.php */ apply_filters( 'the_title', $page->post_title, $page->ID ), $args['link_after'] ); if ( ! empty( $args['show_date'] ) ) { if ( 'modified' == $args['show_date'] ) { $time = $page->post_modified; } else { $time = $page->post_date; } $date_format = empty( $args['date_format'] ) ? '' : $args['date_format']; $output .= " " . mysql2date( $date_format, $time ); } } } 

Чтобы использовать новый ходок, добавьте его в свой файл functions.php или в плагин, а затем измените вызов на wp_list_pages() чтобы он использовал наш новый пользовательский ходок:

  wp_list_pages( [ 'post_type' => 'region', 'walker' => new WPSE_Walker_Page(), 'title_li' => '', ] );