Разбиение записей на страницы - как использовать номера и ссылки "предыдущая/следующая"?

24 дек. 2011 г., 21:04:23
Просмотры: 18.8K
Голосов: 17

Я хочу, чтобы 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'=> 'Следующая'
)); ?>
0
Все ответы на вопрос 6
5
14

Функция, которую вы используете, 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.

31 дек. 2011 г. 19:54:21
Комментарии

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

Velvet Blues Velvet Blues
31 дек. 2011 г. 20:26:19

Возможно, когда я сравниваю код.

hakre hakre
31 дек. 2011 г. 20:34:55

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

fuxia fuxia
31 дек. 2011 г. 20:40:37

Разница в том, что @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')

deviato deviato
1 апр. 2021 г. 19:53:22

@deviato: спасибо за замечание, исправил, также с использованием строгого сравнения.

hakre hakre
2 апр. 2021 г. 10:37:05
1

Функция wp_link_pages() отображает либо текст, либо номера, но не оба варианта одновременно. Если посмотреть исходный код функции, станет ясно, что нет параметров, которые позволили бы изменить её поведение.

Тем не менее, есть три способа решить эту задачу без использования плагинов:

  1. Создать собственную функцию в файле functions.php вашей темы. Рабочий вариант, но потребуется новая функция.
  2. Использовать 2-3 экземпляра wp_link_pages(). Очень неэффективный костыль.
  3. Использовать фильтр. Предпочтительный метод. Смотрите ниже.

Я написал статью в своём блоге о том, как это реализовать. Вкратце, я использую фильтр wp_link_pages_args и добавляю функцию в файл functions.php, которая вводит новый параметр 'next_and_number'.

Хак для WordPress: Отображение номеров и ссылок "Далее/Назад" с помощью wp_link_pages()

30 дек. 2011 г. 16:14:22
Комментарии

Круто, чувак... Я думал о чем-то с использованием 4 глобальных значений, но так и не дошел до решения... +1!

Rutwick Gangurde Rutwick Gangurde
30 дек. 2011 г. 18:59:58
1

Попробуйте это, вы можете дополнительно настроить. Но это должно работать так, как вы хотели :-)

function tp_link_pages() {
    global $page, $numpages;

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
30 дек. 2011 г. 19:01:43
Комментарии

как мы можем управлять? https://wordpress.org/support/topic/how-to-manage-wp_link_pages-number-to-own-custom-url?replies=2

или как добавить динамический-пользовательский-заголовок перед номером страницы.

Ravi Patel Ravi Patel
7 июл. 2016 г. 14:53:48
3

Я не понимаю, в чём проблема... У вас есть какая-то ошибка?

Это должно работать:

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Страницы',
    'after'            => '</span>',
    'nextpagelink'     => __('Следующая'),
    'previouspagelink' => __('Предыдущая')
); 

wp_link_pages($args);
?> 

Вам не нужно добавлять next_or_number, так как number уже используется по умолчанию.

25 дек. 2011 г. 23:06:46
Комментарии

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

AndrettiMilas AndrettiMilas
28 дек. 2011 г. 16:55:14

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

Rutwick Gangurde Rutwick Gangurde
28 дек. 2011 г. 18:53:09

Мне нужно и то, и другое, как в примере.

AndrettiMilas AndrettiMilas
28 дек. 2011 г. 19:20:06
3

Этот код находится в цикле записей? Кодировка меня устраивает. Вот пример из Codex, как использовать:

<?php

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

?>
28 дек. 2011 г. 17:35:10
Комментарии

Этот код не работает.

AndrettiMilas AndrettiMilas
28 дек. 2011 г. 19:19:37

Код исправлен. Извините. Некоторые атрибуты не имеют значения.

Caio Alves Caio Alves
28 дек. 2011 г. 21:41:33

Это не дает результатов, которые я хотел получить в своем вопросе, это просто показывает цифры.

AndrettiMilas AndrettiMilas
29 дек. 2011 г. 16:07:17
0

Ответ отличается, но он был вдохновлен ответом @荒野无灯, который решил удалить свой вариант. По моему мнению, это лучшее и самое простое и гибкое решение:

Решение зависит от функции 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' => '&laquo; '.__( 'Предыдущая', 'your_textdomain' )
        ,'next_text' => __( 'Следующая', 'your_textdomain' ).' &raquo;'

        ,'base'      => get_permalink().'%_%'
        ,'format'    => user_trailingslashit( '%#%' )

        ,'current'   => $GLOBALS['page']
    ) ) )
        return;

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
12 окт. 2012 г. 14:44:09