Programar landing page independiente en WordPress Parte 2

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í

Dejar un comentario