Posty stronicowane - jak korzystać z numerów i następnych / poprzednich linków?

17

Chcę, aby wp_link_pages (posty na wielu stronach) wyświetlały numery stron, słowo „poprzedni” przed tymi liczbami i „następny” po tych liczbach. Wyglądałoby to tak:

Poprzedni 1, 2, 3, 4 Następny

Próbuję to zrobić bez wtyczki. Oto, co próbowałem do tej pory, ale to nie działa, wyświetla tylko liczby.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pages', 
    'after'  => '</span>',
    'next_or_number'=>'number',
    'previouspagelink' => 'previous',
    'nextpagelink'=> 'Next'
)); ?>
AndrettiMilas
źródło

Odpowiedzi:

12

Używana funkcja, wp_link_pagesCodex , nie ma domyślnie szukanej funkcji.

Można go jednak łatwo rozszerzyć za pomocą funkcji zwrotnej, zarejestrowanej jako filtr argumentów funkcji:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Filtr następnie zmodyfikuje parametry używane w tej funkcji w locie i wstrzykuje brakujące linki do argumentów previ, nextktóre są wyprowadzane po lewej i prawej stronie listy linków numerowanych ( 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;
}

Stosowanie:

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 )
);

Jeśli Twój motyw zawsze używa poprzednich i następnych łączy, możesz nieco zmienić funkcję, aby stała się domyślnym zachowaniem za każdym razem, gdy numberużywana jest (domyślna), więc musisz mniej pisać w swoich motywach.

Jest to nieco inna implementacja, jak sugeruje Velvet Blues .

hakre
źródło
Oprócz kilku komentarzy i wczesnych zwrotów implementacja, nazwa opcji i wyjaśnienie są dokładnie takie same jak moje. Czy coś przeoczyłem? Jakie korzyści daje twoje rozwiązanie? Dzięki.
Velvet Blues
Prawdopodobnie kiedy porównam kod.
hakre
Rozwiązanie Hakre jest dostępne, o ile pytanie jest tutaj. Kompletne odpowiedzi (= zrozumiałe bez korzystania z zewnętrznych źródeł) są zawsze preferowane na StackExchange.
fuxia
6

wp_link_pages()Funkcja pokazuje tylko albo tekstu lub liczby, nigdy obu. Jeśli spojrzysz na kod funkcji, zobaczysz, że nie ma opcji, aby zachowywać się inaczej, przekazując parametry.

Biorąc to pod uwagę, istnieją trzy sposoby, aby to zrobić bez wtyczki:

  1. Utwórz własną funkcję w pliku functions.php kompozycji. Działa, ale wtedy miałbyś nową funkcję.
  2. Użyj 2-3 wystąpień wp_link_pages() . Bardzo nieskuteczny hack.
  3. Użyj filtra. Preferowana metoda . Patrz poniżej.

Napisałem artykuł o tym, jak to zrobić na moim blogu. Zasadniczo używam używam filtra wp_link_pages_args i dodaję funkcję w pliku functions.php, która dodaje nową opcję „next_and_number”.

Hack WordPress: Wyświetl numer i następne / poprzednie łącza za pomocą wp_link_pages ()

Velvet Blues
źródło
Cool man ... Myślałem o czymś, co wykorzystuje 4 globalne wartości, ale tak naprawdę nigdy nie znalazłem rozwiązania ... +1!
Rutwick Gangurde,
3

Wypróbuj to, możesz bardziej go dostosować. Ale powinno zrobić tak, jak chcesz :-)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
Tareq
źródło
jak możemy zarządzać? wordpress.org/support/topic/… lub jak dodać dynamiczny niestandardowy tytuł przed numerem strony.
ravi patel
1

Nie rozumiem, na czym polega problem ... Masz jakiś błąd?

To powinno działać:

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

wp_link_pages($args);
?> 

Nie musisz dodawać next_or_number, ponieważ liczba jest już domyślna.

Mata_
źródło
Z jakiegoś powodu to nie działa, ale wydaje mi się właściwe. Zastanawiam się, czy nastąpiła zmiana na 3.3, czy też muszę wkleić coś do funkcji.php?
AndrettiMilas,
2
Tak próbowałem i to, że działa po ustawieniu next_or_numbersię next. Ale pokazuje tylko linki „Następny” i „Poprzedni”, a nie liczby!
Rutwick Gangurde,
1
Potrzebuję obu, jak pokazano w przykładzie.
AndrettiMilas,
1

Ten kod jest na pętli postów? Kodowanie jest dla mnie OK. Oto przykład Kodeksu dotyczący używania:

<?php

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

?>
Caio Alves
źródło
Ten kod nie działa.
AndrettiMilas,
Naprawiono kod. Przepraszam. Niektóre atrybuty są bez wartości.
Caio Alves,
1
To nie osiąga wyników, których szukałem w moim pytaniu, po prostu pokazuje liczby.
AndrettiMilas
0

Odpowiedź jest inna, ale zainspirował się @ 荒野 无 灯, który postanowił usunąć swoją odpowiedź. Imho to najlepsze, jako najłatwiejsze i najbardziej elastyczne rozwiązanie:

Rozwiązanie zależy od paginate_links(). Jedyne, co należy wiedzieć, to to, że baseod początku będzie dodawany URl %_%, który zostanie następnie zastąpiony przez format. Tak długo, jak korzystamy get_permalink().'%_%';, wiemy, że w każdym razie pozostaniemy na bieżącym poście. Wewnątrz formatThe #zostanie zastąpiony numerem strony:

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>";
}
kajzer
źródło