tags – Ordenar etiquetas, pero no alfabéticamente

Pregunta:

Estoy tratando de descubrir cómo organizar las etiquetas en una publicación utilizando un método que no sea alfabéticamente. Por ejemplo, una publicación tiene las siguientes etiquetas; alpha , beta , charlie . La publicación siempre organizará las etiquetas en ese orden.

Me gustaría controlar la forma en que se muestran las etiquetas en una publicación. En lugar de ordenar alfabéticamente, me gustaría ordenar las etiquetas de publicación por el orden en que se agregaron a la publicación. Por ejemplo; alpha (ingresado2do), beta (ingresado1st), charlie (ingresado3rd) se agregarían a una publicación, pero las etiquetas se enumerarían en este orden, naturalmente, alpha, beta, charlie . Me gustaría que se mostraran en este orden; beta, alpha, charlie

es posible? Si es así, ¿puede indicarme?

Respuesta:

Una forma de hacerlo es almacenar el orden de las etiquetas como metadatos de publicación, usando la acción set_object_terms que pasa las etiquetas en el orden en que aparecen en la edición, por ejemplo, en su "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 );

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım