Make your custom column sortable

Hoy vamos a mostrar cómo crear una columna ordenable, que se muestra en el Backend de WordPress. Esto puede ser muy útil para los administradores, por ejemplo, si muestran un valor en una columna y quieren ordenar las entradas en función de ese valor.

Todos estos códigos deben añadirse a functions.php en la carpeta child-tempalte.

En el ejemplo, mostraremos la adición de una columna que nos mostrará directamente en el backend el número de vistas para cada una de nuestras entradas del blog.

Este enfoque es mucho más eficiente que la instalación de un plugin completo para tal detalle. Cada plugin afecta a la velocidad de su sitio web, también estos plugins a menudo incluyen otras características que usted puede o no puede necesitar o querer.

Recuerda que si sólo necesitas una personalización parcial o añadir una pequeña funcionalidad a tu web actual, es mucho mejor escribir el código que instalar un plugin.

Así que empecemos. En primer lugar, tenemos que registrar una nueva columna.

Registrar una columna

Vamos a añadir la columna ‘post_views’con el título ‘Views’, para ver el número de vistas de nuestras entradas del blog.

Lo que podemos hacer de la siguiente manera:

function views_columns( $columns )
{
    $columns['post_views'] = __('Views');
    return $columns;
}

Rellenar la columna con datos

Y tenemos que añadir el contenido para la columna, en nuestro caso los datos serán los meta datos del post: ‘post_views_count’:

function views_data_columns( $column, $post_id )
{
    if($column === 'post_views'){
        echo get_post_meta($post_id, 'post_views_count', true);
    }
}

Hemos almacenado las vistas de los puestos como meta de los mismos, pero sus columnas pueden ser rellenadas con otros datos.

Hacer que una columna sea clasificable

Ahora registramos nuestra columna personalizada como “clasificable”.

function set_sortable_views( $columns )
{
    $columns['post_views']  = 'post_views';
    return $columns;
}

Ordenar los datos

Sin embargo, para que la ordenación funcione, necesitamos crear una función que llame a la base de datos para enviar los datos en forma ordenada.

Si queremos ordenar por un valor meta, o por alguna otra forma que WordPress no entienda automáticamente hay que decirle a qué se refiere ordenando por ‘post_views_count’.

function sort_views_column_query( $query )
{
    $orderby = $query->get( 'orderby' );
    if ( 'post_views' == $orderby ) {

        $meta_query = array(
            'relation' => 'OR',
            array(
                'key' => 'post_views_count',
                'compare' => 'NOT EXISTS', 
            ),
            array(
                'key' => 'post_views_count',
            ),
        );
        $query->set( 'meta_query', $meta_query );
        $query->set( 'orderby', 'meta_value_num' );
    }
}

El filtro pasa un array con los nombres de las columnas ordenables como claves, y lo que hay que ordenar como valor. Más concretamente, los valores dictan cómo se establece el parámetro orderby en la consulta que rellena la tabla. Le dice a WordPress que ordene numéricamente por el valor del meta post_views_count. Si desea ordenar el valor alfabéticamente, utilice meta_value en lugar de meta_value_num.

Filtros y acciones de llamada

Y, por último, añadir las llamadas a esos métodos.

Para decirle a WordPress qué columnas quiere registrar como ordenables con su función, necesita usar este filtro:

manage_{$screen->id}_sortable_column

Para las entradas y las páginas, $screen->id es‘post‘ y‘page‘ respectivamente. En general, para un tipo de puesto con nombre‘mi-tipo-de-puesto‘, es‘mi-tipo-de-puesto‘.

// Add new column
 add_filter( 'manage_post_posts_columns', 'views_columns' );

// Make column sortable
 add_filter( 'manage_edit-post_sortable_columns', 'set_sortable_views' );

// Populate column cells
 add_action( 'manage_post_posts_custom_column', 'views_data_columns', 10, 2 );

// Set query to sort
 add_action( 'pre_get_posts', 'sort_views_column_query' );

Puedes utilizar estas funciones y filtros para añadir una nueva columna al backend de WordPress para cualquier post_type, nuevo o existente.

Número de visitas del artículo del blog de WordPress

Si también desea mostrar el número de vistas de las entradas en el backend, como en el ejemplo, todavía tendrá que añadir nuevos metadatos.

Te mostraremos rápidamente cómo hacerlo, es sólo una función:

Crear nuevos meta_datos

function setPostViews($postID) {
   $count_key = 'post_views_count';
   $count = get_post_meta($postID, $count_key, true);
   if($count==''){
       $count = 0;
       delete_post_meta($postID, $count_key);
       add_post_meta($postID, $count_key, '0');
   }else{
       $count++;
       update_post_meta($postID, $count_key, $count);
   }
}

Y entonces usted tendrá que llamar a esta función en cada artículo, por lo que necesita para editar single.php archivo. Si no lo tienes en la carpeta del tema hijo, cópialo de la carpeta del tema padre y edítalo en la carpeta del tema hijo.

Así que añade esta parte de código a tu archivo single.php, puedes ponerlo en las primeras líneas, justo después de <?php

if( !current_user_can('editor') || !current_user_can('administrator') ) {
    setPostViews(get_the_ID());
}

Como puedes ver he utilizado un código y registro de la vista del post sólo si el usuario que está viendo el artículo no es Administrador de la web o Editor de la web, con este enfoque puedes eliminar las vistas de los miembros de tu equipo, y obtener números más precisos.

Por supuesto, de esta forma obtenemos cifras muy aproximadas, que no se ajustan a los bots, se podría conseguir una mejora aplicando otra condición, es decir, registrando las visualizaciones sólo de los usuarios que pasaron más de 10 segundos en la página, por ejemplo.

Carmen Marín
Editor

Contact us now!

We are at your entire disposal to analyse, define, design, and fully program your website to contribute to give a professional image to your company.

Hire our experts if you need the highest possible quality for the presentation of your company on the Internet. Contact us now!

1 Que vamos a crear
If you want to be contacted by phone,
please make sure your phone number is filled in.
keyboard_arrow_leftVolver
siguientekeyboard_arrow_right

Meet Our Online Marketing Experts

Boost Your Online Sales!

Leave us your email and we’ll show you how to kick-start your online presence!

It's for free!