web-dev-qa-db-fra.com

Ordre des étiquettes, mais pas par ordre alphabétique

J'essaie de comprendre comment organiser les balises sur une publication en utilisant une méthode autre que celle par ordre alphabétique. Par exemple, une publication a les balises suivantes; alpha, beta, charlie. La poste organisera toujours les tags dans cet ordre.

J'aimerais contrôler la manière dont les tags sont affichés sur un post. Au lieu de par ordre alphabétique, j'aimerais commander les étiquettes de poste en fonction de l'ordre dans lequel elles ont été ajoutées. Par exemple; alpha (entrée2e), beta (entrée1e), charlie (entrée3e) serait ajouté à un message, mais les tags seraient listés dans cet ordre naturellement, alpha, beta, charlie. Je voudrais qu'ils soient affichés dans cet ordre; beta, alpha, charlie

Est-ce possible? Si oui, pouvez-vous me diriger s'il vous plaît?

6
Mr. B

Une façon de le faire est de stocker l'ordre des balises sous forme de métadonnées, en utilisant l'action set_object_terms qui passe les balises dans l'ordre d'affichage, par exemple dans votre "functions.php":

// Called in admin on updating terms - update our order meta.
add_action( 'set_object_terms', function ( $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ) {
    if ( $taxonomy != 'post_tag' ) {
        return;
    }
    // Save in comma-separated string format - may be useful for MySQL sorting via FIND_IN_SET().
    update_post_meta( $object_id, '_tt_ids_order', implode( ',', $tt_ids ) );
}, 10, 6 );

// Reorder terms using our order meta.
function wpse174453_get_the_terms( $terms, $post_id, $taxonomy ) {
    if ( $taxonomy != 'post_tag' || ! $terms ) {
        return $terms;
    }
    if ( $ids = get_post_meta( $post_id, '_tt_ids_order', true ) ) {
        $ret = $term_idxs = array();
        // Map term_ids to term_taxonomy_ids.
        foreach ( $terms as $term_id => $term ) {
            $term_idxs[$term->term_taxonomy_id] = $term_id;
        }
        // Order by term_taxonomy_ids order meta data.
        foreach ( explode( ',', $ids ) as $id ) {
            if ( isset( $term_idxs[$id] ) ) {
                $ret[] = $terms[$term_idxs[$id]];
                unset($term_idxs[$id]);
            }
        }
        // In case our meta data is lacking.
        foreach ( $term_idxs as $term_id ) {
            $ret[] = $terms[$term_id];
        }
        return $ret;
    }
    return $terms;
}

// Called in front-end via the_tags() or related variations of.
add_filter( 'get_the_terms', 'wpse174453_get_the_terms', 10, 3 );

// Called on admin edit.
add_filter( 'terms_to_edit', function ( $terms_to_edit, $taxonomy ) {
    global $post;
    if ( ! isset( $post->ID ) || $taxonomy != 'post_tag' || ! $terms_to_edit ) {
        return $terms_to_edit;
    }
    // Ignore passed in term names and use cache just added by terms_to_edit().
    if ( $terms = get_object_term_cache( $post->ID, $taxonomy ) ) {
        $terms = wpse174453_get_the_terms( $terms, $post->ID, $taxonomy );
        $term_names = array();
        foreach ( $terms as $term ) {
            $term_names[] = $term->name;
        }
        $terms_to_edit = esc_attr( join( ',', $term_names ) );
    }
    return $terms_to_edit;
}, 10, 2 );
4
bonger