Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
acciones en lote personalizadas

Crea tus propias acciones en lote personalizadas en WordPress

Desde la versión 4.7 de WordPress tenemos disponible la opción de crear nuestras propias acciones en lote personalizadas.

Esto es muy útil, ya que podemos en nuestros listados de post types seleccionar las entradas que queramos y efectuar una acción sobre ellas.

Entre otras muchas cosas, abre una pequeña ventana para convertir el back-end de WordPress en una pequeña aplicación. Imaginad que queréis enviar una notificación a alguien con información relativa a un post type de eventos o de productos. O queréis exportar en CSV parte de la información de varios posts…las posibilidades son muchas.

Vamos a ver un simple ejemplo. Imaginad que tenemos un Custom Post Type myevents, con un listado de eventos, y queremos un proceso donde podamos seleccionar uno o varios eventos y exportar a un Excel información relacionada con esos eventos.

Vamos a crear una acción en lote personalizada, donde podamos exportar el ID del evento (post_ID), el nombre (post_title), el lugar donde se celebrará (custom field), la capacidad o aforo del evento (custom field), la fecha en la que tendrá lugar (custom field), y los datos de contacto (custom field).

Para generar el excel utilizaré la librería PHPExcel. Aunque puedes poner estas líneas en tu functions.php, quizá sería más recomendable hacerlo en un plugin.

Lo primero es añadir nuestra acción, para esto actuaremos sobre el filtro bulk_actions-edit-{nombre_del_post_type}:

require_once 'PHPExcel.php'; function my_events_bulk_action_register( $bulk_actions ) { $bulk_actions['myevents_export'] = __( 'Export Event Data', 'mytextdomain' ); return $bulk_actions; } add_filter( 'bulk_actions-edit-myevents', 'my_events_bulk_action_register' );

En este ejemplo, añadimos una key (myevents_export) al array de $bulk_actions, y le asignamos un texto (que es el que aparecerá en el select de acciones en lote).

bulk actions

A continuación, actuamos sobre el filtro handle_bulk_actions-edit-{nombre_del_post_type}.

function my_events_bulk_action_handler( $redirect_to, $doaction, $post_ids ) { if ( $doaction !== 'myevents_export' ) { return $redirect_to; } $objPHPExcel = new PHPExcel(); // Set document properties $objPHPExcel->getProperties()->setCreator( "CREATOR" ) ->setLastModifiedBy( "CREATOR" ) ->setTitle( "Events Data" ); // Add some data $objPHPExcel->setActiveSheetIndex( 0 ) ->setCellValue( 'A1', 'Event ID' ) ->setCellValue( 'B1', 'Event Title' ) ->setCellValue( 'C1', 'Place' ) ->setCellValue( 'D1', 'Capacity' ) ->setCellValue( 'E1', 'Date' ) ->setCellValue( 'F1', 'Contact' ); $row = 2; foreach ( $post_ids as $post_id ) { // Miscellaneous glyphs, UTF-8 $objPHPExcel->setActiveSheetIndex( 0 ) ->setCellValue( "A{$row}", $post_id ) ->setCellValue( "B{$row}", get_the_title( $post_id ) ) ->setCellValue( "C{$row}", get_post_meta( $post_id, 'my_event_place', true ) ) ->setCellValue( "D{$row}", get_post_meta( $post_id, 'my_event_capacity', true ) ) ->setCellValue( "E{$row}", get_post_meta( $post_id, 'my_event_date', true ) ) ->setCellValue( "F{$row}", get_post_meta( $post_id, 'my_event_contact', true ) ); $row ++; } // Rename worksheet $objPHPExcel->getActiveSheet()->setTitle( 'Events Data' ); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex( 0 ); // Redirect output to a client’s web browser (Excel2007) header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); header( 'Content-Disposition: attachment;filename="event-data.xlsx"' ); header( 'Cache-Control: max-age=0' ); // If you're serving to IE 9, then the following may be needed header( 'Cache-Control: max-age=1' ); // If you're serving to IE over SSL, then the following may be needed header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' ); // Date in the past header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); // always modified header( 'Cache-Control: cache, must-revalidate' ); // HTTP/1.1 header( 'Pragma: public' ); // HTTP/1.0 $objWriter = PHPExcel_IOFactory::createWriter( $objPHPExcel, 'Excel2007' ); $objWriter->save( 'php://output' ); exit(); } add_filter( 'handle_bulk_actions-edit-myevents', 'my_events_bulk_action_handler', 10, 3 );

Aquí simplemente montamos el excel. Recorremos con un foreach todos los ids que contiene la variable $post_ids, y para cada uno de ellos obtenemos:

  • El title => get_the_title($post_id);
  • El campo Lugar => get_post_meta( $post_id, ‘my_event_place’, true );
  • El campo Aforo => get_post_meta( $post_id, ‘my_event_capacity’, true );
  • El campo Fecha => get_post_meta( $post_id, ‘my_event_date’, true );
  • El campo Datos de Contacto => get_post_meta( $post_id, ‘my_event_contact’, true );

 

Y listo, nos devolverá un excel con la información de los posts que hayamos marcado.

Puede que también te interese

Cómo crear una página de error de acceso a base de datos personalizada
Cómo crear una página de error de acceso a base de datos personalizada
En alguna ocasión nos podemos encontrar con un error de acceso a la base de datos por diversos motivos, y en estos casos nos aparece…
Campos personalizados para una plantilla determinada
Campos personalizados para una plantilla determinada
En alguna ocasión podemos estar interesados en mostrar un metabox con campos personalizados o custom fields para una plantilla determinada o concreta, y no mostrarlos en…
Cómo solucionar cuando haces cambios y nada ocurre en WordPress
Cómo solucionar cuando haces cambios y nada ocurre en WordPress
En alguna ocasión puede ocurrir que hagas un cambio en tu web tipo: Editar y/o crear una página o entrada. Editar un contenido. Añadir y/o…
Mejora la puntuación de Google PageSpeed Insights: Eliminar el JavaScript que bloquea la visualización del contenido de la mitad superior de la página
Mejora la puntuación de Google PageSpeed Insights: Eliminar el JavaScript que bloquea la visualización del contenido de la mitad superior de la página
1. Optimizar imágenes 2. Minificar CSS y JS 3. Especificar caché de navegador 4. Habilita la compresión 5. Reducir el tiempo de respuesta del servidor…