Разбиение записей на страницы - как использовать номера и ссылки "предыдущая/следующая"?
Я хочу, чтобы wp_link_pages (для записей, разбитых на несколько страниц) отображал номера страниц, слово "предыдущая" перед этими номерами и "следующая" после них. Это должно выглядеть так:
Предыдущая 1, 2, 3, 4 Следующая
Я пытаюсь сделать это без использования плагина. Вот что я пробовал, но это не работает - отображаются только номера.
<?php wp_link_pages(array(
'before' => '<span style="clear:both; display:block">Страницы',
'after' => '</span>',
'next_or_number'=>'number',
'previouspagelink' => 'Предыдущая',
'nextpagelink'=> 'Следующая'
)); ?>

Функция, которую вы используете, wp_link_pages
Кодекс, по умолчанию не имеет нужной вам возможности.
Однако вы можете легко расширить её, используя функцию обратного вызова, зарегистрированную как фильтр для аргументов этой функции:
add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');
Фильтр будет изменять параметры, используемые в этой функции на лету, и добавлять отсутствующие ссылки на prev
и next
, которые выводятся слева и справа от нумерованного списка ссылок (next_or_number' => 'number'
):
/**
* Добавляет ссылки "предыдущая" и "следующая" к нумерованному списку страниц
*/
function wp_link_pages_args_prevnext_add($args)
{
global $page, $numpages, $more, $pagenow;
if ($args['next_or_number'] !== 'next_and_number')
return $args; # ранний выход
$args['next_or_number'] = 'number'; # сохраняем нумерацию для основной части
if (!$more)
return $args; # ранний выход
if ($page - 1) # есть предыдущая страница
$args['before'] .= _wp_link_page($page-1)
. $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
;
if ($page < $numpages) # есть следующая страница
$args['after'] = _wp_link_page($page+1)
. $args['link_before'] . ' ' . $args['nextpagelink'] . $args['link_after'] . '</a>'
. $args['after']
;
return $args;
}
Использование:
wp_link_pages(array(
'before' => '<p>' . __('Страницы:'),
'after' => '</p>',
'next_or_number' => 'next_and_number', # активируем перегрузку параметра
'nextpagelink' => __('Следующая'),
'previouspagelink' => __('Предыдущая'),
'pagelink' => '%',
'echo' => 1 )
);
Если ваша тема всегда использует ссылки "предыдущая" и "следующая", вы можете немного изменить функцию, чтобы сделать это поведение по умолчанию при использовании number
(значение по умолчанию), что позволит писать меньше кода в ваших темах.
Это немного другая реализация по сравнению с предложенной Velvet Blues.

За исключением нескольких комментариев и ранних возвратов, реализация, название опции и объяснение точно такие же, как у меня. Я что-то упускаю? Какое преимущество дает ваше решение? Спасибо.

Решение Hakre доступно, пока существует этот вопрос. Полные ответы (= понятные без обращения к внешним источникам) всегда предпочтительны на StackExchange.

Разница в том, что @hakre допустил ошибку. В этой строке кода: if (!$args['next_or_number'] == 'next_and_number') у него отсутствуют скобки, поэтому $args инвертируется перед логическим сравнением, должно быть: if (!($args['next_or_number'] == 'next_and_number')) или лучше if($args['next_or_number']!='next_and_number')

Функция wp_link_pages()
отображает либо текст, либо номера, но не оба варианта одновременно. Если посмотреть исходный код функции, станет ясно, что нет параметров, которые позволили бы изменить её поведение.
Тем не менее, есть три способа решить эту задачу без использования плагинов:
- Создать собственную функцию в файле functions.php вашей темы. Рабочий вариант, но потребуется новая функция.
- Использовать 2-3 экземпляра
wp_link_pages()
. Очень неэффективный костыль. - Использовать фильтр. Предпочтительный метод. Смотрите ниже.
Я написал статью в своём блоге о том, как это реализовать. Вкратце, я использую фильтр wp_link_pages_args и добавляю функцию в файл functions.php, которая вводит новый параметр 'next_and_number'.
Хак для WordPress: Отображение номеров и ссылок "Далее/Назад" с помощью wp_link_pages()

как мы можем управлять? https://wordpress.org/support/topic/how-to-manage-wp_link_pages-number-to-own-custom-url?replies=2
или как добавить динамический-пользовательский-заголовок перед номером страницы.

Я не понимаю, в чём проблема... У вас есть какая-то ошибка?
Это должно работать:
<?php $args = array(
'before' => '<span style="clear:both; display:block">Страницы',
'after' => '</span>',
'nextpagelink' => __('Следующая'),
'previouspagelink' => __('Предыдущая')
);
wp_link_pages($args);
?>
Вам не нужно добавлять next_or_number, так как number уже используется по умолчанию.

По какой-то причине это не работает, но мне кажется, что всё сделано правильно. Интересно, были ли изменения в версии 3.3 или мне нужно добавить что-то в functions.php?

Да, я тоже пробовал это, работает, если установить next_or_number
в next
. Но отображаются только ссылки 'Следующая' и 'Предыдущая', без номеров!

Этот код находится в цикле записей? Кодировка меня устраивает. Вот пример из Codex, как использовать:
<?php
wp_link_pages(array(
'before' => '<p>' . __('Страницы:'), // Текст перед навигацией
'after' => '</p>', // Текст после навигации
'next_or_number' => 'number', // Нумерованные ссылки
'nextpagelink' => __('Следующая страница'), // Текст ссылки "Следующая"
'previouspagelink' => __('Предыдущая страница'), // Текст ссылки "Предыдущая"
'pagelink' => '%', // Формат номера страницы
'echo' => 1 ) // Выводить сразу
);
?>

Ответ отличается, но он был вдохновлен ответом @荒野无灯, который решил удалить свой вариант. По моему мнению, это лучшее и самое простое и гибкое решение:
Решение зависит от функции paginate_links()
. Важно знать, что параметр base
будет начальным URL, к которому добавляется %_%
, а затем заменяется на значение из format
. Поэтому, пока мы используем get_permalink().'%_%'
, мы уверены, что останемся на текущей записи. Внутри format
символ #
заменяется на номер страницы:
function wpse37256_paginate_paged()
{
if ( ! $paginate_links = paginate_links( array(
'type' => 'array'
,'total' => $GLOBALS['numpages']
,'mid_size' => 1
,'end_size' => 1
#,'prev_next' => false
,'prev_text' => '« '.__( 'Предыдущая', 'your_textdomain' )
,'next_text' => __( 'Следующая', 'your_textdomain' ).' »'
,'base' => get_permalink().'%_%'
,'format' => user_trailingslashit( '%#%' )
,'current' => $GLOBALS['page']
) ) )
return;
echo "<div class='pagination-container'>{$paginate_links}</div>";
}
