En este tutorial vamos a crear paso a paso un plugin que se integra con Restrict Content Pro y se encarga de:
- Detectar si el usuario ha introducido un email en el campo de correo del formulario de registro.
- Guardarlo en una tabla personalizada de la base de datos.
- En caso de que no se una a un nivel de suscripción, enviarle un correo recordatorio para que complete el proceso de compra.
¡Vamos a ello!
1- Esquema general del funcionamiento de nuestro plugin
Para ver este vídeo del tutorial, primero debes suscribirte.
<?php
/**
* Plugin Name: RCP Recuperador de carrito abandonado
* Description: Plugin que intenta recuperar los carritos abandonados de RCP
* Version: 1.0
* Author: David Perálvarez
* Author URI: https://silicodevalley.com
* Text Domain: rcp-abandoned-cart
* License: GPLv2 or later
*/
// Evitar acceso directo al archivo
if( ! defined( 'ABSPATH' ) ):
exit;
endif;
2- Al activar el plugin creamos la tabla en la BBDD que almacenará los correos
Para ver este vídeo del tutorial, primero debes suscribirte.
// Al activar el plugin creamos la tabla en la BBDD que almacenará los correos
register_activation_hook( __FILE__, 'scv_create_table_abandoned_cart' );
function scv_create_table_abandoned_cart(){
global $wpdb;
$table_emails = $wpdb->prefix . 'rcp_abandoned_cart';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_emails (
id mediumint(9) NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
Enlaces útiles:
3- Al desactivar el plugin eliminamos la tabla que almacena los correos
Para ver este vídeo del tutorial, primero debes suscribirte.
// Al desactivar el plugin eliminamos la tabla que almacena los correos
register_deactivation_hook( __FILE__, 'scv_drop_table_abandoned_cart' );
function scv_drop_table_abandoned_cart(){
global $wpdb;
$table_emails = $wpdb->prefix . 'rcp_abandoned_cart';
$wpdb->query("DROP TABLE IF EXISTS $table_emails");
}
Enlaces útiles:
4- Cargamos el JS encargado de detectar si se ha escrito un correo
Para ver este vídeo del tutorial, primero debes suscribirte.
// Encolar el JS encargado de detectar si se ha escrito un correo
add_action( 'wp_enqueue_scripts', 'scv_enqueue_abandoned_cart_script' );
function scv_enqueue_abandoned_cart_script(){
// Lo cargamos solo en las páginas de registro
$allowed_pages = [42];
// Obtener el ID de la página actual
$id_current_page = get_queried_object_id();
if( in_array( $id_current_page, $allowed_pages ) && !is_user_logged_in() ):
wp_enqueue_script( 'abandoned-cart-js', plugin_dir_url( __FILE__ ) . 'assets/rcp-carrito-abandonado.js', ['jquery'], '1.0', true );
// Ajax
endif;
}
Enlaces útiles:
Función «get_queried_object_id»
5- Creamos el JS encargado de detectar si se ha escrito un correo
Para ver este vídeo del tutorial, primero debes suscribirte.
jQuery(document).ready(function($) {
let timer;
const emailField = '#rcp_user_email';
// Expresión regular para validar la sintaxis de un correo
const emailPattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/;
$(emailField).on('input', function(){
clearTimeout( timer );
// Capturamos lo que escribe en el campo correo del formulario de registro
const inputText = $(this).val();
// Validamos el correo al terminar el temporizador
timer = setTimeout( function(){
if( emailPattern.test(inputText) ) {
console.log( inputText );
// Ajax con Vanilla JS
const request = new XMLHttpRequest();
request.open( 'POST', rcpAbandonedCartVars.ajaxURL, true );
request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8' );
request.onload = () => {
if( request.readyState === 4 && request.status === 200 ){
console.log( request.response );
}
}
request.onerror = (err) => { console.log( err ); }
request.send( 'action=scv_save_email&nonce='+ rcpAbandonedCartVars.nonce + '&emailAbandonedCart=' + inputText );
}
}, 3000 );
});
});
Enlaces útiles:
- Curso «Ajax en WordPress»
- Módulo del curso «Aprende a usar la clase WP_Query» que muestra cómo usar las peticiones Ajax con «XMLHttpRequest»
- Tutoriales donde aplicamos Ajax
- Método «on» de jQuery
- Lección «Expresiones regulares»
6- Función para guardar el correo en la tabla que hemos creado
Para ver este vídeo del tutorial, primero debes suscribirte.
// Ajax
$data = 'const rcpAbandonedCartVars =' . json_encode([
'ajaxURL' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce( 'ajax_nonce' )
]);
wp_add_inline_script( 'abandoned-cart-js', $data, 'before' );
// Función para guardar el correo en la tabla que hemos creado
add_action( 'wp_ajax_scv_save_email', 'scv_save_email' );
add_action( 'wp_ajax_nopriv_scv_save_email', 'scv_save_email' );
function scv_save_email(){
// Verificar el nonce
if( wp_verify_nonce( $_POST['nonce'], 'ajax_nonce' ) ):
if( isset( $_POST['emailAbandonedCart'] ) ):
global $wpdb;
$table_emails = $wpdb->prefix . 'rcp_abandoned_cart';
$email = sanitize_email( $_POST['emailAbandonedCart'] );
// Comprobamos si el correo ya existe en la BBDD para evitar duplicados
$existing_email = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table_emails WHERE email = %s", $email ) );
if( !$existing_email ):
$wpdb->insert( $table_emails, array( 'email' => $email ) );
endif;
endif;
echo 'ok';
endif;
wp_die();
}
Enlaces útiles:
- Módulo del curso «Aprende a usar la clase WP_Query» que muestra cómo usar las peticiones Ajax con «XMLHttpRequest»
- Método wpdb::prepare
- Método wpdb::get_var
- Método wpdb:insert
7- Cuando alguien se registre, eliminamos su correo de la tabla de la BBDD
Para ver este vídeo del tutorial, primero debes suscribirte.
// Cuando alguien se registre, eliminamos su correo de la BBDD
add_action( 'rcp_successful_registration', 'scv_delete_email_from_table', 10, 3 );
function scv_delete_email_from_table( $member, $customer, $membership ){
$user_email = $member->user_email;
global $wpdb;
$table_emails = $wpdb->prefix . 'rcp_abandoned_cart';
// Eliminamos el correo electrónico
$wpdb->delete( $table_emails, array( 'email' => $user_email ) );
}
Enlaces útiles:
8- Creamos una tarea cron para enviar mensajes los que abandonaron el carrito
Para ver este vídeo del tutorial, primero debes suscribirte.
// Creamos una tarea cron para enviar mensajes a los que abandonaron el carrito
add_action( 'init', 'scv_create_cron_abandoned_cart' );
function scv_create_cron_abandoned_cart(){
if( !wp_next_scheduled( 'scv_send_cron_emails' ) ):
wp_schedule_event( time(), 'hourly', 'scv_send_cron_emails' );
endif;
}
// Enviamos correos de recuperación como tarea cron
add_action( 'scv_send_cron_emails', 'scv_send_cron_emails_task' );
function scv_send_cron_emails_task(){
return;
}
Enlaces útiles:
- Plugin «WP Control»
- Función «wp_next_scheduled»
- Función «wp_schedule_event»
- Función «wp_get_schedules»
9- Añadimos un nuevo intervalo de cron para testear nuestro plugin
Para ver este vídeo del tutorial, primero debes suscribirte.
// Añadimos un nuevo intervalo de cron para testear nuestro plugin
add_filter( 'cron_schedules', 'scv_custom_cron_schedule' );
function scv_custom_cron_schedule( $schedules ){
$schedules['every-1-minutes'] = array(
'interval' => MINUTE_IN_SECONDS,
'display' => 'Every 1 minute'
);
return $schedules;
}
Enlaces útiles:
10- Enviamos correos de recuperación como tarea cron
Para ver este vídeo del tutorial, primero debes suscribirte.
// Enviamos correos de recuperación como tarea cron
add_action( 'scv_send_cron_emails', 'scv_send_cron_emails_task' );
function scv_send_cron_emails_task(){
global $wpdb;
$table_emails = $wpdb->prefix . 'rcp_abandoned_cart';
$emails = $wpdb->get_col("SELECT email FROM $table_emails");
foreach( $emails as $email ):
$subject = 'Volver a carrito';
$message = 'Parece que no completaste tu pago, si tienes alguna duda que pueda resolverte puedes contactar conmigo, muchas gracias.';
$sent = wp_mail( $email, $subject, $message );
if( $sent ):
// Eliminar ese email de la tabla
$wpdb->delete( $table_emails, array( 'email' => $email ) );
endif;
endforeach;
}
Enlaces útiles:
11- Al desactivar el plugin eliminamos la tarea CRON
Para ver este vídeo del tutorial, primero debes suscribirte.
Enlaces útiles:
Función «wp_clear_scheduled_hook»
12- Cómo aplicarlo en otros plugins distintos a RCP
Para ver este vídeo del tutorial, primero debes suscribirte.