Postări paginate - cum să folosești numere și linkuri anterioare/următoare?

24 dec. 2011, 21:04:23
Vizualizări: 18.8K
Voturi: 17

Vreau ca wp_link_pages (postări multi-pagina) să afișeze numerele paginilor, cuvântul "anterior" înaintea acestor numere și "următor" după acestea. Ar trebui să arate astfel:

Anterior 1, 2, 3, 4 Următor

Încerc să fac asta fără un plugin. Iată ce am încercat până acum, dar nu funcționează, afișează doar numere.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pagini', 
    'after'  => '</span>',
    'next_or_number'=>'number',
    'previouspagelink' => 'Anterior',
    'nextpagelink'=> 'Următor'
)); ?>
0
Toate răspunsurile la întrebare 6
5
14

Funcția pe care o folosiți, wp_link_pages­Codex, nu are implicit funcționalitatea pe care o căutați.

Totuși, o puteți extinde ușor folosind o funcție callback, înregistrată ca un filtru pe argumentele acelei funcții:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Filtrul va modifica apoi parametrii folosiți în acea funcție din mers și va injecta linkurile lipsă pentru argumentele prev și next, care sunt afișate în stânga și dreapta listei numerotate de linkuri (next_or_number' => 'number'):

/**
 * Adaugă linkuri prev și next la o listă numerotată de pagini
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if ($args['next_or_number'] !== 'next_and_number') 
        return $args; # ieșire anticipată

    $args['next_or_number'] = 'number'; # păstrează numerotarea pentru partea principală
    if (!$more)
        return $args; # ieșire anticipată

    if ($page - 1) # există o pagină anterioară
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page < $numpages) # există o pagină următoare
        $args['after'] = _wp_link_page($page+1)
            . $args['link_before'] . ' ' . $args['nextpagelink'] . $args['link_after'] . '</a>'
            . $args['after']
        ;

    return $args;
}

Utilizare:

wp_link_pages(array(
    'before' => '<p>' . __('Pagini:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # activează supraîncărcarea parametrilor
    'nextpagelink' => __('Următorul'),
    'previouspagelink' => __('Anterior'),
    'pagelink' => '%',
    'echo' => 1 )
);

Dacă tema dvs. folosește întotdeauna linkurile prev și next, atunci ați putea modifica puțin funcția pentru a face acest comportament implicit ori de câte ori este folosit number (valoarea implicită), astfel încât să scrieți mai puțin în temele voastre.

Aceasta este o implementare ușor diferită față de sugestia Velvet Blues.

31 dec. 2011 19:54:21
Comentarii

Cu excepția câtorva comentarii și returnări premature, implementarea, numele opțiunii și explicația sunt exact la fel ca ale mele. Nu cumva omit ceva? Ce beneficiu aduce soluția ta? Mulțumesc.

Velvet Blues Velvet Blues
31 dec. 2011 20:26:19

Probabil când compar codul.

hakre hakre
31 dec. 2011 20:34:55

Soluția lui Hakre este disponibilă atât timp cât întrebarea este aici. Răspunsurile complete (= ușor de înțeles fără a depinde de surse externe) sunt întotdeauna preferate pe StackExchange.

fuxia fuxia
31 dec. 2011 20:40:37

Diferența este că @hakre a introdus o eroare. În această linie de cod: if (!$args['next_or_number'] == 'next_and_number') îi lipsesc parantezele, așa că $args este negat înainte de evaluarea sa logică, ar trebui să fie: if (!($args['next_or_number'] == 'next_and_number')) sau mai bine if($args['next_or_number']!='next_and_number')

deviato deviato
1 apr. 2021 19:53:22

@deviato: mulțumesc pentru observație, adoptat, și cu comparație strictă.

hakre hakre
2 apr. 2021 10:37:05
1

Funcția wp_link_pages() afișează doar fie text, fie numere, niciodată ambele. Dacă analizezi codul funcției, vei observa că nu există nicio opțiune de a-i schimba comportamentul prin transmiterea de parametri.

Cu toate acestea, există trei metode de a realiza acest lucru fără a folosi un plugin:

  1. Creează propria funcție în fișierul functions.php al temei tale. Funcționează, dar vei avea o funcție nouă.
  2. Folosește 2-3 instanțe ale funcției wp_link_pages(). O soluție ineficientă.
  3. Folosește un filtru. Metoda recomandată. Vezi mai jos.

Am scris un articol pe blogul meu despre cum să faci acest lucru. În esență, folosesc filtrul wp_link_pages_args și adaug o funcție în fișierul functions.php care introduce o nouă opțiune 'next_and_number'.

WordPress Hack: Afișează Numere & Linkuri Următor/Anterior cu wp_link_pages()

30 dec. 2011 16:14:22
Comentarii

Super tare... Mă gândeam și eu la ceva folosind cele 4 valori globale, dar nu am reușit să ajung la o soluție... +1!

Rutwick Gangurde Rutwick Gangurde
30 dec. 2011 18:59:58
1

Încearcă asta, poți să o personalizezi mai mult. Dar ar trebui să facă exact ce dorești :-)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
30 dec. 2011 19:01:43
Comentarii

cum putem gestiona? https://wordpress.org/support/topic/how-to-manage-wp_link_pages-number-to-own-custom-url?replies=2

sau cum să adăugăm un titlu dinamic personalizat înaintea numărului de pagină.

Ravi Patel Ravi Patel
7 iul. 2016 14:53:48
3

Nu înțeleg care e problema... Ai vreo eroare?

Ar trebui să funcționeze:

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Pagini',
    'after'            => '</span>',
    'nextpagelink'     => __('Următoarea'),
    'previouspagelink' => __('Precedenta')
); 

wp_link_pages($args);
?> 

Nu este nevoie să adaugi next_or_number deoarece number este deja valoarea implicită.

25 dec. 2011 23:06:46
Comentarii

Din nu știu ce motiv, acest lucru nu funcționează, dar mie mi se pare corect. Mă întreb dacă s-a schimbat ceva în versiunea 3.3 sau dacă trebuie să adaug ceva în fișierul functions.php?

AndrettiMilas AndrettiMilas
28 dec. 2011 16:55:14

Da, am încercat și eu asta, funcționează când setezi next_or_number la next. Dar afișează doar linkurile 'Next' și 'Previous', nu și numerele!

Rutwick Gangurde Rutwick Gangurde
28 dec. 2011 18:53:09

Am nevoie de ambele, așa cum este arătat în exemplu.

AndrettiMilas AndrettiMilas
28 dec. 2011 19:20:06
3

Acest cod se află în bucla de articole? Codarea mi se pare în regulă. Iată exemplul din Codex despre cum să-l folosești:

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Pagini:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Pagina următoare'),
    'previouspagelink' => __('Pagina anterioară'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
28 dec. 2011 17:35:10
Comentarii

Acest cod nu funcționează.

AndrettiMilas AndrettiMilas
28 dec. 2011 19:19:37

Codul a fost reparat. Scuze. Unele atribute nu au o valoare.

Caio Alves Caio Alves
28 dec. 2011 21:41:33

Aceasta nu realizează rezultatele pe care le căutam în întrebarea mea, doar afișează numere.

AndrettiMilas AndrettiMilas
29 dec. 2011 16:07:17
0

Răspunsul este diferit, dar a fost inspirat de @荒野无灯 care a decis să-și șteargă răspunsul. În opinia mea, este cel mai bun, ca soluție cea mai ușoară și flexibilă:

Soluția se bazează pe paginate_links(). Singurul lucru de știut este că base va fi URL-ul de la început, la care se adaugă %_%, care va fi apoi înlocuit cu format. Deci, atâta timp cât folosim get_permalink().'%_%';, știm că vom rămâne în orice caz pe postarea curentă. În interiorul format, # este înlocuit cu numărul paginii:

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>";
}
12 oct. 2012 14:44:09