web-dev-qa-db-fra.com

Utilisation de pre_get_posts pour filtrer les publications, problème de pagination

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>
2
ovidiubica

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.

2
Steven Jones