• Saltar a la navegación principal
  • Saltar al contenido principal
SiliCodeValley

SiliCodeValley

Cursos online de diseño y desarrollo WordPress

  • Newsletter
  • Acceder
  • Suscribirme

Cómo crear un recuperador de carrito abandonado para Restrict Content Pro

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:

  • Función «register_activaction_hook»
  • Función «dbDelta»

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:

Método wpdb::query

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:

  • Action hook «rcp_successful_registration»
  • Método wpdb:delete

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:

  • Filter hook «cron_schedules»
  • Constantes de expresiones de tiempo en WordPress

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:

  • Método wpdb::get_col
  • Función «wp_mail»
  • Método wpdb::delete

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.

Únete al boletín: Diario de un desarrollador web freelance

Importante: envío correos con frecuencia y en cada uno además de contarte historias, consejos y marrones de mi día a día, ofrezco mis productos y servicios. Si esto te supone un problema, no te suscribas. Y si te cansas, podrás darte de baja y tan amigos.

Responsable: David Perálvarez Fernández. Finalidad: Gestionar el envío de información y prospección comercial y dar acceso a los productos online. Legitimación: Consentimiento del interesado. Destinatarios: Empresas proveedoras nacionales y encargados de tratamiento acogidos a privacy shield. Derechos: Acceder, rectificar y suprimir los datos, así como otros derechos como se explica en la información adicional.

¡Ya casi estamos! Revisa tu bandeja de entrada o la carpeta de spam para confirmar tu suscripción.

Para dejar dudas en este tutorial, primero debes suscribirte.

  • Blog
  • Acerca
  • Contacto
  • Privacidad
  • Términos
  • Aviso Legal
  • Cookies

Utilizamos cookies propias y analíticas para darte la mejor experiencia en nuestra web.

Puedes informarte más sobre qué cookies estamos utilizando o desactivarlas en los .

Resumen de privacidad
SiliCodeValley

Esta web utiliza cookies propias y analíticas para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.

Cookies estrictamente necesarias

Las cookies estrictamente necesarias tiene que activarse siempre para que podamos guardar tus preferencias de ajustes de cookies.

Cookies analíticas

Esta web utiliza Google Analytics para recopilar información anónima tal como el número de visitantes del sitio, o las páginas más populares.

Dejar esta cookie activa nos permite mejorar nuestra web.

¡Por favor, activa primero las cookies estrictamente necesarias para que podamos guardar tus preferencias!

Política de cookies

Más información sobre nuestra política de cookies