Посты с постами - как использовать цифры и следующие / предыдущие ссылки?

17

Я хочу, чтобы wp_link_pages (посты с несколькими страницами) отображали номера страниц, слово «предыдущий» перед этими номерами и «следующий» после этих номеров. Это будет выглядеть так:

Предыдущая 1, 2, 3, 4 Следующая

Я пытаюсь сделать это без плагина. Вот что я пробовал до сих пор, но он не работает, он только показывает цифры.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pages', 
    'after'  => '</span>',
    'next_or_number'=>'number',
    'previouspagelink' => 'previous',
    'nextpagelink'=> 'Next'
)); ?>
AndrettiMilas
источник

Ответы:

12

Функция, которую вы используете, wp_link_pagesКодекс , не имеет функции, которую вы ищете по умолчанию.

Однако вы можете легко расширить его, используя функцию обратного вызова, зарегистрированную в качестве фильтра для аргументов этой функции:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Фильтр будет изменять параметры, которые используются в этой функции на лету и инъекционные недостающие ссылки на prevи nextаргументы , которые выводятся на левой и правой стороне нумерованного списка ссылок ( next_or_number' => 'number'):

/**
 * Add prev and next links to a numbered page link list
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if (!$args['next_or_number'] == 'next_and_number') 
        return $args; # exit early

    $args['next_or_number'] = 'number'; # keep numbering for the main part
    if (!$more)
        return $args; # exit early

    if($page-1) # there is a previous page
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page<$numpages) # there is a next page
        $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>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # activate parameter overloading
    'nextpagelink' => __('Next'),
    'previouspagelink' => __('Previous'),
    'pagelink' => '%',
    'echo' => 1 )
);

Если ваша тема всегда использует ссылки prev и next, вы могли бы немного изменить функцию, чтобы она использовалась в качестве поведения по умолчанию при каждом использовании number(по умолчанию), поэтому вам нужно меньше писать в своих темах.

Это немного другая реализация, предложенная Velvet Blues .

hakre
источник
За исключением нескольких комментариев и ранних возвратов, реализация, имя опции и объяснение точно такие же, как у меня. Я что-то пропускаю? Какую пользу дает ваше решение? Благодарю.
Бархатный блюз
Вероятно, когда я сравниваю код.
Хакре
Решение Хакре так же доступно, пока вопрос здесь. Полные ответы (= понятные, не полагаясь на внешние источники) всегда предпочтительнее в StackExchange.
fuxia
6

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

При этом есть три способа сделать это без плагина:

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

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

WordPress Hack: отображение номера и следующих / предыдущих ссылок с помощью wp_link_pages ()

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

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

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
Тарек
источник
как мы можем управлять? wordpress.org/support/topic/… или как добавить динамический заголовок перед номером страницы.
Рави Патель
1

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

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

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Pages',
    'after'            => '</span>',
    'nextpagelink'     => __('Next'),
    'previouspagelink' => __('Previous')
); 

wp_link_pages($args);
?> 

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

Мат_
источник
По какой-то причине это не работает, но мне это кажется правильным. Интересно, было ли изменение в 3.3 или мне нужно вставить что-то в functions.php?
AndrettiMilas
2
Да , я попытался это слишком, это работает , когда вы установите next_or_numberна next. Но он показывает только ссылки «Далее» и «Предыдущие», а не цифры!
Рутвик Гангурде
1
Мне нужны оба, как показано в примере.
AndrettiMilas
1

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

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Next page'),
    'previouspagelink' => __('Previous page'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
Кайо Алвес
источник
Этот код не работает.
AndrettiMilas
Код исправлен. Сожалею. Некоторые атрибуты не имеют значения.
Кайо Алвес
1
Это не дает результатов, которые я искал в своем вопросе, это просто показывает цифры.
AndrettiMilas
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; '.__( 'Prev', 'your_textdomain' )
        ,'next_text' => __( 'Next', 'your_textdomain' ).' &raquo;'

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

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

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
кайзер
источник