Ordenar columna personalizada por taxonomía en WordPress
Estoy intentando añadir una columna personalizada al listado de entradas de un tipo de contenido personalizado en el panel de administración.
He leído muchas preguntas/respuestas en WPSE, junto con este artículo. Aunque parece que todos quieren consultar por meta clave/valor.
Estoy tratando de añadir un valor de taxonomía (básicamente una categoría) a la tabla de un tipo de contenido personalizado.
Me gustaría que la columna fuera ordenable, pero no entiendo cómo ajustar la consulta.
Añadir el título de la columna.
function mbe_column_titles($columns){
$columns['title'] = 'Pregunta frecuente';
$columns['mbe-faq-category'] = 'Categoría';
return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');
Añadir los valores de las filas.
function mbe_column_rows($column_name, $post_id){
if($column_name == 'mbe-faq-category'){
$categories = wp_get_object_terms($post_id, 'mbe-faq-categories');
$the_category = array();
if($categories){
foreach($categories as $category){
$the_category[] = $category->name;
}
}
echo join(', ', $the_category);
}
}
add_action('manage_mbe-faqs_posts_custom_column', 'mbe_column_rows', 10, 2);
Preparar la clave para ordenar.
function mbe_sortable_columns($columns){
$columns['mbe-faq-category'] = 'mbe-faq-category';
return $columns;
}
add_filter('manage_edit-mbe-faqs_sortable_columns', 'mbe_sortable_columns');
Estoy atascado en cómo ordenar realmente la columna por la Categoría de FAQ. Asumo que esto sería una consulta de taxonomía. Me da vergüenza incluso publicar mi intento de manejar esto, y todo lo que hago parece fallar. Me gustaría usar el filtro pre_get_posts
para manejar esto si es posible.

Para lograr agregar una columna personalizada ordenable a la tabla WP_List_Table
de tu tipo de publicación en el panel de administración de WordPress, necesitarás hacer lo siguiente:
- Reemplaza todas las apariciones de
YOUR-POST-TYPE-NAME
con el nombre real de tu tipo de publicación. - Reemplaza todas las apariciones de
YOUR-TAXONOMY-NAME
con el nombre real de tu taxonomía. - Reemplaza todas las apariciones de
YOUR COLUMN NAME
con el nombre real de tu columna. - Reemplaza todas las apariciones de
YOUR-COLUMN-SLUG
con el slug real de tu columna.
Paso 1
Agregar columnas adicionales a la tabla de administración de WordPress
if(!function_exists('mbe_change_table_column_titles')){
function mbe_change_table_column_titles($columns){
unset($columns['date']);// eliminar temporalmente para colocar la columna personalizada antes de la columna de fecha
$columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
$columns['date'] = 'Fecha';// volver a agregar la columna de fecha
return $columns;
}
add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}
Paso 2
Agregar todos los términos de taxonomía asignados como datos de fila dentro de la columna personalizada de la tabla de administración
if(!function_exists('mbe_change_column_rows')){
function mbe_change_column_rows($column_name, $post_id){
if($column_name == 'YOUR-COLUMN-SLUG'){
echo get_the_term_list($post_id, 'YOUR-TAXONOMY-NAME', '', ', ', '').PHP_EOL;
}
}
add_action('manage_YOUR-POST-TYPE-NAME_posts_custom_column', 'mbe_change_column_rows', 10, 2);
}
Paso 3
Habilitar que la columna personalizada de la tabla de administración sea ordenable
if(!function_exists('mbe_change_sortable_columns')){
function mbe_change_sortable_columns($columns){
$columns['YOUR-COLUMN-SLUG'] = 'YOUR-COLUMN-SLUG';
return $columns;
}
add_filter('manage_edit-YOUR-POST-TYPE-NAME_sortable_columns', 'mbe_change_sortable_columns');
}
Paso 4
Modificar post_clauses
para permitir ordenar columnas personalizadas de la tabla de administración por un término de taxonomía
if(!function_exists('mbe_sort_custom_column')){
function mbe_sort_custom_column($clauses, $wp_query){
global $wpdb;
if(isset($wp_query->query['orderby']) && $wp_query->query['orderby'] == 'YOUR-COLUMN-SLUG'){
$clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= "AND (taxonomy = 'YOUR-TAXONOMY-NAME' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC)";
if(strtoupper($wp_query->get('order')) == 'ASC'){
$clauses['orderby'] .= 'ASC';
} else{
$clauses['orderby'] .= 'DESC';
}
}
return $clauses;
}
add_filter('posts_clauses', 'mbe_sort_custom_column', 10, 2);
}
Paso 5 (BONUS)
Ajustar el ancho de las columnas personalizadas en la tabla de administración de WordPress
if(!function_exists('mbe_print_admin_styles')){
function mbe_print_admin_styles(){
if(!is_admin()){
return false;
}
global $pagenow;
if($pagenow == 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] == 'YOUR-POST-TYPE-NAME'){
echo '
<style type="text/css">
.column-YOUR-COLUMN-SLUG{
width: 10%;
}
</style>
'.PHP_EOL;
}
}
add_action('wp_print_scripts', 'mbe_print_admin_styles');
}
Gracias a @goto10
por preguntar Columnas de administración ordenables, cuando los datos no provienen de post_meta y a @scribu
por publicar Columnas ordenables personalizadas y Columnas de taxonomía ordenables para esta respuesta a la pregunta original Columna de tabla personalizada ordenable por consulta de taxonomía.

Esto se puede hacer mucho más fácilmente con un único filtro:
/**
* Ordenar por Término de Taxonomía
*
* Añadir ordenación por columna para una taxonomía personalizada en la vista de edición de un tipo de contenido personalizado en WordPress.
*
* Nota: Reemplaza los valores {post_type} y {taxonomy} a continuación.
*/
add_filter( 'manage_edit-{post_type}_sortable_columns', function( $sortable_columns ) {
$sortable[ 'taxonomy-{taxonomy}' ] = ['orderby', 'asc'];
return $sortable;
}, 10, 1 );
Reemplaza {post_type}
y {taxonomy}
con el tipo de contenido y la taxonomía con los que estés trabajando. El resultado final será una columna personalizada en tu tipo de contenido personalizado que es ordenable y puede usarse para ordenar los posts en la WP_List_Table
.
