Programar landing page independiente en WordPress Parte 2

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn

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í

Más...

Aplicación Web Indicación Farmacéutica

Programación a medida de aplicación web para la indicación farmacéutica, base de datos de grupos de síntomas, síntomas y criterios para la

Web corporativa guillenmerca.es

En colaboración con millennialsconsulting, hemos desarrollado la web corporativa guillenmerca.es. Empresa familiar mayorista de frutas, hortalizas y verduras en Madrid, con distribución

Deja un comentario