web-dev-qa-db-fra.com

Filtrage de WP_Query

Je développe un site qui utilise un type de publication personnalisé Artist et je dois interroger toutes les publications de ce type dans un modèle de page. Je dois définir la propriété is_post_type_archive sur true également pour filtrer cette requête à l'aide de la posts_orderby filtre. J'utilise le code suivant, mais il semble que WordPress ignore la troisième ligne:

$args = array('post_type' => 'artist');
$wp_query = new WP_Query( array_merge( $args, array('nopaging' => true) ) );
$wp_query->is_post_type_archive = true;

C'est le filtre:

function artist_posts_orderby( $orderby )
{
    if (is_post_type_archive('artist')) {
        $orderby = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC";
    }
    return $orderby;
}
add_filter('posts_orderby', 'artist_posts_orderby' );

Des idées?

Merci d'avance

1
leemon

J'ai réécrit le code et maintenant ça marche

La boucle:

$args = array('post_type' => 'artist');
$wp_query = new WP_Query( array_merge( $args, array('nopaging' => true) ) );

Le filtre:

function theme_posts_orderby( $orderby, $query )
{
    if ($query->query_vars['post_type'] == 'artist') {
        // order artists by last name
        $orderby = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC";
    }
    return $orderby;
}
add_filter('posts_orderby', 'theme_posts_orderby', 10, 2 );
1
leemon

WP_Query récupère les publications dès leur création (dans le constructeur). Lorsque vous modifiez une propriété, celle-ci est déjà traitée et les résultats sont stockés.

Vous ne devriez probablement pas réutiliser l'objet principal $wp_query et les méthodes globales pour cela non plus.

Votre question ne donne pas assez de détails pour suggérer comment cibler plus précisément la requête en fonction de vos besoins. Cependant, il existe toujours une approche simple: ajoutez votre filtre juste avant la requête et supprimez-le juste après.

0
Rarst