web-dev-qa-db-fra.com

pre_get_posts avec tax_query provoque un résultat vide

Je dois ajuster la boucle principale pour toutes les pages d'archives de la manière suivante. J'ai enregistré une taxonomie personnalisée "myposttypes". Chaque poste est affecté à exactement un terme de "types de types".

S'il s'agit d'une page d'archives de catégories ou de balises, seules les publications avec "myposttypes-> term1" doivent être incluses dans le résultat de la requête.

S'il s'agit d'une page d'archive de taxonomie personnalisée, seules les publications avec "myposttypes-> term2" doivent être incluses dans le résultat de la requête.

J'ai déjà implémenté le hook pre_get_posts correspondant mais Je ne reçois aucun résultat pour toutes mes pages d'archives. J'ai beaucoup d'articles avec les taxonomies correspondantes dans mon exemple de blog, il devrait donc y avoir des résultats.

Voici mon approche:

function wpmw_adjust_archive_queries( $query ) {
    if ( ! is_admin() && is_archive() && $query->is_main_query() ) {
        if ( is_category() || is_tag() ) $term_slug  = 'term1';
        if ( is_tax( 'beitragsarten', 'news' ) ) $term_slug = 'term2';

        $taxquery = array(
            'tax_query' => array(
                array(
                    'taxonomy' => 'myposttypes',
                    'field'    => 'slug',
                    'terms'    => $term_slug
                ),
            ),
        );

        $query->set( 'tax_query', $taxquery );
    }
}

add_action( 'pre_get_posts', 'wpmw_adjust_archive_queries' );

MISE À JOUR: Voici mon approche ajustée et simplifiée, qui ne fonctionne toujours pas, malheureusement. Je reçois un résultat vide. J'ai var_dump'ed $ query et tax_query semble être ajouté correctement à query_vars.

function wpmw_adjust_archive_queries( $query ) {
    if ( ! is_admin() && $query->is_archive() && $query->is_main_query() ) {

        $tax_query = $query->get( 'tax_query' ) ? : array();

        $tax_query[] = array(
            'taxonomy' => 'myposttypes',
            'field'    => 'slug',
            'terms'    => array( 'term1' ),
            'operator' => 'IN'
        );

        $query->set( 'tax_query', $tax_query );
    }
}

add_action( 'pre_get_posts', 'wpmw_adjust_archive_queries' );

Voici la partie correspondante de $ query

[tax_query] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => myposttypes
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => term1
                                )

                            [operator] => IN
                        )

                )
4
EmWe

Vous utilisez tax_query de manière incorrecte. Jetez un oeil sur Page Codex

tax_query devrait être un tableau pouvant contenir:

  • relation - ce devrait être une chaîne (AND/OR)
  • terme de taxonomie - tableau avec une taxonomie, un champ, des termes, etc. définis.

Dans votre code, votre paramètre tax_query à:

$taxquery = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'myposttypes',
            'field'    => 'slug',
            'terms'    => $term_slug
        ),
     ),
);

Et ça devrait être:

$taxquery = array(
    array(
        'taxonomy' => 'myposttypes',
        'field'    => 'slug',
        'terms'    => $term_slug
    ),
);

post_type est un autre paramètre, vous ne pouvez donc pas le définir dans tax_query.

Mais ... Vous devez quand même faire attention si vous changez tax_query - il peut déjà avoir une valeur. Donc, si vous voulez être respectueux de cela, vous devriez utiliser quelque chose comme ceci:

$tax_query = $query->get( 'tax_query' );
if ( ! is_array( $tax_query ) ) {
    $tax_query = array();
}
$taxquery[] = array(
    'taxonomy' => 'myposttypes',
    'field'    => 'slug',
    'terms'    => $term_slug
);
$query->set( 'tax_query', $taxquery );

De cette façon, vous ajouterez votre requête de taxe aux requêtes déjà existantes sans les remplacer.

2
Krzysiek Dróżdż