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 );
}
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.
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;
}