Ordenar get_terms por meta de término
Tengo una taxonomía personalizada llamada prod-cat
Quiero ordenar la salida en la plantilla por número, así que agregué un term_meta a la taxonomía de esta manera:
add_action( 'prod-cat_add_form_fields', 'add_feature_group_field', 10, 2 );
function add_feature_group_field($taxonomy) {
?>
<div class="form-field term-order-wrap">
<label for="term-order">Orden</label>
<input type="text" name="wm-cat-prod-order" />
</div>
<?php
}
Y luego:
add_action( 'created_prod-cat', 'save_feature_meta', 10, 2 );
function save_feature_meta( $term_id, $tt_id ){
if( isset( $_POST['wm-cat-prod-order'] ) && '' !== $_POST['wm-cat-prod-order'] ){
add_term_meta( $term_id, 'wm-cat-prod-order', $_POST['wm-cat-prod-order'], true );
}
}
Tengo el term_meta funcionando, se está guardando. Luego en la plantilla hago esto:
$args = array(
'taxonomy' => 'categoria-de-productos',
'orderby' => 'wm-cat-prod-order',
'order' => 'ASC',
'hide_empty' => false,
'hierarchical' => false,
'parent' => 0,
);
$terms = get_terms( $args );
Pero no puedo hacer que se ordene por el meta "wm-cat-prod-order". ¿Alguien puede ayudar con esto? Gracias

get_terms
soporta un meta_query
que llama a un nuevo parámetro WP_Meta_Query como puedes ver aquí. Para consultar tus términos con los meta datos deseados, podrías cambiar tu llamada de función a algo como esto:
$args = array(
'taxonomy' => 'categoria-de-productos',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'hide_empty' => false,
'hierarchical' => false,
'parent' => 0,
'meta_query' => [[
'key' => 'wm-cat-prod-order',
'type' => 'NUMERIC',
]],
);
$terms = get_terms( $args );
Este código no ha sido probado y puede necesitar cambios en tu ejemplo. Pero los enlaces deberían guiarte hacia la solución.

$args = array(
'taxonomy' => 'MY_TAX', // Taxonomía a consultar
'meta_key' => 'ordem', // Clave meta para ordenar
'meta_compare' => 'NUMERIC', // Comparación numérica
'orderby' => 'meta_value_num', // Ordenar por valor numérico
'order' => 'ASC', // Orden ascendente
'hide_empty' => false, // Mostrar términos aunque estén vacíos
);
// Realizar la consulta de términos
$the_query = new WP_Term_Query($args);
// Recorrer los términos obtenidos
foreach ( $the_query->get_terms() as $term )
{
...
}

También tuve problemas con esto y creé mi campo meta con ACF. Esto es lo que hice para que funcione (eliminé algunas propiedades para abreviar):
$args = array(
'taxonomy' => 'categoria-de-productos',
'order' => 'ASC',
'orderby' => 'meta_value_num',//Tratar el valor meta como numérico
'meta_key' => 'wm-cat-prod-order'//Clave meta
);
$terms_query = new WP_Term_Query( $args );
if( ! empty( $terms_query->terms ) ) {
foreach( $terms_query->terms as $term ) {
//Hacer algo, $term es un objeto WP_Term
}
}
Una de las cosas que suelo hacer es definir un respaldo, como 'meta_value_num term_id'
para usar term_id
si los valores de wm-cat-prod-order
son todos iguales, pero esto lo rompió por completo y produjo resultados inesperados. Solo funcionó si 'meta_value_num'
era el único valor para orderby
.

Para mí, creé una taxonomía personalizada y en esa taxonomía personalizada tenía un meta personalizado. Quería tener en el backend de administración una columna y hacerla ordenable. Para que el ordenamiento funcione para un meta personalizado en una taxonomía personalizada, hice esto:
public function pre_get_terms( $query ) {
$meta_query_args = array(
'relation' => 'AND', // Opcional, por defecto es "AND"
array(
'key' => 'order_index',
'value' => 0,
'compare' => '>='
)
);
$meta_query = new WP_Meta_Query( $meta_query_args );
$query->meta_query = $meta_query;
$query->orderby = 'position_clause';
}
Encontré la respuesta en este enlace https://core.trac.wordpress.org/ticket/34996
Solo tuve que adaptar la respuesta proporcionada en los comentarios por @eherman24
