De ce nu funcționează wp-pagenavi pe o interogare personalizată construită pe baza unui formular?

2 iul. 2012, 16:27:53
Vizualizări: 13.6K
Voturi: 5

Am postat această problemă și pe forumurile de suport WordPress, pentru pluginul wp-pagenavi al lui scribu:

http://wordpress.org/support/topic/plugin-wp-pagenavi-custom-query-form-submit-part-2?replies=1

Situația mea:

Folosesc un formular pentru a crea o interogare personalizată care afișează postări dintr-o arhivă de tip custom post type care au o anumită valoare pentru câmpul personalizat (De ex: Pentru "custom-post-type" afișează doar postările care au valoarea "custom-field" selectată în formular). Da, știm, se numește filtrare :P

Arhiva mea de custom post type arată astfel:

www.example.com/custom-post-type-archive

(folosesc setarea "post name" pentru permalinkuri)

După trimiterea formularului, URL-ul devine:

www.example.com/custom-post-type-archive?key=value

Interogarea personalizată este setată să afișeze doar postările cu valoarea value pentru câmpul personalizat key:

$value = $_GET['value'];
$paged = get_query_var('page');
$args = array(
        'post_type' => 'custom-post-type',
        'meta_key' => 'key',
        'meta_value' => $value,
        'paged' => $paged,
        'posts_per_page' => 10
);
$my_query = new WP_Query($args);

După loop am:

wp_pagenavi(array('query' => $my_query));
wp_reset_postdata();

Interogarea funcționează, primesc rezultatele corecte. Dar am probleme cu paginarea. Când merg la pagina următoare, primesc acest URL:

www.example.com/custom-post-type-archive/page/2?key=value

dar paginarea încă arată ca și cum aș fi pe prima pagină și rezultatele sunt aceleași.

Dacă introduc manual:

www.example.com/custom-post-type-archive?key=value&page=2

Primesc rezultatele corecte (de la pagina 2), dar toate linkurile de navigație sunt la fel ca URL-ul introdus manual mai sus.

Vă rog ajutați-mă (sugestii, resurse, orice).

Mulțumesc, Radu

4
Comentarii

Am și eu o problemă similară, ai găsit deja soluția? Poți să o împărtășești aici?

dev-jim dev-jim
24 oct. 2012 17:21:28

Există vreo soluție pentru aceasta?

p.a. p.a.
5 nov. 2012 19:45:35

@p.a, @tc.k, am rezolvat problema folosind parametrul paged (în loc de page) în get_query_var și implementând paginarea ajax exact cum a menționat @swtshweta. Cred că ar fi funcționat chiar și fără ajax.

rereradu rereradu
6 nov. 2012 21:03:34

Da, soluția este cu siguranță să folosești paged în loc de page ca parametru (eu folosesc WP 3.3.2 și WP-pagenavi 2.82). Funcționează fără paginare Ajax, deși folosirea acelei tehnici arată minunat :)

rereradu rereradu
6 nov. 2012 21:10:28
Toate răspunsurile la întrebare 6
0

Poți încerca să implementezi paginarea bazată pe AJAX pentru plugin-ul wp-pagenavi (vezi http://wordpressapi.com/2011/05/16/add-ajax-pagination-in-wordpress-blog/ pentru referință). Cred că asta va rezolva problema ta.

6 nov. 2012 11:03:33
0

Deoarece acest subiect apare în căutări, aș dori să menționez că WP Page Navi (începând cu versiunea 2.74) acum suportă interogări personalizate.

FAQ-ul WP_Pagenavi trimite la următorul articol care explică cum să folosești pluginul Pagenavi cu o interogare secundară prin transmiterea funcției wp_pagenavi() a unui parametru de interogare.

Din tutorial:

$my_query = new WP_Query();

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
    // mai multe elemente aici
endwhile;

wp_pagenavi( array( 'query' => $my_query ) );

wp_reset_postdata();    // evită erori mai departe în pagină
27 oct. 2013 16:39:44
0

Probabil problema a fost deja rezolvată aici: https://stackoverflow.com/a/13216165/1801379

De asemenea, poți obține câteva idei de aici: https://wordpress.stackexchange.com/a/4131/23290

6 nov. 2012 10:25:58
0

Iată soluțiile pe care le-am găsit (folosesc WP 3.3.2 și WP-Pagenavi 2.82):

Soluția 1: Folosirea parametrului paged în loc de page pentru get_query_var.

Soluția 2: Folosirea navigării bazate pe Ajax, așa cum este descris în articolul menționat de swtshweta. (folosind Ajax, paginarea funcționează corect chiar și cu parametrul page).

6 nov. 2012 22:08:54
2

În mod ciudat, răspunsul propus nu afișează nimic în browserul meu. Am cea mai recentă versiune de WordPress și cea mai recentă versiune de Chrome. Oricum, mulțumesc.

Deși wp_pagenavi apare corect, iar link-urile afișează /page2/, /page3/ și așa mai departe, și am adăugat atributul $paged sau $page la wp_query-ul meu, întotdeauna apare prima pagină.

7 nov. 2012 10:06:44
Comentarii

apelezi corect funcția wp_pagenavi: wp_pagenavi(array('query' => $your_custom_query)); ?

rereradu rereradu
7 nov. 2012 16:07:09

Am încercat ambele variante dar niciuna nu a funcționat. Am realizat că variabila $paged este întotdeauna trimisă goală.

p.a. p.a.
12 nov. 2012 09:39:14
1

Radu, Următoarea soluție a funcționat pentru mine: Am modificat un cod standard de paginare și l-am făcut să trimită "&page=xxx" și am capturat variabila $page din trimiterea formularului. Acum funcționează perfect.

Observă ultima linie, acolo s-au făcut modificările.

global $paged;
$paged = ($_GET["page"]) ? ($_GET["page"]) : 1; //aici captez pagina solicitată

function pagenavi( $found_posts, $p = 2 ) { // pagini afișate înainte și după pagina curentă
  if ( is_singular() ) return; // nu afișa în pagini unice
  global $paged;
  $max_page =  intval($found_posts / 10) + 1;
  echo('max_page=' . $max_page);
  if ( $max_page == 1 ) return; // nu afișa când există o singură pagină
  if ( empty( $paged ) ) $paged = 1;
  echo '<span class="pages">Pagina: ' . $paged . ' din ' . $max_page . ' <BR></span> '; // pagini
  if ( $paged > $p + 1 ) p_link( 1, 'Prima' );
  if ( $paged > $p + 2 ) echo '... ';
  for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // Pagini din mijloc
    if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
  }
  if ( $paged < $max_page - $p - 1 ) echo '... ';
  if ( $paged < $max_page - $p ) p_link( $max_page, 'Ultima' );
}
 function p_link( $i, $title = '' ) {
  if ( $title == '' ) $title = "Pagina {$i}";
  echo "<a class='page-numbers' href='", esc_html( $_SERVER['REQUEST_URI'] . '&page=' .$i ), "' title='{$title}'>{$i}</a> ";

}

12 nov. 2012 09:45:13
Comentarii

<<Către administratorii stachexchange>> vă rog să considerați răspunsul meu ca răspuns la întrebarea mea din bounty. Soluțiile oferite de membri au fost valoroase, dar nu au funcționat pentru mine, deoarece soluția propusă $paged = get_query_var('page'); a fost întotdeauna GOALĂ pentru sistemul meu. Mulțumesc.

p.a. p.a.
12 nov. 2012 11:15:19