Impaginazione di invio modulo di query personalizzata

C’è una domanda molto simile alla mia, che può essere trovata qui . La differenza con la mia domanda è: il mio modulo di ricerca è su diverse pagine ( page.php e single.php ) e non uso wp-pagenavi. Ho provato le soluzioni suggerite pubblicate lì ma non hanno funzionato.

Cosa sta funzionando

  • La query mostra i risultati giusti
  • La query visualizza i risultati corretti dopo l’invio del modulo
  • L’impaginazione mostra i collegamenti corretti (ad esempio example.com/overview/?paged=2 e example.com/city/boston/?paged=2)
  • L’impaginazione con le stesse impostazioni funziona su search.php

Cosa non funziona: se invio il modulo e faccio clic su una pagina qualsiasi tranne la pagina 1, l’URL diventa example.com/overview/?paged=2 o example.com/city/boston/?paged=2 ma non vengono visualizzati risultati .

Aggiornato dopo la risposta accettata: si prega di leggere le note nel codice per vedere come il problema è stato risolto.

— Qui sotto la configurazione del mio codice

A pagina.php

 if(is_page('overview')) { get_template_part('templates/overview', 'main'); } 

Su single.php (includi lo stesso file)

 if(is_singular('cities')) { get_template_part('templates/overview', 'main'); } 

Nella panoramica-main.php

 include_once 'overview-search-input.php'; include_once 'overview-sidebar.php'; 

Su overview-search-input.php (modificato dopo UPDATE 3, codice originale qui sotto)

  if(!empty($_GET['period'])) { $period = $_GET['period']; } else { $period = 'upcoming'; // Set to upcoming if nothing is selected } $query = search_v1($period, $paged); // Passing the $paged parameter in the query $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // The $paged parameter 

Su overview-sidebar.php

 <form action="" method="get">       

nella funzione search_v1 :

  $args = array( 'post_type' => 'events', 'post_status' => 'publish', 'posts_per_page' => 20, 'paged' => $paged, // This was passed into the function 'meta_query' => array($meta_query), // This is generated based on the $period input and it's working (tested) 'meta_key' => 'date_from', 'orderby' => 'meta_value', 'order' => 'ASC', ); return new WP_Query($args); 

Quindi su overview-main.php

  if($query->have_posts()): while ($query->have_posts()): $query->the_post(); // Do stuff endwhile; create_pagination($query); wp_reset_postdata(); endif; 

E nella funzione create_pagination :

 $query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1; $args = array( 'base' => @add_query_arg('paged','%#%'), 'format' => '?paged=%#%', 'total' => $query->max_num_pages, 'current' => $current, 'show_all' => false, 'end_size' => 1, 'mid_size' => 2, 'prev_next' => true, 'prev_text' => '', 'next_text' => '', 'type' => 'list' ); return paginate_links($args); 

Il problema era: poiché entrambe le funzioni di impaginazione funzionano e mostrano i collegamenti di paginazione corretti, presumo che non sia questo il problema. Penso che risieda nella query personalizzata (dal momento che questa impaginazione funziona su search.php quando i risultati vengono generati una volta e non modificati dall’input del modulo).

Il problema è stato risolto: utilizzando il parametro ‘paged’ e passando alla query

Solutions Collecting From Web of "Impaginazione di invio modulo di query personalizzata"

Ci sono alcune cose che dovrebbero essere cambiate nel tuo codice:

  1. Per favore, non usare $_SESSION roba. Quindi non aggiungere session_start ovunque. È ansible passare lo stato corrente tramite la stringa di query, utilizzando method="get" nel modulo.
  2. Per un stream migliore, puoi passare la pagina corrente alla funzione search_v1 come argomento, in questo modo sei sicuro che non saranno errori
  3. Quando devi accedere alla matrice di superglobali, invece di accedere direttamente è necessario ricorrere a filter_input
  4. nel file overview-search-input.php , l’ultima riga è $query = search_v1($_SESSION['period']); è completamente inutile
  5. Penso che sia utile nel modulo selezionare l’opzione periodo dei post mostrati in corso, ad esempio quando si visualizzano i post per il periodo ‘imminente’, nel modulo dovrebbe essere selezionata l’opzione ‘imminente’.

Applicando queste modifiche:

  • page.php e single.php e rimangono invariati.
  • rimuovere session_start(); da dove hai aggiunto

Poi

overview-search-input.php

 < ?php $period = filter_input(INPUT_GET, 'period', FILTER_SANITIZE_STRING); $paged = get_query_var('paged'); if ( empty($period ) ) $period = 'upcoming'; if ( empty($paged) ) $paged = 1; 

overview-sidebar.php

 

overview-main.php

 include_once 'overview-search-input.php'; include_once 'overview-sidebar.php'; $query = search_v1( $period, $paged ); if( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); // Do stuff endwhile; echo create_pagination( $query, $period ); wp_reset_postdata(); endif; 

Infine le 2 funzioni, search_v1 e create_pagination :

 function search_v1( $period = 'upcoming', $paged = 1 ) { if ( empty($paged) ) $paged = 1; $meta_query = array( // create your meta query here ); $args = array( 'post_type' => 'events', 'post_status' => 'publish', 'posts_per_page' => 20, 'paged' => $paged, 'meta_query' => array($meta_query), 'meta_key' => 'date_from', 'orderby' => 'meta_value', 'order' => 'ASC', ); return new WP_Query( $args ); } function create_pagination( $query, $period = 'upcoming' ) { $current = isset($query->query_vars['paged']) ? $query->query_vars['paged'] : 1; $args = array( 'base' => get_permalink() . '%_%', 'format' => '?paged=%#%&period=' . $period, 'total' => $query->max_num_pages, 'current' => ($current > 0) ? $current : 1, 'show_all' => false, 'end_size' => 1, 'mid_size' => 2, 'prev_next' => true, 'prev_text' => '', 'next_text' => '', 'type' => 'list' ); return paginate_links($args); } 

Invece di questa linea

 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 

Puoi usare questo e controllare.

 $paged = (get_query_var('page')) ? get_query_var('page') : 1; 

Anche questo

 $query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1; 

a

 $query->query_vars['page'] > 1 ? $current = $query->query_vars['page'] : $current = 1; 

Nota: poiché si utilizzano modelli di pagina personalizzati, “paginato” non funziona lì.