23

Навигация в WordPress ч.III. Межстраничная навигация.

Содержание:


Навигация по подстраницам одиночной записи/страницы

Имеются в виду подстраницы создаваемые тегом <!—nextpage—> в html-редакторе.

wp_link_pages() — функция для вывода ссылок на подстраницы. Используется внутри цикла WordPress, обычно перед и/или после основного содержания записи.

<?php
$args = array(
  'before' => '<p>Страницы: ', // Текст перед ссылками на страницы
  'after' => '</p>', // Текст после ссылок на страницы
  'link_before' => , // Добавляет текст в начало ссылки
  'link_after' => , // Добавляет текст в конец ссылки
  'next_or_number' => 'number', // number (по умолчанию) - текст ссылки содержит номер страницы. next - ссылки в стиле "следующая/предыдущая" страница
  'nextpagelink' => 'Следующая страница', // Текст для ссылки на следующую страницу, если next_or_number = next
  'previouspagelink' => 'Предыдущая страница', // Текст для ссылки на предыдущую страницу, если next_or_number = next
  'pagelink' => '%', // Текст ссылки, где % - номер страницы, если next_or_number = number.
  'more_file' => , // Переопределяет цель ссылки. По умолчанию - текущая страница.
  'echo' => 1 // 1 (по умолчанию) - выводит результат на экран. 0 - возвращает результат для последующей обработки в php
);
wp_link_pages( $args );
?>
Пример 1

Пример 1

Навигация между соседними записями

previous_post_link() и next_post_link() — ссылки на предыдущую и следующую запись в ленте блога (или в ленте рубрики) относительно текущей записи. Следующая запись определяется по дате публикации.

<div class="navigation">
  <div class="previous_link">
<?php
$format = '<em>%link</em>'; // Вид ссылки, %link - ссылка на предыдущую статью.
$link = '%title'; // Текст ссылки, %title - заголовок предыдущей статьи.
$in_same_cat = false; // Измените значение на true - чтобы ссылки были на записи находящиеся в той же рубрике, что и текущая запись. По умолчанию - false.
$excluded_categories = ''; // ID рубрик. Ссылки на записи, принадлежащие указанным рубрикам, показаны не будут. Чтобы указать несколько рубрик используйте AND. Например '1 AND 12 AND 34'.
previous_post_link($format, $link, $in_same_cat , $excluded_categories);
?>
  </div><!--previous_link-->
  <div class="next_link">
    <?php next_post_link('<em>%link</em>', '%title'); ?>
  </div><!--next_link-->
</div><!--navigation-->
Пример 2

Пример 2

Стандартная навигация «вперед/назад» между страницами записей (рубрики, метки, архивы и т.п.)

posts_nav_link() — одна функция для вывода ссылок на предыдущую и следующую страницы.

<div class="navigation">
<?php
$separator = '&mdash;'; //Разделитель
$prev_text = '&laquo; Предыдущая страница';
$next_text = 'Следующая страница &raquo;';
posts_nav_link($separator, $prev_text, $next_text);
?>
</div><!--navigation-->
Пример 3

Пример 3

previous_posts_link() и next_posts_link() — те же ссылки, но по отдельности. Для дополнительной обработки ссылок в PHP используются функции get_previous_posts_link() и get_next_posts_link().

<div class="navigation">
  <div class="previous_link">
<?php
$label = '&laquo; Предыдущая страница';
$max_pages = 0; // Ограничивает количество страниц на которых отображается ссылка. По умолчанию 0 - без ограничений.
previous_posts_link($label, $max_pages);
?>
  </div><!--previous_link-->
  <div class="next_link">
    <?php next_posts_link('Следующая страница &raquo;'); ?>
  </div><!--next_link-->
</div><!--navigation-->
Пример 4

Пример 4

Стандартная навигация «вперед/назад» между страницами комментариев

previous_comments_link() и next_comments_link() — ссылки на предыдущую и следующую страницы. Использование аналогично previous_posts_link() и next_posts_link().

<div class="navigation">
  <div class="previous_link">
<?php
$label = '« Предыдущая страница';
$max_pages = 0; // Ограничивает количество страниц на которых отображается ссылка. По умолчанию 0 - без ограничений.
previous_comments_link($label, $max_pages);
?>
  </div><!--previous_link-->
  <div class="next_link">
    <?php next_comments_link('Следующая страница »'); ?>
  </div><!--next_link-->
</div><!--navigation-->

Навигация по номеру страницы для страниц записей

paginate_links() — стандартная функция WordPress для нумерации страниц. Т.к. функция требует дополнительной настройки, имеет смысл создать в  functions.php новую функцию (пусть называется advanced_page_navigation() ) и поместить весь управляющий код внутрь нее:

// Код функции поместить в functions.php
function advanced_page_navigation($args = false) {
  global $wp_rewrite, $wp_query;
  if ($wp_query->max_num_pages == 1 || $wp_query->max_num_pages == 0) return; // Если страница единственная, навигацию скрываем.
  $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1; // Определение текущей страницы
  $default_args = array( // Массив параметров по умолчанию.
    'base' => @add_query_arg('page','%#%'),
    'format' => '',
    'total' => $wp_query->max_num_pages, // Максимальное количество страниц. В данном случае - все страницы.
    'current' => $current, // Текущая страница.
    'show_all' => false, // true - показывает ссылки на все страницы (без сокращений). false - выводит ссылки в соответствии с параметрами max_size, mid_size, end_size.
    'max_size' => 10, // Максимальное количество ссылок на страницы.
    'mid_size' => 2, // Количество ссылок на страницы слева и справа от текущей.
    'end_size' => 1, // Количество ссылок на страницы от начала и от конца списка (включая первую и последнюю).
    'type' => 'plain', // plain - функция возвращает ссылки разделенные символом новой строки. list - ссылки на страницы представлены как немаркированный список (ul). array - возвращает ссылки в виде массива php.
    'prev_text' => '&lt;', // Текст кнопки "предыдущая страница"
    'next_text' => '&gt;', // Текст кнопки "следующая страница"
    'echo' => false // 1 (true) - выводит результат на экран. 0 (false) - возвращает результат для последующей обработки в php
  );
  $args = wp_parse_args($args, $default_args);
  if ( $args['max_size'] >= $wp_query->max_num_pages ) $args['show_all'] = true; else $args['show_all'] = false;
  if( $wp_rewrite->using_permalinks() ) // Если включены постоянные ссылки
    $args['base'] = user_trailingslashit( trailingslashit( remove_query_arg('s',get_pagenum_link(1) ) ) . 'page/%#%/', 'paged');
  if( !empty($wp_query->query_vars['s']) ) // Если постоянные ссылки отключены
    $args['add_args'] = array('s'=>get_query_var('s'));
  $args['echo'] = false; // На всякий случай
  echo "<div class=\"paged-navigation\"><span class=\"navigation-info\">Страница $current из {$wp_query->max_num_pages} </span> " . paginate_links($args) . '</div>'.PHP_EOL;
}

В шаблон вставляем новую функцию. Все компактно и красиво:

<div class="navigation">
  <?php advanced_page_navigation($args); // С помощью массива $args можно переопределить значения по умолчанию ?>
</div><!--navigation-->

Пример css-оформления кнопок (как на этом сайте) для type = plain

Пример 5

Пример 5

Навигация по номеру страницы для страниц комментариев

paginate_comments_links() — встроенная функция для создания нумерации страниц комментариев, но мы ее использовать не будем из-за нескольких ограничений. Вместо нее воспользуемся более мощной paginate_links(). Как и в предыдущем примере, для простоты создаем вспомогательную функцию — advanced_comments_page_navigation():

// Код функции поместить в functions.php
function advanced_comments_page_navigation($args = false) {
  global $wp_rewrite;
  if ( !is_singular() || !get_option('page_comments') ) return;
  $max_num_pages = get_comment_pages_count();
  if ( $max_num_pages == 1 || $max_num_pages == 0) return;
  $current = get_query_var('cpage');
  if ( !$current ) $current = 1;
  $default_args = array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'total' => $max_num_pages,
    'current' => $current,
    'show_all' => false,
    'max_size' => 10,
    'mid_size' => 2,
    'end_size' => 1,
    'type' => 'plain',
    'prev_text' => '&lt;',
    'next_text' => '&gt;',
    'echo' => false,
    'add_fragment' => '#comments'
  );
  $args = wp_parse_args( $args, $default_args );
  if ( $args['max_size'] >= $max_num_pages ) $args['show_all'] = true; else $args['show_all'] = false;
  if ( $wp_rewrite->using_permalinks() )
    $args['base'] = user_trailingslashit(trailingslashit(get_permalink()) . 'comment-page-%#%', 'commentpaged');
  $args['echo'] = false;
  echo "<div class=\"paged-navigation\"><span class=\"navigation-info\">Страница $current из $max_num_pages </span> " . paginate_links($args) . '</div>'.PHP_EOL;
}

В шаблон вставляем:

<div class="navigation">
  <?php advanced_comments_page_navigation($args); // С помощью массива $args можно переопределить значения по умолчанию ?>
</div><!--navigation-->

Css-оформление такое же как и для paginate_links().