Hola:
Para facilitar la búsqueda en el listado de "Todas las páginas", me gustaría que las estas también pudieran categorizarse y, evidenteme, que en dicho listado apareciera una columna denominada "Categorías de Páginas" y que dicha columna filtrase, por ejemplo, de la manera en que lo hacen las columna "Título"; es decir, que cuando pinchas en ella alterne entre una ordenación A-Z o Z-A.
Con el siguiente código, he sido capaz de agregar las categorías y que la columna aparezca en "Todas las páginas"; pero no sé cómo proceder para que, además, esa columna actúe como un filtro y funcione como las que vienen ya dispuestas en WordPress.
function agregar_categoria_paginas() { register_taxonomy(
'page_category',
'page',
array(
'label' => __('Categorías de Páginas'),
'hierarchical' => true,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'page-category'),
)
);
}
add_action('init', 'agregar_categoria_paginas');
function agregar_columna_categoria_paginas($columns) {
$columns['page_category'] = __('Categorías de Páginas');
return $columns;
} add_filter('manage_edit-page_columns', 'agregar_columna_categoria_paginas');
// 3. Mostrar las categorías de las páginas en la columna
function mostrar_categoria_paginas_en_columna($column, $post_id) {
if ($column == 'page_category') {
$terms = get_the_terms($post_id, 'page_category');
if ($terms && !is_wp_error($terms)) {
$terms_list = array();
foreach ($terms as $term) {
$terms_list[] = $term->name;
}
echo implode(', ', $terms_list);
} else {
echo 'Sin categoría';
}
}
}
add_action('manage_pages_custom_column', 'mostrar_categoria_paginas_en_columna', 10, 2);
¿Podéis ayudarme?
Muchas gracias y un saludo,
Miguel
Contenido solo visible a usuarios registrados
Hola Miguel
Prueba con esto, elimina el anterior y añade este:
// 1. Registrar la taxonomía personalizada
function agregar_categoria_paginas() {
register_taxonomy(
'page_category',
'page',
array(
'label' => __('Categorías de Páginas'),
'hierarchical' => true,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'page-category'),
)
);
}
add_action('init', 'agregar_categoria_paginas');
// 2. Añadir la columna de Categorías a la tabla de páginas
function agregar_columna_categoria_paginas($columns) {
$columns['page_category'] = __('Categorías de Páginas');
return $columns;
}
add_filter('manage_edit-page_columns', 'agregar_columna_categoria_paginas');
// 3. Mostrar las categorías de las páginas en la columna
function mostrar_categoria_paginas_en_columna($column, $post_id) {
if ($column == 'page_category') {
$terms = get_the_terms($post_id, 'page_category');
if ($terms && !is_wp_error($terms)) {
$terms_list = array();
foreach ($terms as $term) {
$terms_list[] = $term->name;
}
echo implode(', ', $terms_list);
} else {
echo 'Sin categoría';
}
}
}
add_action('manage_pages_custom_column', 'mostrar_categoria_paginas_en_columna', 10, 2);
// 4. Hacer que la columna sea ordenable
function hacer_columna_categoria_ordenable($sortable_columns) {
$sortable_columns['page_category'] = 'page_category';
return $sortable_columns;
}
add_filter('manage_edit-page_sortable_columns', 'hacer_columna_categoria_ordenable');
// 5. Ajustar la consulta para ordenar por el nombre de la categoría
function ordenar_por_categoria_paginas($query) {
if (!is_admin() || !$query->is_main_query()) {
return;
}
if ('page_category' === $query->get('orderby')) {
global $wpdb;
$query->set('orderby', 'meta_value'); // Ordenar por meta temporal
$query->set('meta_query', array(
array(
'key' => '_temp_category_order', // Meta clave temporal para categorías
'compare' => 'EXISTS',
),
));
// Asignar las categorías al volar para ordenar
$post_ids = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'fields' => 'ids',
));
foreach ($post_ids as $post_id) {
$terms = get_the_terms($post_id, 'page_category');
if (!empty($terms) && !is_wp_error($terms)) {
// Tomar la primera categoría y almacenarla en una meta clave temporal
update_post_meta($post_id, '_temp_category_order', $terms[0]->name);
} else {
// Asignar un valor para páginas sin categoría
update_post_meta($post_id, '_temp_category_order', 'ZZZ_Sin_categoria');
}
}
}
}
add_action('pre_get_posts', 'ordenar_por_categoria_paginas');
// 6. Limpieza de la meta temporal después de la carga
function limpiar_meta_temporal() {
$post_ids = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'fields' => 'ids',
));
foreach ($post_ids as $post_id) {
delete_post_meta($post_id, '_temp_category_order');
}
}
add_action('shutdown', 'limpiar_meta_temporal');
Un saludo
¡Funciona a la perfección! Eso era exactamente lo que quería. 👍
Así da gusto. Muchísimas gracias, Pepe.
Hola Miguel.
¡Qué bien! Me alegra mucho que hayas podido resolverlo 😀
Si surge alguna otra duda o consulta, no dudes en contactarnos. Estamos aquí para ayudarte.
Un Saludo