J'essaie de comprendre comment résoudre mon problème de pagination tout en filtrant les publications à la volée.
J'ai une liste déroulante juste au-dessus de l'archive des catégories qui permet à un utilisateur de trier ou de filtrer les publications en fonction de champs personnalisés.
Les messages, filtrez bien sur la première page. Mon problème apparaît à la minute où je filtre les publications dans une page inférieure ou égale à une page, car leur filtrage réduit également le nombre de pages existantes. Cela renvoie une erreur 404 pour moi.
Je me demandais comment modifier ceci pour vérifier également si la page existe , sinon ... retourner à la première page.
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
Mis à jour le code comme demandé:
// ADD SORT QUERY VAR
add_action( 'init', 'sort_rewrite_rules' );
function sort_rewrite_rules() {
// SORT QUERY VAR
add_rewrite_tag( '%sort%', '([^/]+)' );
}
add_action( 'pre_get_posts', 'filter_pre_get_posts',11 );
function filter_pre_get_posts( $query ) {
// DON'T AFFECT WP-ADMIN SCREENS
if ( is_admin() )
return;
// SORT ADS FROM THE MAIN QUERY
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$sort = get_query_var( 'sort' );
if ( $query->is_main_query() && $sort ) {
//EXCLUDE EXPIRED POSTS
if ( 'expired' == $sort ) {
$today = date('Y-m-d H:i:s');
$metaquery = array(
array(
'key' => 'expire_date',
'value' => $today,
'type' => 'DATETIME',
'compare' => '>'
)
);
$query->set( 'meta_query', $metaquery );
$query->set( 'paged', $paged );
}
}
}
<div id="sort">
<form action="" method="GET">
<select name="sort" id="sort-dropdown">
<option value="expired" <?php selected( get_query_var( 'sort' ), 'expired' ); ?>><?php _e( 'Exclude Expired Posts', 'txt' ); ?></option>
</select>
<button type="submit" id="sort-submit">Sort</button>
</form>
</div>
Vous devriez probablement renvoyer l'utilisateur à la première page de résultats après une recherche dans tous les scénarios, pour être cohérent.
Si vous avez besoin de vérifier, vous pouvez utiliser les éléments suivants:
$wp_query->max_num_pages;
Donc, s'il n'y a que 2 pages et que vous êtes à la page 3, vous devez rediriger vos tâches au début.