web-dev-qa-db-fra.com

Trier les messages par mots-clés dans les pages de catégorie

Je voudrais trier les messages par balises dans la catégorie et les pages d'archives. (Malheureusement, il n’existe pas de paramètre orderby pour les balises. Cela simplifierait les choses!)

Donc, une page de catégorie serait comme ceci:

Nom de catégorie

  • Poste 1 (étiquette 1)
  • Poste 2 (étiquette 1)
  • Poste 3 (étiquette 1)
  • Poste 4 (tag 2)
  • Poste 5 (étiquette 2)
  • Poste 6 (étiquette 2)
  • Poste 7 (étiquette 3)
  • Poste 8 (étiquette 3)
  • Poste 9 (étiquette 3) ...

Ou encore mieux:

Nom de catégorie

Tag 1

  • Poste 1
  • Poste 2
  • Poste 3

Tag 2

  • Poste 4
  • Poste 5
  • Poste 6

Tag 3

  • Poste 7
  • Poste 8
  • Poste 9 ...

Les balises apparaîtront dans l'ordre alphabétique. Les messages sous les balises apparaîtront également dans l'ordre alphabétique.

Lorsqu'une publication a plus d'une balise, elle doit apparaître plusieurs fois (une pour chaque balise).

Y'a-t'il un quelconque moyen d'y arriver?

Je pensais faire quelque chose comme ceci , mais je ne pouvais pas trouver une solution qui ne montrerait que les posts et les tags de la catégorie. (Le code lié montre toutes les publications et tous les tags.)

Ou peut-être existe-t-il un moyen de traiter les tags comme un meta_value? Ensuite, je pourrais simplement utiliser pre_get_posts comme ceci:

add_action( 'pre_get_posts', 'archive_post_order'); 

function archive_post_order($query){
    if(is_archive()):
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'metakey', 'tag' );
        $query->set( 'order', 'ASC' );
    endif;    
}

Toutes les idées sont les bienvenues. Merci d'avance.

3
Argumentum

Il n’ya vraiment aucun moyen raisonnable d’y parvenir, en particulier si vous avez des publications qui sont attribuées à plusieurs balises (ce qui est presque toujours le cas). Ce qui est très sûr, vous avez du travail à faire pour vous.

Voici quelques idées et idées que vous pouvez poursuivre:

POSTS À TERMES MULTIPLES

Si les publications ont plus d'une balise (ou un terme d'ailleurs) qui leur est attribué, cela signifie qu'il existe plusieurs relations avec une autre publication ou un autre ensemble de publications. Le regroupement de ces publications permet de: ( une). Être impossiblesansduplication, ou (b). Soyez possible,avec _ duplication de posts.

Les termes (tags dans ce cas _) affectés à une publication à partir d'une taxonomie spécifique (post_tag dans ce cas _) sont classés de manière spécifique lorsque plusieurs termes existent. Saisir simplement le premier terme peut ne pas toujours être le terme que vous voudriez utiliser.

Le tri des balises de get_the_tags() (ou la plus générique get_the_terms()) nécessiterait un tri supplémentaire de PHP pour trier le tableau retourné d'objet de balise selon vos besoins, ou vous voudriez utiliser une fonction comme wp_get_post_tags() pour effectuer le tri via SQL, mais cela nécessiterait un appel supplémentaire à la base de données.

Si vous souhaitez trier uniquement par la première balise, il est assez facile de trier le tableau de balises selon la suite ou les besoins. Je posterai un exemple de code plus tard

SOLUTION DE CONTOURNEMENT

Si vous avez des publications avec plusieurs tags, vous devrez trouver une relation unique et spécifique entre les publications et, en conséquence, soit:

  • assignez un champ personnalisé avec une valeur pouvant être triée à un ensemble d'articles, puis utilisez pre_get_posts pour trier vos pages de catégorie en fonction de la valeur du champ personnalisé

  • créez une taxonomie spécifique pour cela, puis attribuez un terme spécial à un ensemble de publications, puis utilisez le filtre the_posts, que je publierai, pour trier le tableau de publications renvoyé.

Si vous ne vous dérangez pas après la duplication, vous jetez un coup d'œil à this post , cela a toutefois été fait pour les champs personnalisés, il vous faudra donc le décomposer et le modifier pour qu'il fonctionne avec les balises, mais en gros, le principe en construisant un tableau multidimensionnel, aplatissez-le plus tard, puis renvoyez un tableau trié avec des messages en double qui restent identiques

POSTS AVEC DES ÉTIQUETTES UNIQUES

Si vos publications ne sont attribuées qu'à une seule balise (ou si vous préférez trier la première balise uniquement), il est assez facile de trier les publications en conséquence à l'aide du filtre the_posts. Vous pouvez alors essayer ce qui suit (UNTESTED et très basique)

add_filter( 'the_posts', function ( $posts, \WP_Query $q )
{
    // Make sure we only target the main query on category pages
    if (    !is_admin()
         && $q->is_main_query()
         && $q->is_category()
    ) {
        // Use usort to sort the posts
        usort( $posts, function( $a, $b )
        {
            return strcasecmp( 
                get_the_tags( $a->ID )[0]->name, 
                get_the_tags( $b->ID )[0]->name 
            );
        });
    }
}, 10, 2 );
2
Pieter Goosen