Paginierung der benutzerdefinierten Abfrageformularvorlage

Es gibt eine Frage, die meiner sehr ähnlich ist und die hier zu finden ist . Der Unterschied zu meiner Frage ist: mein Suchformular befindet sich auf mehreren Seiten ( page.php und single.php ) und ich verwende kein wp-pagenavi. Ich habe die vorgeschlagenen Lösungen ausprobiert, aber sie haben nicht funktioniert.

Was funktioniert?

  • Die Abfrage zeigt die richtigen Ergebnisse an
  • Die Abfrage zeigt nach der Formularübermittlung die richtigen Ergebnisse an
  • Paginierung zeigt mit den richtigen Links (zB example.com/overview/?paged=2 und example.com/city/boston/?paged=2)
  • Die Paginierung mit den gleichen Einstellungen funktioniert in search.php

Was funktioniert nicht: Wenn ich das Formular abschicke und auf eine Seite klicke, außer auf Seite 1, wird die URL zu example.com/overview/?paged=2 oder example.com/city/boston/?paged=2, aber es werden keine Ergebnisse angezeigt .

Nach der akzeptierten Antwort aktualisiert: Bitte lesen Sie die Hinweise im Code, um zu sehen, wie das Problem getriggers wurde.

— Hier unten das Setup meines Codes

Auf Seite.php

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

Auf single.php (schließen Sie die gleiche Datei ein)

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

Auf der Übersicht-main.php

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

Auf overview-search-input.php (geändert nach UPDATE 3, Originalcode hier unten)

  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 

Auf Übersicht-sidebar.php

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

in der function 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); 

Dann auf overview-main.php

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

Und in der function 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); 

Das Problem war: Da beide Paginierungsfunktionen funktionieren und die korrekten Paginierungslinks anzeigen, nehme ich an, dass das nicht das Problem ist. Ich denke, es liegt in der benutzerdefinierten Abfrage (da diese Seitennummerierung in search.php funktioniert, wenn die Ergebnisse einmal generiert und nicht durch Formulareingabe geändert werden).

Das Problem wurde getriggers: durch Verwendung des Parameters ‘paged’ und Übergabe an die Abfrage

Solutions Collecting From Web of "Paginierung der benutzerdefinierten Abfrageformularvorlage"

Es gibt einige Dinge, die in Ihrem Code geändert werden sollten:

  1. Bitte benutze keine $_SESSION Sachen. Fügen Sie also session_start nicht überall hinzu. Sie können den aktuellen Status über die Abfragezeichenfolge übergeben, indem Sie method="get" in Ihrem Formular verwenden.
  2. Für einen besseren Ablauf können Sie die aktuelle Seite als Argument an search_v1 function search_v1 diese Weise werden Sie sicher keine Fehler sein
  3. Wenn Sie auf das Superglobal- Array zugreifen müssen , müssen Sie nicht mehr direkt auf filter_input filter_input
  4. in der Datei overview-search-input.php ist die letzte Zeile $query = search_v1($_SESSION['period']); das ist völlig nutzlos
  5. Ich denke, es ist nützlich in der Form wählen Sie die Option Zeitraum der aktuell angezeigten Beiträge, zB wenn Sie Beiträge für die Periode ‘anstehende’ sehen, in dem Formular sollte die Option ‘anstehende’ ausgewählt werden.

Anwenden dieser Änderungen:

  • page.php und single.php und bleiben unverändert.
  • entferne session_start(); von wo du hinzugefügt hast

Dann

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; 

Abschließend die 2 functionen search_v1 und 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); } 

Anstelle dieser Linie

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

Kannst du das verwenden und überprüfen?

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

Auch das

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

zu

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

Hinweis: Da Sie benutzerdefinierte Seitenvorlagen verwenden, funktioniert “paged” dort nicht.