web-dev-qa-db-fra.com

Comment afficher les tags dans les messages, orderby count (le plus utilisé) pas par ordre alphabétique?

Je voudrais afficher d’abord les balises les plus utilisées sur une seule page, sur une page et sur une page d’accueil.

Par exemple:

J'ai 4 balises- Ball (5 messages), Doll (3 messages), Cat (2 messages), Apple (1 message). Chaque fois que je mets plus d'une balise dans un message, ces balises apparaissent dans l'ordre alphabétique, mais je veux d'abord afficher les balises les plus utilisées.

2
pratikkry

Ceci est possible en obtenant d’abord les données de balises brutes avec get_the_tags() en triant les résultats selon la propriété count de chaque balise avec usort() , puis en les parcourant et en les affichant sous forme de liens:

/*
 * Get array of tags and sort by count.
 */
$tags = get_the_tags();

if ( $tags && ! is_wp_error( $tags ) ) {
    usort( $tags, function( $a, $b ) {
        return $b->count - $a->count; // Swap $a and $b for ascending order.
    } );

    /*
     * Get an HTML link for each tag and put in an array.
     */
    $links = array();

    foreach ( $tags as $tag ) {
        $links[] = '<a href="' . esc_url( get_tag_link( $tag ) ) . '" rel="tag">' . $tag->name . '</a>';
    }

    /*
     * Output links separated by comma.
     */
    echo implode( ', ', $links );
}

Une autre implémentation consiste à créer un wrapper de the_tags(), qui réorganise les balises avec wp_list_sort() via le filtre get_the_terms:

/**
 * Retrieve the tags for a post, ordered by post count.
 *
 * @param string $before Optional. Before list.
 * @param string $sep    Optional. Separate items using this. 
 * @param string $after  Optional. After list.
 */
function the_tags_wpse( $before = null, $sep = ', ', $after = '' ) {
    add_filter( 'get_the_terms', $callback = function( $tags ) {
        return wp_list_sort( $tags, 'count', 'desc' );
    }, 999 );
    the_tags( $before, $sep, $after );
    remove_filter( 'get_the_terms', $callback, 999 );  
}
2
Jacob Peattie