WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

_navigation_markup() WP 4.1.0

Оборачивает переданные ссылки навигации/пагинации в html шаблон.

Используется для стандартного вывода ссылок навигации/пагинации в функциях: the_posts_pagination() и the_posts_navigation().

В этой функции есть полезный хук navigation_markup_template, используя который можно изменить шаблон вывода блока (см. пример).

Хуки из функции:
Возвращает

Строку. HTML шаблон блока навигации.

Использование

_navigation_markup( $links, $class, $screen_reader_text );
$links(строка) (обязательный)
Ссылки навигации.
$class(строка)
Дополнительные классы к главному блоку <nav>. Классы добавятся к имеющемуся классу navigation.
По умолчанию: 'posts-navigation'
$screen_reader_text(строка)
Название блока навигации при чтения с экрана (для роботов читающих код).
По умолчанию: __( 'Posts navigation' )

Примеры

#1 Получим блок навигации

Допустим мы получили ссылки навигации с помощью paginate_links() и теперь нам нужно вывести эти ссылки в стандартном формате пагинации:

// получаем ссылки пагинации
$links = paginate_links( $args );

if ( $links ) {
	echo _navigation_markup( $links, 'pagination', 'Моя крутая навигация' );
}

#2 Изменение шаблона блока навигации/пагинации

Допустим нам нужно изменить вывод HTML в функциях: the_posts_pagination(), the_posts_navigation(), нужно удалить заголовок H2. Для этого используем хук: 'navigation_markup_template':

add_filter('navigation_markup_template', 'my_navigation_template', 10, 2 );
function my_navigation_template( $template, $class ){
	/*
	Вид базового шаблона:
	<nav class="navigation %1$s" role="navigation">
		<h2 class="screen-reader-text">%2$s</h2>
		<div class="nav-links">%3$s</div>
	</nav>
	*/

	return '
	<nav class="navigation %1$s" role="navigation">
		<div class="nav-links">%3$s</div>
	</nav>    
	';
}

Код _navigation_markup: wp-includes/link-template.php VER 4.9.8

<?php
function _navigation_markup( $links, $class = 'posts-navigation', $screen_reader_text = '' ) {
	if ( empty( $screen_reader_text ) ) {
		$screen_reader_text = __( 'Posts navigation' );
	}

	$template = '
	<nav class="navigation %1$s" role="navigation">
		<h2 class="screen-reader-text">%2$s</h2>
		<div class="nav-links">%3$s</div>
	</nav>';

	/**
	 * Filters the navigation markup template.
	 *
	 * Note: The filtered template HTML must contain specifiers for the navigation
	 * class (%1$s), the screen-reader-text value (%2$s), and placement of the
	 * navigation links (%3$s):
	 *
	 *     <nav class="navigation %1$s" role="navigation">
	 *         <h2 class="screen-reader-text">%2$s</h2>
	 *         <div class="nav-links">%3$s</div>
	 *     </nav>
	 *
	 * @since 4.4.0
	 *
	 * @param string $template The default template.
	 * @param string $class    The class passed by the calling function.
	 * @return string Navigation template.
	 */
	$template = apply_filters( 'navigation_markup_template', $template, $class );

	return sprintf( $template, sanitize_html_class( $class ), esc_html( $screen_reader_text ), $links );
}

Cвязанные функции

Из метки: navigation pagination (навигация пагинация)

5 комментов
  • Элчин

    Как написать свой шаблон? Мне нужно что бы внутри nav был ul список, внутри которого были лишки, внутри собственно которых были сами ссылки .. Причем каждый из этих элементов должны иметь мои классы.
    Как научится писать такие шаблоны? Возможно у вас есть статья которая поможет мне? Спасибо! smile

    • lincaseidhe70 cайт: lincaseidhe.ru

      Это вместо пагинации надо засунуть что ли? Как вариант - функция get_posts() со своими параметрами, а дальше уж как хочется так шаблон и пиши...

      • Элчин

        Не совсем ..
        Вот вместо этого:

        <nav class="navigation %1$s" role="navigation">
        	<div class="nav-links">%3$s</div>
        </nav> 

        Хочу свою структуру вывода пагинации написать ..
        Например вот так:

        <nav class="navigation %1$s" role="navigation">
        	<ul class="nav-links">
        		<li>%3$s</li>
        	</ul>
        </nav> 

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

        • lincaseidhe70 cайт: lincaseidhe.ru

          Ну так просто не получится. %3$s - формируется другой функцией, конкретно https://wp-kama.ru/function/get_the_posts_navigation . там хуков нет, так что вывод изменить не удастся. Единственный вариант - самому сформировать нужный вывод, не задействуя функцию the_posts_navigation(). Например:

          function my_the_post_navigation( $args = array() ) {
          $navigation = '';
          
          	// Don't print empty markup if there's only one page.
          	if ( $GLOBALS['wp_query']->max_num_pages > 1 ) {
          		$args = wp_parse_args( $args, array(
          			'prev_text'          => __( 'Older posts' ),
          			'next_text'          => __( 'Newer posts' ),
          			'screen_reader_text' => __( 'Posts navigation' ),
          		) );
          
          		//тут в ссылки можно добавить собственные параметры, смотреть функции get_previous_posts_link и get_next_posts_link
          		$next_link = get_previous_posts_link( $args['next_text'] );
          		$prev_link = get_next_posts_link( $args['prev_text'] );
          
          		if ( $prev_link ) {
          			//тут уже делаем нужный вывод
          			$navigation .= '<li class="my-previous">' . $prev_link . '</li>';
          		}
          
          		if ( $next_link ) {
          			$navigation .= '<li class="my-next">' . $next_link . '</li>';
          		}
          
          		$navigation = _navigation_markup( $navigation, 'posts-navigation', $args['screen_reader_text'] );
          	}
          
          	echo $navigation;
          }

          При этом в шаблонах темы нужно будет заменить the_post_navigation() на my_the_post_navigation(). И если нужно добавить параметры.

          1
Здравствуйте, !     Войти . Зарегистрироваться