Avisos
Vaciar todo

[Resuelto] Implementar categorías en las páginas sin plugin  

 
Miguel
 Miguel
Usuario activo

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.

Pantallazo 14 11 2024 15.04.44

 

 

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

Respondido : 14/11/2024 2:10 pm
Pepe
 Pepe
Soporte CMS Webempresa Admin

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

Respondido : 14/11/2024 4:04 pm

Miguel
 Miguel
Usuario activo

¡Funciona a la perfección! Eso era exactamente lo que quería. 👍 

 

Así da gusto. Muchísimas gracias, Pepe. 

Respondido : 14/11/2024 4:18 pm
Pepe
 Pepe
Soporte CMS Webempresa Admin

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

Respondido : 14/11/2024 4:29 pm

Cursos Gratuitos WordPress