Clasificación de columnas personalizadas en las páginas de administración de WordPress

4 minutos de lectura

avatar de usuario
Juan Mc Murray

Estoy tratando de ordenar una columna personalizada en la pantalla de edición del administrador. La columna contiene un valor entero (recuento de votos).

Para generar la columna utilizo este código “estándar”:

add_filter( 'manage_edit-entries_sortable_columns', 'cutify_entries_columns_sortable' );
function cutify_entries_columns_sortable( $columns ) 
{
    $columns['entry_vote_count'] = 'entry_vote_count';
    return $columns;
}

add_filter( 'manage_entries_posts_columns', 'cutify_entries_columns_head' );
function cutify_entries_columns_head($defaults) 
{
    unset( $defaults['date'] );
    $defaults['entry_vote_count'] = 'Votes';
    return $defaults;
}

add_action('manage_entries_posts_custom_column', 'cutify_entries_columns_content', 10, 2);
function cutify_entries_columns_content($column_name, $post_ID) 
{
    if ($column_name == 'entry_vote_count') 
    {
        $number = rand(1,1000);

        print intVal($number);
    }
}

El problema es intentar ordenar esta columna. He leído muchas respuestas aquí y en otros sitios y sé cómo ordenar esto si el valor proviene de post_meta, pero como puede ver, en este caso el valor proviene de un valor de retorno de la llamada a la función.

¿Hay alguna forma de ordenar una columna personalizada que no se base en un valor post_meta?

  • Usa estos increíbles complementos wordpress.org/plugins/codepress-admin-columnas

    – Anand Choudhary

    10 de mayo de 2018 a las 6:16

  • ¿Puedes actualizar tu pregunta e incluir el código de cutify-votes/classes/class.API.php? O puede publicarlo en Pastebin.com y agregar el enlace Pegar a su pregunta.

    – Sally C.J.

    13 mayo 2018 a las 11:15

  • Gracias Sally CJ, pero el código de la clase no es relevante. Lo relevante es que se devuelve un valor entero. Actualicé mi ejemplo de código anterior para usar un int aleatorio en lugar de una llamada de función.

    – John Mc Murray

    17 de mayo de 2018 a las 10:13

  • Lo siento, pero ¿estás seguro de que class “no es relevante”? Quiero decir, debe haber un método/function en el class que guarda/actualiza el conteo de votos para publicaciones específicas, ¿verdad? Incluso si el recuento de votos no se guarda en la metatabla de publicaciones.

    – Sally C.J.

    18 de mayo de 2018 a las 4:32

  • @JohnMcMurray, está utilizando la función rand y genera un nuevo número cada vez, por lo que cuando intenta ordenar la columna, la función rand genera un nuevo número, por lo que no le dará un resultado perfecto, por lo que debe almacenar un valor único de votación posterior en la publicación meta entonces funcionará multa.

    – Mukesh Panchal

    18 de mayo de 2018 a las 6:29

avatar de usuario
Anand Choudhary

Registrar una columna Lo primero que necesita para registrar una columna

<?php 
add_action( 'manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2 );
function my_cake_column_content( $column_name, $post_id ) {
    if ( 'slices' != $column_name )
        return;
    //Get number of slices from post meta
    $slices = get_post_meta($post_id, 'slices', true);
    echo intval($slices);
} ?>

Hacer una columna ordenable

<?php 
 add_filter( 'manage_edit-cake_sortable_columns', 
 'my_sortable_cake_column' );
 function my_sortable_cake_column( $columns ) {
 $columns['slices'] = 'slice';

  //To make a column 'un-sortable' remove it from the array
  //unset($columns['date']);

   return $columns;
   } ?>

  • Gracias Anand, pero mi código ya hace eso y menciono que no obtengo el valor de post_meta…

    – John Mc Murray

    10 de mayo de 2018 a las 7:43


  • Hola, Anand, los fragmentos de pila son solo para JS/HTML/CSS, comprueba: fragmentos de código ejecutables en preguntas y respuestas

    – brasofilo

    15 mayo 2018 a las 15:08

La forma más sencilla si no desarrolla un complemento es usar uno existente como Columnas de administración porque te permite realizar varias acciones avanzadas: pedidos, agregar columnas, …

  • Gracias, pero no puedo usar un complemento para esto. La columna no obtiene sus datos de un metacampo, es un valor devuelto entero de una llamada de función. Todos estos complementos dependen de los datos de wordpress incorporados (postmeta, etc.) y eso no es lo que tengo

    – John Mc Murray

    17 de mayo de 2018 a las 10:08

avatar de usuario
Temasfa

Debes agregar personalizado query_orderby a WP_Query cuando wp intenta obtener el orden de las publicaciones por su columna personalizada. como esto:

add_action( 'pre_get_posts', 'my_entry_vote_orderby' );
function my_entry_vote_orderby( $query ) {
    global $wpdb;

    // Only filter in the admin
    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby');

    // Only filter if orderby is set to 'entry_vote_count'
    if( 'entry_vote_count' == $orderby ) {
        // We need the order - default is ASC
        $order = isset( $query->query_vars ) && isset( $query->query_vars[ 'order' ] ) && strcasecmp( $query->query_vars[ 'order' ], 'desc' ) == 0 ? 'DESC' : 'ASC';

        // Order the posts by vote count
        $query->query_orderby = "ORDER BY ( SELECT vote_count FROM {$wpdb->posts} posts WHERE posts.post_type="post" AND posts.post_status="publish" ) {$order}";
    }
}

¿Ha sido útil esta solución?

Clasificación de columnas personalizadas en las páginas de administración de WordPress

4 minutos de lectura

avatar de usuario
Juan Mc Murray

Estoy tratando de ordenar una columna personalizada en la pantalla de edición del administrador. La columna contiene un valor entero (recuento de votos).

Para generar la columna utilizo este código “estándar”:

add_filter( 'manage_edit-entries_sortable_columns', 'cutify_entries_columns_sortable' );
function cutify_entries_columns_sortable( $columns ) 
{
    $columns['entry_vote_count'] = 'entry_vote_count';
    return $columns;
}

add_filter( 'manage_entries_posts_columns', 'cutify_entries_columns_head' );
function cutify_entries_columns_head($defaults) 
{
    unset( $defaults['date'] );
    $defaults['entry_vote_count'] = 'Votes';
    return $defaults;
}

add_action('manage_entries_posts_custom_column', 'cutify_entries_columns_content', 10, 2);
function cutify_entries_columns_content($column_name, $post_ID) 
{
    if ($column_name == 'entry_vote_count') 
    {
        $number = rand(1,1000);

        print intVal($number);
    }
}

El problema es intentar ordenar esta columna. He leído muchas respuestas aquí y en otros sitios y sé cómo ordenar esto si el valor proviene de post_meta, pero como puede ver, en este caso el valor proviene de un valor de retorno de la llamada a la función.

¿Hay alguna forma de ordenar una columna personalizada que no se base en un valor post_meta?

  • Usa estos increíbles complementos wordpress.org/plugins/codepress-admin-columnas

    – Anand Choudhary

    10 de mayo de 2018 a las 6:16

  • ¿Puedes actualizar tu pregunta e incluir el código de cutify-votes/classes/class.API.php? O puede publicarlo en Pastebin.com y agregar el enlace Pegar a su pregunta.

    – Sally C.J.

    13 mayo 2018 a las 11:15

  • Gracias Sally CJ, pero el código de la clase no es relevante. Lo relevante es que se devuelve un valor entero. Actualicé mi ejemplo de código anterior para usar un int aleatorio en lugar de una llamada de función.

    – John Mc Murray

    17 de mayo de 2018 a las 10:13

  • Lo siento, pero ¿estás seguro de que class “no es relevante”? Quiero decir, debe haber un método/function en el class que guarda/actualiza el conteo de votos para publicaciones específicas, ¿verdad? Incluso si el recuento de votos no se guarda en la metatabla de publicaciones.

    – Sally C.J.

    18 de mayo de 2018 a las 4:32

  • @JohnMcMurray, está utilizando la función rand y genera un nuevo número cada vez, por lo que cuando intenta ordenar la columna, la función rand genera un nuevo número, por lo que no le dará un resultado perfecto, por lo que debe almacenar un valor único de votación posterior en la publicación meta entonces funcionará multa.

    – Mukesh Panchal

    18 de mayo de 2018 a las 6:29

avatar de usuario
Anand Choudhary

Registrar una columna Lo primero que necesita para registrar una columna

<?php 
add_action( 'manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2 );
function my_cake_column_content( $column_name, $post_id ) {
    if ( 'slices' != $column_name )
        return;
    //Get number of slices from post meta
    $slices = get_post_meta($post_id, 'slices', true);
    echo intval($slices);
} ?>

Hacer una columna ordenable

<?php 
 add_filter( 'manage_edit-cake_sortable_columns', 
 'my_sortable_cake_column' );
 function my_sortable_cake_column( $columns ) {
 $columns['slices'] = 'slice';

  //To make a column 'un-sortable' remove it from the array
  //unset($columns['date']);

   return $columns;
   } ?>

  • Gracias Anand, pero mi código ya hace eso y menciono que no obtengo el valor de post_meta…

    – John Mc Murray

    10 de mayo de 2018 a las 7:43


  • Hola, Anand, los fragmentos de pila son solo para JS/HTML/CSS, comprueba: fragmentos de código ejecutables en preguntas y respuestas

    – brasofilo

    15 mayo 2018 a las 15:08

La forma más sencilla si no desarrolla un complemento es usar uno existente como Columnas de administración porque te permite realizar varias acciones avanzadas: pedidos, agregar columnas, …

  • Gracias, pero no puedo usar un complemento para esto. La columna no obtiene sus datos de un metacampo, es un valor devuelto entero de una llamada de función. Todos estos complementos dependen de los datos de wordpress incorporados (postmeta, etc.) y eso no es lo que tengo

    – John Mc Murray

    17 de mayo de 2018 a las 10:08

avatar de usuario
Temasfa

Debes agregar personalizado query_orderby a WP_Query cuando wp intenta obtener el orden de las publicaciones por su columna personalizada. como esto:

add_action( 'pre_get_posts', 'my_entry_vote_orderby' );
function my_entry_vote_orderby( $query ) {
    global $wpdb;

    // Only filter in the admin
    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby');

    // Only filter if orderby is set to 'entry_vote_count'
    if( 'entry_vote_count' == $orderby ) {
        // We need the order - default is ASC
        $order = isset( $query->query_vars ) && isset( $query->query_vars[ 'order' ] ) && strcasecmp( $query->query_vars[ 'order' ], 'desc' ) == 0 ? 'DESC' : 'ASC';

        // Order the posts by vote count
        $query->query_orderby = "ORDER BY ( SELECT vote_count FROM {$wpdb->posts} posts WHERE posts.post_type="post" AND posts.post_status="publish" ) {$order}";
    }
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad