Il y a une question très semblable à la mienne, qui peut être trouvée ici . La différence avec ma question est la suivante: mon formulaire de recherche figure sur plusieurs pages (page.php
et single.php
) et je n’utilise pas wp-pagenavi. J'ai essayé les solutions suggérées, mais elles n'ont pas fonctionné.
Qu'est-ce qui fonctionne
Ce qui ne fonctionne pas:si je soumets le formulaire et que je clique sur une page autre que la page 1, l'URL devient exemple.com/overview/?paged=2 ou exemple.com/city/boston/. ? paged = 2 mais aucun résultat n'est affiché.
Mis à jour après la réponse acceptée:Veuillez lire les remarques dans le code pour voir comment le problème a été résolu.
--- Ci-dessous, la configuration de mon code
Sur page.php
if(is_page('overview')) {
get_template_part('templates/overview', 'main');
}
Sur single.php (inclure le même fichier)
if(is_singular('cities')) {
get_template_part('templates/overview', 'main');
}
Sur overview-main.php
include_once 'overview-search-input.php';
include_once 'overview-sidebar.php';
Sur overview-search-input.php (modifié après UPDATE 3, code original ci-dessous ici)
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
Sur overview-sidebar.php
<form action="<?php echo get_permalink(); ?>" method="get">
<select name="period" placeholder="Select">
<option value=""></option>
<option value="all"></option>
<option value="upcoming"></option>
</select>
</form>
dans la fonctionsearch_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);
Puis sur overview-main.php
if($query->have_posts()): while ($query->have_posts()): $query->the_post();
// Do stuff
endwhile;
create_pagination($query);
wp_reset_postdata();
endif;
Et dans la fonctioncreate_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' => '<i class="icon-chevron-left"></i>',
'next_text' => '<i class="icon-chevron-right"></i>',
'type' => 'list'
);
return paginate_links($args);
Le problème était:Comme les deux fonctions de pagination fonctionnent et affichent les liens de pagination corrects, je suppose que ce n'est pas le problème. Je pense que cela se trouve dans la requête personnalisée (puisque cette pagination fonctionne sur search.php lorsque les résultats sont générés une fois et ne sont pas modifiés par la saisie de formulaire).
Le problème a été résolu:en utilisant le paramètre 'paged' et en le transmettant à la requête
Il y a des choses qui devraient être changées dans votre code:
$_SESSION
. Donc, n’ajoutez pas session_start n’importe où. Vous pouvez transmettre l'état actuel via la chaîne de requête, en utilisant method="get"
dans votre formulaire.search_v1
en tant qu'argument, de cette façon, vous êtes sûr que ce ne sera pas une erreur.filter_input
overview-search-input.php
, la dernière ligne est $query = search_v1($_SESSION['period']);
qui est complètement inutileAppliquer ces changements:
page.php
et single.php
et rester inchangé.session_start();
de l'endroit où vous avez ajoutéEnsuite
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
<form action="<?php echo get_permalink(); ?>" method="get">
<select name="period" placeholder="Select">
<option <?php selected('', $period) ?>></option>
<option <?php selected('all', $period) ?>>all</option>
<option <?php selected('upcoming', $period) ?>>upcoming</option>
</select>
</form>
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;
Enfin les 2 fonctions, search_v1
et 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' => '<i class="icon-chevron-left"></i>',
'next_text' => '<i class="icon-chevron-right"></i>',
'type' => 'list'
);
return paginate_links($args);
}
Au lieu de cette ligne
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
Pouvez-vous utiliser cela et vérifier.
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
Aussi cette
$query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1;
à
$query->query_vars['page'] > 1 ? $current = $query->query_vars['page'] : $current = 1;
Remarque: Comme vous utilisez des modèles de page personnalisés, "paginé" ne fonctionne pas ici.