Hacer ordenable una columna personalizada
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

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' );
}
?>

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>
.

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

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' )
.

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' );

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'
);

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

¡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!
