Potencia tus Listados de WordPress con un Botón de Exportar CSV

En este artículo vamos a ver como añadir un botón en tus listados de WordPress para exportar los datos en CSV o Excel.
Cómo añadir un botón en los filtros con restrict_manage_posts
Para añadir un botón en los filtros de los listados de WordPress utilizaremos la acción «restrict_manage_posts» siendo el resultado que queremos conseguir lo que se muestra en la imagen.

Para añadirlo en el listado de un Custom Post Type del tipo «orders-custom» insertaremos el siguiente código en functions.php.
<?php
// Añadir el botón al filtro restrict_manage_posts
add_action('restrict_manage_posts', 'bk_add_button_filter');
function bk_add_button_filter() {
// Verificar que estemos en la pantalla de administración adecuada
if (isset($_GET['post_type']) && $_GET['post_type'] == 'orders-custom') {
// Output del HTML del botón
?>
<input type="submit" name="export_csv_orders_custom" class="button" value="Export filter to CSV" />
<?php
}
}
?>
Si necesitas que el botón sea azul, sólo tienes que poner que la clase es «button-primary» en lugar de «button»
Cómo añadir un botón en los filtros con manage_posts_extra_tablenav
La opción anterior funciona perfectamente, pero prefiero poner el botón después del botón del filtro y que llame más la atención. Algo como lo que muestra la imagen.

Para ello, utilizaremos la acción «manage_posts_extra_tablenav» Sólo con sustituir la acción en el código anterior nos serviría.
Vamos a ver otra forma, y así podremos elegir con la que nos sintamos más cómodos. También lo haremos sobre el CPT «orders-custom».
<?php
function bk_add_button_filter( $which ) {
global $typenow;
if ( 'orders-custom' === $typenow && 'top' === $which ) {
?>
<input type="submit" name="export_csv_orders_custom" class="button-primary" value="Export filter to CSV" />
<?php
}
}
add_action( 'manage_posts_extra_tablenav', 'bk_add_button_filter', 20, 1 );
?>
Acción para ejecutar el botón
Antes de pasar a la exportación de Excel, vamos a ver cómo, de una forma sencilla, ejecutar una acción al dar al botón.
Podríamos utilizar la acción «parse_query» si necesitamos usar algún parámetro de la query para ejecutar el código. En este caso comprobaremos si nos llega vía GET el parámetro «export_csv_orders_custom», como muestra le siguiente código:
function bk_action_btn($query) {
if(isset($_GET['export_csv_orders_custom'])) {
// Code ....
}
}
add_action( 'parse_query', 'bk_action_btn' );
La forma mostrada anteriormente, aunque funciona, no es la más recomendable debido a que en una página existen bastantes activadores de esa acción, y en lugar de ejecutar la acción una única vez, se ejecutaría varias veces.
Considero que la forma más adecuada es usar la acción «admin_init» Se ejecutará sólo una vez que es lo que necesitamos.
Lo haríamos de siguiente forma:
// Acción para procesar el botón
add_filter('admin_init', 'bk_button_action');
function bk_button_action() {
global $pagenow;
// Verificar que estemos en la pantalla de administración adecuada y se haya hecho clic en el botón
if (isset($_GET['post_type']) && $_GET['post_type'] == 'orders-custom' && $pagenow == 'edit.php' && isset($_GET['export_csv_orders_custom'])) {
// Realizar la acción que deseas cuando se hace clic en el botón
// Por ejemplo, redirigir a una página personalizada
wp_redirect('https://www.bubuku.com');
exit;
}
return $query;
}
Exportar Custom Post Type a CSV
Cómo sacar los POST de WordPress por mes
Para mostrar los artículos de un mes utilizaremos «WP_Query» con el siguiente código:
$args = array(
'post_type' => 'post',
'posts_per_page' => -1, // Para mostrar todos los posts, utiliza -1
'orderby' => 'date',
'order' => 'DESC',
'date_query' => array(
array(
'year' => 2023, // el año por el que desees obtener los posts
'month' => 6, // el mes por el que desees obtener los posts
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Aquí puedes mostrar la información de cada post, por ejemplo:
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_the_content() . '</p>';
}
} else {
echo 'No se encontraron posts.';
}
wp_reset_postdata();
En el ejemplo anterior, se establece el tipo de post a «post» y se configuran los parámetros para ordenar los posts por fecha en orden descendente. Luego se utiliza el parámetro date_query
para especificar el año y el mes para los cuales deseas obtener los posts.
Dentro del bucle while
puedes utilizar las funciones de WordPress como get_the_title()
y get_the_content()
para mostrar la información de cada post. Puedes personalizar el código según tus necesidades como cambiar el formato de salida, o agregar enlaces a cada post.
Cómo sacar los CPT de WordPress por mes del filtro
Si queremos utilizar el filtro de fecha necesitamos saber qué contenidos se crearon en la fecha que indique el filtro. En la url vemos que figura el parámetro «m» con el formato «YYYYMM».
$args = array(
'post_type' => 'post',
'posts_per_page' => -1, // Para mostrar todos los posts, utiliza -1
);
// Verificar que se haya seleccionado el filtro de fecha y lo añadimos a la consulta
if (isset($_GET['m'])) {
$filter_date = $_GET['m'];
$args['date_query'] = array(
array(
'year' => substr($filter_date, 0, 4),
'month' => substr($filter_date, 4, 2),
),
);
}
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Aquí puedes mostrar la información de cada post, por ejemplo:
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_the_content() . '</p>';
}
} else {
echo 'No se encontraron posts.';
}
wp_reset_postdata();
En este ejemplo he asumido que tienes la fecha en formato «202306» en una variable llamada $fecha. Utilizo la función substr() para extraer los primeros 4 dígitos (año) y los siguientes 2 dígitos (mes) de la variable $fecha , y luego los uso en el parámetro date_query dentro de $args para filtrar los posts por ese año y mes específicos.
Exportar fichero con los datos necesarios.
Ahora que sabemos sacar los datos que necesitamos, vamos a generar el fichero Excel con el siguiente código.
$args = array(
'post_type' => 'orders-custom',
'posts_per_page' => -1,
);
// Verificar que se haya seleccionado el filtro de fecha y lo añadimos a la consulta
if ( isset($_GET['m']) && !empty($_GET['m']) ) {
$filter_date = $_GET['m'];
$args['date_query'] = array(
array(
'year' => substr($filter_date, 0, 4),
'month' => substr($filter_date, 4, 2),
),
);
}
$query = new WP_Query($args);
if ($query->have_posts()) {
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="datos.csv"');
header('Pragma: no-cache');
header('Expires: 0');
$file = fopen('php://output', 'w');
fputcsv($file, array('ID', 'Título', 'URL', 'Autor', 'Fecha de entrega'));
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$title = get_the_title();
$url = get_the_permalink();
$date = get_the_date('d/m/Y');
$user_id = get_post_field( 'post_author', $post_id );
$user = get_user_by( 'id', $user_id );
$user_name = $user->display_name;
fputcsv( $file, compact('post_id', 'title', 'url', 'user_name', 'date') );
}
wp_reset_postdata();
exit;
}
wp_reset_postdata();
Con el código realizamos una consulta utilizando «WP_Query» para obtener posts de un tipo específico, «orders-custom». Si hemos seleccionado un filtro de fecha, filtra los posts por esa fecha.
Luego genera un archivo CSV utilizando la función fputcsv()
para escribir los datos relevantes de los posts en el archivo. Finalmente, el archivo CSV se descarga al navegador.
Aquí os dejo un artículo para ver como enviar la información por email por WordPress, por si queréis ampliar la funcionalidad y tener más información.
Para terminar
Si bien la solución proporcionada requiere conocimientos básicos de PHP, y familiaridad con la estructura de archivos de WordPress, entendemos que no todos los usuarios están familiarizados con estos aspectos técnicos.
Si no te sientes cómodo realizando estos cambios por ti mismo, o prefieres contar con la ayuda de expertos en el desarrollo de WordPress, te recomendamos contactar con nosotros.
Nuestro equipo de profesionales está especializado en el desarrollo de WordPress, y estará encantado de ayudarte a implementar la funcionalidad que necesitas en tu sitio. No dudes en ponerse en contacto con nosotros para obtener asistencia personalizada, y asegurarte de que los cambios se realicen de manera segura y efectiva.