Hacer ordenable una columna personalizada

6 feb 2018, 21:32:52
Vistas: 27.6K
Votos: 17

He agregado una columna personalizada a un tipo de publicación personalizado y funciona bien. Solo quiero ordenar los nombres por título, así que intenté esto:

function sortable_custom_columns( $columns ) {
    $columns['custom_column'] = 'title';
    return $columns;
}
add_filter( 'manage_edit-custom_sortable_columns', 'sortable_custom_columns' );

Sin embargo, esto está devolviendo un orden muy aleatorio. Creo que puede tener que ver con el contenido de la columna, la cual renderizo así:

function location_column_content( $column, $post_id ) {
    switch ( $column ) {
        case 'practice_name':
            $location_post_meta = get_post_meta( $post_id );
            $practice_post_id = $location_post_meta['practice_id'][0];
            echo '<a href="' . get_edit_post_link( $practice_post_id ) . '">' . get_the_title( $practice_post_id ) . '</a>';
            break;
    }

}
add_action( 'manage_sf-location_posts_custom_column', 'location_column_content', 10, 2 );

¿Tiene esto sentido? ¿Alguna sugerencia al respecto? Gracias

2
Comentarios

¿Qué pasa si estoy usando un valor de item? ej. $item->get_meta( '_st_check_in' ); ¿Cómo lo ordenarías?

Daniel Muñoz Daniel Muñoz
9 feb 2021 19:30:21

@DanielMuñoz no publiques una respuesta de comentario como solución a la pregunta. Entiendo que solo tienes 1 punto de reputación y aún no puedes comentar en preguntas de otros usuarios, pero eso no es excusa para spammear el sitio. Si continúas, los sistemas automatizados te marcarán como spammer y te banearán. No pude entender a qué comentario querías responder, así que lo moví a la pregunta misma

Tom J Nowell Tom J Nowell
9 feb 2021 20:03:33
Todas las respuestas a la pregunta 4
5
42

Asegúrate de cambiar MY_POST_TYPE, MY_CUSTOM_COLUMN y MY_META_KEY por los valores reales.

Primero, añade tu columna personalizada. Elimina la columna de fecha y vuelve a establecerla para mantenerla en la última columna. Puedes omitir este paso.

<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
    // guardar la fecha en una variable
    $date = $columns['date'];
    // eliminar la columna 'date'
    unset( $columns['date'] ); 
    // eliminar cualquier columna cuando sea necesario
    // unset( $columns['comments'] );

    // añadir tu columna como nuevo elemento del array y darle un texto de encabezado
    $columns['MY_CUSTOM_COLUMN'] = __('Texto del Encabezado de la Columna Personalizada');

    $columns['date'] = $date; // volver a establecer la columna 'date', después de la columna personalizada

    return $columns;
}
?>

Segundo, haz que tu columna sea ordenable usando el filtro manage_edit-{$post_type}_sortable_columns (aún no documentado).

<?php
function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}
?>

Tercero, llena las celdas de la columna.

<?php
function my_populate_custom_columns( $column, $post_id )
{
    switch ( $column ) {
        case 'MY_CUSTOM_COLUMN':
            echo get_post_meta($post_id, 'MY_META_KEY', true);
            break;
        case 'MAYBE_ANOTHER_CUSTOM_COLUMN':
            // código adicional
            break;
    }
}
?>

Ahora estás listo para ordenar realmente esa columna.

Nota: si no verificas meta_query para valores vacíos (no existentes), tu columna mostrará solo las publicaciones que tengan (valores meta no vacíos) hasta que se ordene por otra columna por defecto o por otra columna.

<?php
function my_sort_custom_column_query( $query )
{
    $orderby = $query->get( 'orderby' );

    if ( 'MY_CUSTOM_COLUMN' == $orderby ) {

        $meta_query = array(
            'relation' => 'OR',
            array(
                'key' => 'MY_META_KEY',
                'compare' => 'NOT EXISTS', // ver nota anterior
            ),
            array(
                'key' => 'MY_META_KEY',
            ),
        );

        $query->set( 'meta_query', $meta_query );
        $query->set( 'orderby', 'meta_value' );
    }
}
?>

Y ahora apliquemos los filtros y acciones. Verifica que no estés en el front-end, en la página correcta y que se haya elegido el tipo de publicación correcto:

<?php
global $pagenow;

if ( is_admin() && 'edit.php' == $pagenow && 'MY_POST_TYPE' == $_GET['post_type'] ) {

    // gestionar columnas
    add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );

    // hacer columnas ordenables
    add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );

    // llenar celdas de columnas
    add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );

    // establecer consulta para ordenar
    add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}

?>
7 feb 2018 15:54:37
Comentarios

Esto sigue funcionando perfectamente hasta el día de hoy.

MattFisch MattFisch
2 feb 2022 16:35:23

manage_edit-{$post_type}_sortable_columns está documentado como manage_{$this->screen->id}_sortable_columns, donde $this->screen->id en este caso se refiere a edit-post, edit-page o edit-<post_type>.

KittMedia KittMedia
6 may 2022 11:19:34

Una alternativa a usar meta_query es simplemente usar $query->set( 'meta_key' , 'MY_META_KEY' );. Esto evitará el problema de exist/not exists.

Jared Jared
21 dic 2022 17:11:24

Si los valores en tu columna personalizada son números, probablemente querrás usar $query->set( 'orderby', 'meta_value_num' ) en lugar de $query->set( 'orderby', 'meta_value' ).

Boycott A.I. Boycott A.I.
8 sept 2023 15:12:34

Consejo: Dentro de la función _sortable_columns, puedes asignar un array con la dirección de orden predeterminada como ['name', false, 'Name'], no solo una cadena, pero no hay documentación sobre esto.

ViliusL ViliusL
3 oct 2023 09:40:36
1

Hacer que las Columnas sean Ordenables

Por defecto, las nuevas columnas personalizadas no son ordenables, lo que dificulta encontrar los datos que necesitas. Para ordenar las columnas personalizadas, WordPress tiene otro filtro llamado manage_edit-post_sortable_columns que puedes usar para asignar qué columnas son ordenables.

Cuando se ejecuta esta acción, la función pasará un parámetro con todas las columnas que actualmente son ordenables. Al añadir tus nuevas columnas personalizadas a esta lista, ahora estas columnas serán ordenables. El valor que asignes a esto se utilizará en la URL para que WordPress entienda por qué columna ordenar.

El siguiente código te permitirá ordenar por la columna personalizada de metadatos.

// Registrar la columna como ordenable
function register_sortable_columns( $columns ) {
    $columns['meta'] = 'Columna Personalizada';
    return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );
22 jun 2021 20:14:09
Comentarios

¡Agradezco el esfuerzo que has puesto en la descripción aquí! Pero la solución tal como está parece reiterar un fragmento de código que ya se menciona en la pregunta como ineficaz para su objetivo.

bosco bosco
22 jun 2021 21:49:27
0

A partir de la versión 6.3.0 de WordPress, el parámetro $sortable_columns ahora es un array multidimensional donde también puedes especificar abreviaciones, texto para orderby y el orden inicial de clasificación. Esto significa que solo necesitas actualizar la función my_set_sortable_columns en el ejemplo de Max Yudin de esto:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}

A esto:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = array(
        'MY_CUSTOM_COLUMN', // Nombre interno del menú, igual que la clave en el array
        false, // Ignorar inicialización del orden por defecto
        __('Texto del Encabezado de Columna Personalizada'), // Nombre corto de columna (abreviatura) para el atributo `abbr`
        __('Tabla ordenada por columna personalizada.') // Cadena traducible de una breve descripción para usar en el orden actual
    );
    return $columns;
}

Si quieres inicializar el orden por defecto de tu columna, simplemente cambia el segundo parámetro de false a true, y añade un 5to parámetro con asc o desc así:

$columns['MY_CUSTOM_COLUMN'] = array(
    'MY_CUSTOM_COLUMN', // Nombre interno del menú, igual que la clave en el array
    true, // Inicializar con mi orden especificado
    __('Texto del Encabezado de Columna Personalizada'), // Nombre corto de columna (abreviatura) para el atributo `abbr`
    __('Tabla ordenada por columna personalizada.'), // Cadena traducible de una breve descripción para usar en el orden actual,
    'asc' // Inicializar en orden ascendente, también puede ser 'desc'
);
31 jul 2024 18:26:18
1
-1

necesitas ordenar la tabla usando pre_get_posts. Buenas instrucciones paso a paso en envato tips

6 feb 2018 22:09:56
Comentarios

¡Este es un buen comentario! La mayoría de las personas necesitarán modificar la consulta principal para lograr el resultado de ordenación deseado. Las respuestas anteriores solo filtran qué columnas SE PERMITEN ordenar (no realizan ninguna lógica de ordenación). ¡Necesitas usar pre_get_posts!

Chad Reitsma Chad Reitsma
3 feb 2025 21:47:32