web-dev-qa-db-fra.com

À l'aide des paramètres d'URL, répertoriez les publications de la taxonomie par catégorie et personnalisée.

Par exemple, http://example.com/?cat=6&tag=books répertorie les publications de la catégorie 6 et étiquetées "livres" (c.-à-d. Les publications qui remplissent les deux conditions).

De même, http://example.com/feed/?cat=6&tag=books fait de même pour les flux.

Maintenant, disons que mon blog a une taxonomie personnalisée appelée "édition", avec les termes "usa", "uk", "chine", etc., en dessous. L'URL http://example.com/?edition=usa,china répertorie les publications appartenant aux deux éditions "usa" et "china".

Et http://example.com/category/cars/?edition=usa répertorie les publications de la catégorie 'Voitures' qui appartiennent également à le terme de taxonomie personnalisé 'usa'.

Le problème

J'utilise le code ci-dessous dans mon functions.php:

add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {

    /* Looks like this line needs to be changed, not sure how */
    if ( $better_editions_query->is_tax( 'edition' ) && $better_editions_query->is_main_query() ) {

        $better_editions_terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $better_editions_query->set( 'post_type', array( 'post' ) );
        $better_editions_query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => $better_editions_terms,
                    'operator' => 'NOT IN'
                )
            )
        );

    }

    return $better_editions_query;
}

Le code permet de s'assurer que si une publication n'est pas attribuée à une Edition (c'est-à-dire si aucune publication n'est affectée à un terme appartenant à la taxonomie personnalisée 'édition'), la publication est affichée/répertoriée sous tous les termes. archives/flux de la taxonomie personnalisée 'édition'.

Désormais, http://example.com/category/cars/?edition=usa répertorie uniquement les publications appartenant à la catégorie 'voitures' et spécifiquement marquées 'usa' (terme appartenant à la taxonomie personnalisée 'édition'). Il ne montre pas les publications qui ne sont assignées à aucun terme dans la taxonomie personnalisée 'édition'. Comment puis-je réparer ça?

( PS: La définition de termes par défaut pour les publications n’est pas une option, nous pourrons ajouter plus d’éditions plus tard.)


Résolu mais ...

J'ai élaboré une solution que vous pouvez considérer comme une réponse à cette question. La prime est toujours là, alors n'hésitez pas. :)

4
its_me

En règle générale, à l'aide de paramètres d'URL, vous pouvez répertorier les publications appartenant à une catégorie spécifique ET à une taxonomie personnalisée, comme suit:

http://example.com/category/cars/?edition=usa

Où, category est la base de catégories que vous utilisez pour les catégories sur votre site (Tableau de bord WordPress> Paramètres> Permaliens> Base de catégories); edition est la base/la limace de la taxonomie douanière; et usa est un terme compris dans la taxonomie douanière.

Si vous souhaitez inclure plus d'une taxonomie de catégorie/personnalisée, voici quelques solutions:

http://example.com/category/cars/?edition=usa,india
http://example.com/?category_name=cars,books&edition=usa,india

Et nourrit:

http://example.com/category/cars/?edition=usa,india&feed=rss2
http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2

Lectures supplémentaires:


MAIS...

Comme expliqué dans ma question, le mien est un cas complexe, j'ai donc développé une solution de contournement simple. Voici...

  1. Le bloc de code de la question s'assure que si un article n'est attribué à aucune édition (c'est-à-dire si aucun article n'appartenant à un terme appartenant à la taxonomie personnalisée "édition"), l'article est affiché/répertorié sous tous les termes archives/les flux de la taxonomie personnalisée 'édition'.

    MAIS MAINTENANT , j'ai supprimé ce code. Ensuite, nous avons créé un nouveau terme sous la taxonomie personnalisée "édition", appelé "intl" (International). Tout article qui veut être affiché sous tous les Editions sera attribué à 'intl'. Mais comment puis-je m'assurer que toutes les publications affectées à 'intl' apparaissent dans toutes les archives/sources de termes de ma taxonomie personnalisée?

    Pour cela, j'utilise maintenant ce code (va dans functions.php):

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

    Ainsi, par exemple, http://example.com/edition/usa/ répertorie les publications appartenant à "usa" ou à "intl" (termes de ma taxonomie personnalisée "édition"). Son flux, http://example.com/edition/usa/feed/, fait de même.

  2. Retour au problème principal de la question. Comment répertorier les publications appartenant à une catégorie spécifique ET à une édition à l'aide de paramètres URL?

    Par exemple, comment répertorier les publications de la catégorie "voitures" ET édition "États-Unis"?

    Voici à quoi devrait ressembler l'URL: http://example.com/category/cars/?edition=usa,intl (étant donné que nous souhaitons également les publications affichées dans toutes les éditions, c.-à-d. Les publications affectées au terme "intl"). En ce qui concerne les flux: http://example.com/category/cars/feed/?edition=india,intl

C'est tout!

(Merci à @kaiser pour son aide.)}


Remarques

Si vous souhaitez strictement modifier la requête/boucle principale directement dans le modèle, par exemple, taxonomy-edition.php (dans mon cas), voici un exemple de la façon dont cela peut être fait:

<?php
$edition_term = get_term( get_queried_object(), 'edition' )->slug;
$better_editions = new WP_Query(
    array(
        'post_type' => 'post',
        'tax_query' => array(
            array(
                'taxonomy' => 'edition',
                'field' => 'slug',
                'terms' => array( $edition_term, 'intl' )
            )
        )
    )
);
?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php if ( $better_editions->have_posts() ) : ?>

    <?php /* Start the Loop */ ?>
    <?php while ( $better_editions->have_posts() ) : $better_editions->the_post(); ?>
        <?php get_template_part( 'content', get_post_format() ); ?>
    <?php endwhile; wp_reset_postdata(); ?>

<?php else : ?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php endif; ?>

Néanmoins, à moins que vous n'ayez vraiment à le faire, utilisez pre_get_posts.

3
its_me