web-dev-qa-db-fra.com

Ajout de variables pour publier une requête

Comment puis-je ajouter des variables personnalisées à la requête wordpress sans avoir à frapper la base de données deux fois. Dans l'exemple ci-dessous, je souhaite ajouter des méta-filtres. Tout ce code fonctionne bien, mais j’ai exécuté query_posts () pour l’exécuter. Je veux pouvoir ajouter à la requête avant son exécution par défaut afin de ne pas interroger deux fois la base de données.

En cela, j'espérais que si je modifiais la requête $ wp_query-> avant qu'elle ne soit exécutée, mes modifications seraient ajoutées à la requête. La requête est en cours de modification, mais pas la sortie. Des idées? Merci.

add_action('pre_get_posts', 'my_custom_query'); 
function my_custom_query(){

if(isset($_SESSION['size']) && $_SESSION['size'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'] );
}

if(isset($_SESSION['gender']) && $_SESSION['gender'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'] );
}


$extraArgs = array(
    'orderby' => 'post-title',
    'paged' => get_query_var('paged')
);


if(!empty($cfilter)){ $extraArgs['meta_query'] = $cfilter; }

global $wp_query;
$wp_query->query = array_merge( $wp_query->query, $extraArgs );

}

1
patnz

Comme dit toscho, vous pouvez modifier la requête dans le hook pre_get_posts. Ce hook obtient l'objet de requête passé sous forme d'argument, vous n'avez donc pas à lire une variable globale.

add_action( 'pre_get_posts', 'wpse12692_pre_get_posts' ); 
function wpse12692_pre_get_posts( &$wp_query )
{
    if( isset( $_SESSION['size'] ) && $_SESSION['size'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_size',
            'value' => $_SESSION['size'],
        );
    }

    if( isset( $_SESSION['gender'] ) && $_SESSION['gender'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_gender',
            'value' => $_SESSION['gender'],
        );
    }

    $wp_query->query_vars['orderby'] = 'post-title';
    // The next line is redundant, get_query_vars reads it from the global $wp_query object
    $wp_query->query_vars['paged'] = get_query_var('paged');
}

Je vois que votre requête dépend de variables de session. Cela peut rendre plus difficile le transfert d'un lien vers une page à quelqu'un d'autre. Avez-vous envisagé de placer ceci dans l'URL et de le lire à partir de là? Vous pouvez le faire en créant des règles de réécriture supplémentaires.

2
Jan Fabry

Accrochez-vous dans l'action 'pre_get_posts'.
Exemple:

add_action( 'pre_get_posts', 'no_sticky_on_front' );

function no_sticky_on_front()
{
    is_front_page() and $GLOBALS['wp_query']->query_vars['ignore_sticky_posts'] = TRUE;
}
3
fuxia