Рубрики
WordPress Шаблоны

Навигация в 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().

24 ответа к “Навигация в WordPress ч.III. Межстраничная навигация.”

“Навигация по подстраницам одиночной записи/страницы” – как прикрутить к ней стиль, например, wp_pagenavi? А то уж больно скудное оформление.
Пробовал заключить тег в , но стиль почему-то применяется только для второй страницы (т.е. берется цифра в рамку), надпись “Страниц:” и цифра “1” как были “голые”, так и остаются. А если перейти на вторую страницу, то обе цифры “оголяются” .
Или есть уже плагины для такой навигации (я нашел только page-list, но там навигации нет и рекомендуется такая же).

Будьте добры, помогите советом. Установлена пагинация и все отлично работает. но хочу добавить строчку над страницами с текстом типа: “Продолжение читайте на следующей странице”.
Как сделать так, чтобы этот текст не выводился на самой последней странице?!
А то выглядит это тупо как-то ))

Тут нужен код типа такого:

<?php         
global $wp_query;

$paged = $wp_query->get( 'paged' );
 
if ( ! $paged || $paged < 2 ) {
    // Первая страница
} elseif ( $paged && $paged == $wp_query->max_num_pages ) {
   // Последняя страница
} else {
   // Промежуточная страница
}
?>

Код не тестировал, придумал на лету, так что без обид )

Подскажи пожалуйста. Есть такой код постраничной навигации

function wp_corenavi() {
global $wp_query, $wp_rewrite;
$pages = ”;
$max = $wp_query->max_num_pages;
if (!$current = get_query_var(‘paged’)) $current = 1;
$a[‘base’] = str_replace(999999999, ‘%#%’, get_pagenum_link(999999999));
$a[‘total’] = $max;
$a[‘current’] = $current;
// удаляем добавку к пагинации для первой страницы
$a = str_replace( ‘/page/1″‘, ‘”‘, $result );

$total = 0; //1 – выводить текст “Страница N из N”, 0 – не выводить
$a[‘mid_size’] = 1; //сколько ссылок показывать слева и справа от текущей
$a[‘end_size’] = 1; //сколько ссылок показывать в начале и в конце
$a[‘prev_text’] = ”; //текст ссылки “Предыдущая страница”
$a[‘next_text’] = ”; //текст ссылки “Следующая страница”

if ($max > 1) echo ”;
if ($total == 1 && $max > 1) $pages = ‘Страница ‘ . $current . ‘ из ‘ . $max . ”.”\r\n”;
echo $pages . paginate_links($a);
if ($max > 1) echo ”;
}

Как убрать next_text prev_text?

Может быть и наивно ожидать от Вордпресса такого функционала, но я спрошу:
Отработка поиска (или скажем по тэгу) – результат – несколько превью записей – заходим в любую, ииии – внутри получаем навигацию уже не по результату поиска, а по внутренней сортировке ВП(вроде бы по дате) т.е. уже присутствуют записи не участвовавшие в результате поиска…
Возможно ли вернуть логику перемещения по результату запроса?

Попробую по другому объяснить:
Допустим результатами поиска, или тегов, или категорий (не важно) стали записи с условными номерами 4, 7 и 9.
При переходе по любой из этих ссылок, например №7 мы видим полную запись и навигацию “Следующая запись” и “Предыдущая запись”, так вот следующая запись содержит ссылку на №8, а предыдущая на №6, НО они же не участвовали в результате выдачи постов, т.е. предыдущей должна выступать №4 , а следующей №9 (согласно выше указанному условию)

Теперь я понял мысль.
Но так сделать не получится.
Когда вы переходите по результату поиска на какую-нибудь страницу, то все, вся информация о поиске теряется. Отображается страница как она есть.

Можно сделать, что-то подобное, если модифицировать страницу выдачи результатов поиска. Ну например можно выводить весь текст записи целиком, можно дать пользователю выбрать количество записей на странице. Т.е. если нужна навигация по результатам поиска, то нельзя уходить со страницы поиска. Как то так )

Может Вы мне подскажете:организована постраничная навигация между страницами рубрик с по средствам previous_posts_link() и next_posts_link(), элементы заключены в span для реализации фоновой картинкой в виде стрелки. Все работает,но выводит на первой записи рубрики фоновую картинку, когда там должно быть пусто, на последней записи стрелку не отображает. Вы не знаете как это исправить?Спасибо

А подскажите, пожалуйста, как реализовать навигацию между страницами (не записях) в рамках родительской страницы по принципу “Следующая” – “Предыдущая”. В данной статье рассмотрены только навигации в записях блога, не статичных страницах.

как же мне нравятся такие полные, содержательные и логичные статьи! эх, побольше бы таких – а для начинающих это вообще бесценный подарок – спасибо вам

Вопросик:
А разве можно одну запись добавлять в две рубрики? Не приводит ли это к дублированию контента и к санкциям со стороны поисковиков?

На сто процентов уверенным быть не могу, но мне кажется, что нет. Рубрики дублирование контента не дают.
А вот дублирование контента из-за древовидных комментариев я наблюдал не раз (https://www.q2w3.ru/2011/08/31/4309/), и это приводило к серьезному падению в поиске.

И еще. После долгих экспериментов я на своем сайте вообще запретил индексацию рубрик и меток. Только основная лента и страницы контента. И как-то так нормально идет )

Добрый день. Установила на сайте постраничную навигацию, true. В результате получилось, что ссылка на предыдущую страницу идет из той же рубрики, что и сама статья, а на следующую страницу – на следующую опубликованную страницу. Посоветуйте, пожалуйста, как изменить код, чтобы следующая страница была из той же рубрики. Спасибо.
 

Думаю, дело в том, что ваша запись находится не в одной, а в нескольких рубриках. В таком случае  ссылка на следующую/предыдущую запись будет определяться из выборки записей, принадлежащих всем отмеченным рубрикам.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *