web-dev-qa-db-fra.com

Requête définie à l'aide de tax_query avec la relation 'OU' modifie l'objet catégorie?

( Mise à jour:Voir les modifications plus loin.)

Le code:

function itsme_better_editions( $query ) {
    if ( $query->is_category() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post' ) );
        $query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'intl',
                    'operator' => 'IN'
                )
            )
        );
    }
    return $query;
}
add_filter( 'pre_get_posts', 'itsme_better_editions' );

J'utilise cette fonction pour afficher les messages affectés à la catégorie 'International (intl)' dans toutes les catégories, c'est-à-dire dans toutes les archives de catégories.

(Dans mon cas, les catégories représentent les éditions communes à un site d'actualités, par exemple.)

Le problème est, avec la fonction en place, il semble que le terme objet de toutes les archives soit paramétré sur 'International (intl)', que ce soit une archive de catégorie, une archive de balises, une archive de taxonomie personnalisée, etc.

Ainsi, par exemple, si je visite les archives de la catégorie 'UK (uk)', la <?php single_cat_title(); ?> affiche 'International' au lieu de 'UK'. ( NOTE:single_cat_title() est juste un exemple, et un seul des problèmes causés par le changement d'objet term.)

Pourquoi cela arrive-t-il? (Malgré moi, régler 'relation' => 'OR'.) Que dois-je faire pour résoudre ce problème?

PS:Étonnamment, cela fonctionnait (très positif), et je ne sais pas dans quelle version de WordPress cela a fonctionné.

EDIT:Le problème, je viens de me rendre compte, semble être que $tax_query = $query->get( 'tax_query' ); est vide ou pas un tableau. Je ne sais pas vraiment pourquoi cela se produit et ce qui ne va pas dans mon code.

Question connexe:Quand/pourquoi '$query->get( 'tax_query' );' est-il vide?

2
its_me

Le problème est que vous surchargez le tax_query en entier. Lorsque vous accédez aux archives de catégorie du Royaume-Uni, la requête fiscale est configurée pour avoir la même chose que vous avez pour International, mais vous interrogez la requête actuelle. Voici la solution:

...
$tax_query = $query->get('tax_query');
$tax_query['relation'] = 'OR';
// puts the item at the beginning of the array instead of the end.
array_unshift( $tax_query, array(
        'taxonomy' => 'category',
        'field' => 'slug',
        'terms' => 'intl',
        'operator' => 'IN'
    );
$query->set( 'tax_query', $tax_query );
...
1
Eric Holmes