En el apartado anterior vimos como programar una sencilla landing page para WordPress parte 1 que enviaba los correos y guardaba en la base de datos los campos campaign, company, subjet, email y date del formulario. En esta ocasión vamos a programar plugin para WordPress que lea los datos de la base de datos y los muestre en una tabla, con la opción de descargar un archivo csv.
A continuación los tres archivos de código utilizados, están comentados por lo que no me extenderé más en ellos.
gbi-campaigns.php
Fichero principal del plugin, con el menú, los estilos y acciones para ajax.
<?php /* Plugin Name: GBI Campaigns Plugin URI: https://www.garberinformatica.com Description: Campaigns web www.garberinformatica.com Version: 1.0 Author: Jesús García Author URI: https://www.garberinformatica.com */ //conector de acción, para iniciar el menú add_action('admin_menu', 'campaign_menu'); function campaign_menu() { add_menu_page('Gestión Campañas', //page title 'Gestión Campañas', //menu title 'manage_options', //capabilities 'campaign', //menu slug 'campaign' //function ); } require_once(plugin_dir_path(__FILE__) . '/funciones-campaigns.php'); require_once(plugin_dir_path(__FILE__) . '/funciones-jquery-campaigns.php'); // Scripts datatables function gbiwl_datatables_scripts() { wp_deregister_script( 'datatables-js' ); wp_register_script( 'datatable-js', '//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js' , '', '', true ); wp_enqueue_script( 'datatable-js' ); } add_action( 'admin_enqueue_scripts', 'gbiwl_datatables_scripts' ); add_action( 'wp_enqueue_scripts', 'gbiwl_datatables_scripts' ); // Estilos datatables function gbiwl_datatables_styles() { wp_deregister_style( 'datatables_style' ); wp_register_style('datatables_style','https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css'); wp_enqueue_style( 'datatables_style' ); } add_action( 'admin_enqueue_scripts', 'gbiwl_datatables_styles' ); add_action('admin_footer', 'footer_campaigns'); add_action('wp_head', 'myplugin_ajaxurl'); // para poder usar ajaxurl function myplugin_ajaxurl() { echo '<script type="text/javascript"> var ajaxurl = "' . admin_url('admin-ajax.php') . '"; </script>'; } ?>
funciones-campaigns.php
funciones de acceso a bbdd y creación del csv
<?php // añadimos wp_ajax action para poder llamar a csv_campaigns desde ajax add_action("wp_ajax_csv_campaigns","csv_campaigns"); function csv_campaigns(){ if ( ! is_super_admin() ) { return; } $filename = "landing.csv"; // primera línea del archivo csv con los nombres de las columnas $header_row = array( 0 => 'ID', 1 => 'Campaign', 2 => 'Company', 3 => 'Subject', 4 => 'Email', 5 => 'Date', ); $data_rows = array(); global $wpdb; $path = get_home_path(); // ruta al fichero, en wp-content/uploads $ruta = get_home_path() . "/wp-content/uploads/" . $filename; // leemos la tabla de la base de datos $conex = $wpdb->get_results("SELECT * FROM `gbi_campaigns`"); // creamos las columnas del csv foreach ($conex as $u){ $row = array(); $row[fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"][0] = $u->id; $row[1] = $u->campaign; $row[2] = $u->company; $row[3] = $u->subject; $row[4] = $u->email; $row[5] = $u->date; $data_rows[] = $row; } // abrimos un fichero para crear el nuevo csv $fh = fopen( $ruta, 'w' ); fprintf( $fh, chr(0xEF) . chr(0xBB) . chr(0xBF) ); header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' ); header( 'Content-Description: File Transfer' ); header( 'Content-type: text/csv' ); header( "Content-Disposition: attachment; filename={$filename}" ); header( 'Expires: 0' ); header( 'Pragma: public' ); fputcsv( $fh, $header_row ); foreach ( $data_rows as $data_row ) { fputcsv( $fh, $data_row ); } fclose( $fh ); // al ser una llamada a ajax hay que terminar inmediatamente y devoler la respuesta die(); } function campaign(){ defined('ABSPATH') or die("Cannot access pages directly."); global $user; global $wp_roles; global $wpdb; $user = wp_get_current_user(); $roles = $user->roles; $role = array_shift($roles); $user_id = wp_get_current_user(); if( is_user_logged_in() ) { $rol = isset($wp_roles->role_names[$role]) ? translate_user_role($wp_roles->role_names[$role] ) : false; ; }else{ echo 'Debe estar logueado para poder ver esta página'; } if ( $rol == "Administrador" ){ ?> <h1 class="wp-heading-inline">Tabla Campañas</h1> <?php // leemos los datos de la bbdd para la tabla $campaignsdb = $wpdb->get_results("SELECT * FROM `gbi_campaigns`"); // Array of WP_User objects. ?> <!-- tabla para mostrar los datos de las campañas --> <table name="tab_campaings" id="tab_campaings" class='wp-list-table widefat fixed striped posts'> <thead> <tr> <th>ID</th> <th>Campaign</th> <th>Company</th> <th>Subject</th> <th>Email</th> <th>Date</th> </tr> </thead> <?php // rellenamos las filas foreach ( $campaignsdb as $contact ) { ?> <tr> <td><?php echo esc_html ( $contact->id); ?></TD> <td><?php echo esc_html ( $contact->campaign); ?></TD> <td><?php echo esc_html ( $contact->company); ?></TD> <td><?php echo esc_html ( $contact->subject); ?></TD> <td><?php echo esc_html ( $contact->email); ?></td> <td><?php echo esc_html ( $contact->date); ?></td> </tr> <?php } ?> </table> <br> <!-- Botón para generar el csv y descargarlo --> <button type="button" class="button button-primary" id='crear_csv'> Exportar CSV </button><br> <?php }else { echo 'NO TIENE PERMISO PARA VER ESTA SECCIÓN 2'; } } ?>
funciones-jquery-campaigns.php
funciones jquery para manejar la tabla y la descarga del csv
<?php function footer_campaigns() { ?> <SCRIPT type="text/javascript" > jQuery(document).ready(function($){ // indicamos que la tabla tab_campaigns es datatable jQuery('#tab_campaings').DataTable(); // al pusar en el botón de exporar csv creamos el csv mediante una // llamada a ajax, después lo descargamos $('#crear_csv').click(function(){ var data = { 'action' : "csv_campaigns", 'url' : ajaxurl }; jQuery.post(ajaxurl, data, function(response) { window.location.href="wp-content/uploads/landing.csv"; }); }); }); </SCRIPT> <?php } ?>
Eso es todo, espero que os haya sido de utilidad. Cualquier duda o comentario será bienvenida.
Algunos enlaces de interés:
https://codex.wordpress.org/AJAX_in_Plugins
https://codex.wordpress.org/Class_Reference/wpdb
https://datatables.net/
Puedes descargar el plugin aquí
Una respuesta