Ordenar términos en tax_query de WP_Query (Cómo definir el orden en consultas de WordPress)
Estoy intentando averiguar cómo puedo definir el orden de los términos en mi WP_QUERY.
Estoy creando una base de conocimiento. Tengo un CPT llamado knowledge-base y una taxonomía llamada topics.
Mi código muestra todos los términos de la taxonomía y luego recorre 4 posts que tienen la meta key top_four_num, para mostrar las cuatro preguntas principales del tema. Luego tengo un loop anidado para el resto de posts en ese tema. Estos están ocultos con JQUERY, el usuario hace clic en un enlace 'mostrar todo' para revelarlos.
Todo funciona como quiero, pero no puedo averiguar cómo cambiar el orden de los términos. Actualmente aparecen en orden alfabético.
He revisado el codex y tax_query no tiene parámetros basados en orden. ¿Alguien puede indicarme la dirección correcta para poder controlar el orden de tax_query?
Mi código está abajo. ¡Cualquier ayuda es muy apreciada!
<?php
/**
* Base de Conocimiento
*/
// Incluir el header
get_header();
//* Personalizar texto del cuadro de búsqueda
add_filter( 'genesis_search_text', 'sp_search_text' );
function sp_search_text( $text ) {
return esc_attr( 'Haznos una pregunta...' );
}
// Eliminar div.wrap de div.site-inner
add_filter( 'genesis_structural_wrap-site-inner', '__return_empty_string' );
//* Añadir clase personalizada al body
add_filter( 'body_class', 'sp_body_class' );
function sp_body_class( $classes ) {
$classes[] = 'KB';
return $classes;
} ?>
<style>.site-inner {
max-width: none!important;
padding-top: 0;
} </style>
<!-- Banner Superior -->
<div style = "text-align: center; " class = "top-banner">
<h1 style = "color: white;">Base de conocimiento</h1>
<?php get_search_form(); ?>
</div>
<!--clase body-->
<div class = "body-kb">
<?php
// Iniciar loop principal de temas
$_terms = get_terms( array('topic') );
foreach ($_terms as $term) :
$ids = get_field('top_four', false, false);
$term_slug = $term->slug;
$_first = new WP_Query( array(
'post_type' => 'knowledge-base',
'order' => 'ASC',
'orderby' => 'meta_value_num',
'meta_key' => 'top_four_num',
'posts_per_page' => -4,
'tax_query' => array(
array(
'taxonomy' => 'topic',
'field' => 'slug',
'terms' => $term_slug,
),
),
));
if( $_first->have_posts() ) :
?> <div class = "container1"><?php
//Mostrar nombre del término
echo '<div class = "term-name"><h2>'. $term->name .'</h2></div>';
echo '<hr id="short-line" align="left" width="100">';
while ( $_first->have_posts() ) : $_first->the_post();
?>
<?php
//Contador para añadir divs a los primeros posts
if( 0 == $_first->current_post ) {
?> <div class = "example-left"> <?php
}?>
<?php if( 2 == $_first->current_post ) {
?> </div> <?php
}?>
<?php if( 2 == $_first->current_post ) {
?> <div class = "example-right"> <?php
}?>
<?php // mostrar la información del post ?>
<div class="answers">
<h4><a href = "<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
<p><?php get_post_meta( get_the_ID(), 'url', true ); ?></p>
</div>
<?php
endwhile;?>
<?php // Iniciar loop secundario de contenido oculto ?>
<?php $term_slug = $term->slug;
$_second = new WP_Query( array(
'post_type' => 'knowledge-base',
'order' => 'ASC',
'posts_per_page' => 10, //importante para evitar límite de memoria
/* 'offset' => 5*/
'meta_key' => 'priority',
'meta_value' => '1',
'meta_compare' => '>=',
'tax_query' => array(
array(
'taxonomy' => 'topic',
'field' => 'slug',
'terms' => $term_slug,
),
),
));
if( $_second->have_posts() ) :
?>
</div>
<!---BOTONES JQUERY PARA OCULTAR/MOSTRAR-->
<div class = "view-more"><a class="arrow-link" data-expand="howitworks-expand">Ver más<img class="main-arrow" src="/wp-content/uploads/arrow@2x-1.png"></a></div>
<div class = "show-content"><?php
$i = 0;
while ( $_second->have_posts() ) : $_second->the_post();
?>
<?php //Mostrar loop oculto en dos columnas automáticamente
if ($i == 0) echo '<div class="one-half first">';
if ($i == (round($_second->post_count / 2))) echo '</div><div class="one-half">';
?> <p class = "rest-of-p sub"><a href = "<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
<p><?php get_post_meta( get_the_ID(), 'url', true ); ?></p><?php
if ($i == round($_second->post_count)) echo '</div>';
$i++;
?>
<?php endwhile;?>
<?PHP wp_reset_postdata(); ?>
</div>
<?php endif;?>
<?PHP //FIN LOOP 2 ?>
<!--fin container-->
</div>
</div><?php
endif;
endforeach;
?>
</div>
<?php
// Incluir footer
get_footer();
?>
De la documentación de get_terms
:
orderby (string)
: Campo(s) para ordenar los términos. Acepta campos de términos ('name', 'slug', 'term_group', 'term_id', 'id', 'description'), 'count' para el conteo de taxonomía de términos, 'include' para coincidir con el 'order' del parámetro $include, 'meta_value', 'meta_value_num', el valor de $meta_key, las claves del array de $meta_query, o 'none' para omitir la cláusula ORDER BY. Por defecto es 'name'.
Ejemplo:
get_terms([
'taxonomy' => 'topic',
'orderby' => 'field',
'order' => 'ASC/DESC',
]);
