Ordenar get_terms por meta de término

22 nov 2016, 04:55:29
Vistas: 32.4K
Votos: 10

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

0
Todas las respuestas a la pregunta 4
3
18

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.

22 nov 2016 11:45:33
Comentarios

Esto no funciona en categorías + ACF

vladkras vladkras
30 may 2017 07:56:49

¿Qué es exactamente lo que quieres lograr @vladkras?

Fabian Marz Fabian Marz
30 may 2017 11:34:12

También puedes negar la parte de meta_query de tus argumentos simplemente añadiendo 'meta_key'=>'wm-cat-prod-order' mientras te aseguras de mantener la parte 'orderby' => 'meta_value_num'

Frits Frits
3 dic 2019 09:43:09
2
$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 )
{
    ...
}
29 ago 2018 20:12:01
Comentarios

Por favor [edita] tu respuesta y añade una explicación: ¿por qué podría eso resolver el problema?

fuxia fuxia
29 ago 2018 20:46:48

Esto funciona con custom post types y es la solución simple, solo cambia el meta_key igual que field_name (nota que este es un número)

User User
3 feb 2019 11:53:04
0

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.

14 ago 2020 00:51:29
0

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:

https://pastebin.com/vr2sCKzX

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

10 nov 2017 16:20:34