WPCode -> Agregar fragmento -> **Fragmento de PHP**
Insercion automatica -> **Ejecutar en todas partes**
(NO es un fragmento de HTML como los otros: es PHP.) COMO GUARDA
En una opcion de la propia base de datos del sitio
(nm_td_citas). No usa servicios externos, no crea tablas y no
necesita ningun plugin de reservas. QUE GUARDA, Y QUE NO
Solo fecha, hora y vehiculo. NO guarda nombre, correo ni
celular: la lista se publica en una direccion abierta para que
la pagina la pueda leer, y ahi no puede haber datos de nadie.
Los datos del cliente siguen viajando unicamente por correo,
como hasta ahora. CUANDO SE MARCA UN CUPO
Cuando Contact Form 7 confirma que ENVIO el correo. Se hace en
el servidor a proposito: asi el cupo refleja exactamente lo que
se envio, y nadie puede marcar cupos falsos desde el navegador. SI ALGO SALE MAL
Se desactiva el fragmento en WPCode y el sitio queda como
estaba. La pagina de test drive esta hecha para seguir
funcionando aunque esta parte no responda: simplemente deja de
bloquear cupos.
============================================================ */ if ( ! defined( 'ABSPATH' ) ) { return; } /* ------------------------------------------------------------
1. LEER Y LIMPIAR
Cada vez que se lee, se botan las citas de dias que ya pasaron.
Por eso la lista nunca crece sin control y "se reinicia sola":
el lunes ya no quedan las citas de la semana anterior.
------------------------------------------------------------ */
function nm_td_leer_citas() {
$citas = get_option( 'nm_td_citas', array() );
if ( ! is_array( $citas ) ) {
$citas = array();
} $hoy = current_time( 'Y-m-d' );
$vivas = array();
foreach ( $citas as $c ) {
if ( ! empty( $c['fecha'] ) && $c['fecha'] >= $hoy ) {
$vivas[] = $c;
}
} /* Solo se reescribe si de verdad cambio, para no escribir en la
base de datos en cada visita a la pagina. */
if ( count( $vivas ) !== count( $citas ) ) {
update_option( 'nm_td_citas', array_values( $vivas ), false );
} return array_values( $vivas );
} /* ------------------------------------------------------------
2. MARCAR EL CUPO CUANDO SE ENVIA EL FORMULARIO
------------------------------------------------------------ */
add_action( 'wpcf7_mail_sent', 'nm_td_marcar_cupo' );
function nm_td_marcar_cupo( $formulario ) { if ( ! class_exists( 'WPCF7_Submission' ) ) {
return;
}
$envio = WPCF7_Submission::get_instance();
if ( ! $envio ) {
return;
} $datos = $envio->get_posted_data(); /* Contact Form 7 a veces entrega los desplegables como arreglo
de un solo elemento, y a veces como texto. Se acepta lo que
llegue. */
$sacar = function( $v ) {
if ( is_array( $v ) ) {
$v = reset( $v );
}
return sanitize_text_field( (string) $v );
}; $fecha = isset( $datos['fecha'] ) ? $sacar( $datos['fecha'] ) : '';
$hora = isset( $datos['hora'] ) ? $sacar( $datos['hora'] ) : '';
$vehiculo = isset( $datos['vehiculo'] ) ? $sacar( $datos['vehiculo'] ) : ''; /* Si el formulario no trae los tres campos, no es el de test
drive (el sitio tiene otros formularios): no se toca nada. */
if ( '' === $fecha || '' === $hora || '' === $vehiculo ) {
return;
}
if ( ! preg_match( '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $fecha ) ) {
return;
} $citas = nm_td_leer_citas(); /* Si por alguna razon llega dos veces el mismo envio, no se
duplica la linea. */
foreach ( $citas as $c ) {
if ( $c['fecha'] === $fecha && $c['hora'] === $hora && $c['vehiculo'] === $vehiculo ) {
return;
}
} $citas[] = array(
'fecha' => $fecha,
'hora' => $hora,
'vehiculo' => $vehiculo,
'creada' => current_time( 'mysql' ),
); update_option( 'nm_td_citas', $citas, false );
} /* ------------------------------------------------------------
3. LA DIRECCION QUE LEE LA PAGINA
https://www.novamotors.com.co/wp-json/novamotors/v1/testdrive
Devuelve solo f (fecha), h (hora) y v (vehiculo).
------------------------------------------------------------ */
add_action( 'rest_api_init', 'nm_td_registrar_ruta' );
function nm_td_registrar_ruta() {
register_rest_route(
'novamotors/v1',
'/testdrive',
array(
'methods' => 'GET',
'callback' => 'nm_td_responder',
'permission_callback' => '__return_true',
)
);
}
function nm_td_responder() {
$citas = nm_td_leer_citas(); $salida = array();
foreach ( $citas as $c ) {
$salida[] = array(
'f' => $c['fecha'],
'h' => $c['hora'],
'v' => $c['vehiculo'],
);
} $respuesta = rest_ensure_response( array( 'citas' => $salida ) );
/* Sin cache: si el hosting guardara esta respuesta, la pagina
mostraria cupos viejos. */
$respuesta->header( 'Cache-Control', 'no-store, max-age=0' );
return $respuesta;
} /* ------------------------------------------------------------
4. PANTALLA EN EL ESCRITORIO DE WORDPRESS
Sirve para lo que el sistema solo no puede saber: que un cliente
llamo a cancelar. Ahi se libera el cupo a mano.
Aparece en el menu de la izquierda como "Test drive".
------------------------------------------------------------ */
add_action( 'admin_menu', 'nm_td_menu' );
function nm_td_menu() {
add_menu_page(
'Cupos de test drive',
'Test drive',
'edit_posts',
'nm-testdrive',
'nm_td_pantalla',
'dashicons-calendar-alt',
26
);
} function nm_td_pantalla() { if ( ! current_user_can( 'edit_posts' ) ) {
return;
} /* Liberar un cupo */
if ( isset( $_POST['nm_td_liberar'] ) && check_admin_referer( 'nm_td_accion' ) ) {
$quitar = sanitize_text_field( wp_unslash( $_POST['nm_td_liberar'] ) );
$citas = nm_td_leer_citas();
$nuevas = array();
foreach ( $citas as $c ) {
if ( $c['fecha'] . '|' . $c['hora'] . '|' . $c['vehiculo'] !== $quitar ) {
$nuevas[] = $c;
}
}
update_option( 'nm_td_citas', array_values( $nuevas ), false );
echo '
Cupo liberado. Ya vuelve a aparecer disponible en la página.
';
} $citas = nm_td_leer_citas(); /* Se ordenan por fecha y hora para que se lean como una agenda */
usort(
$citas,
function ( $a, $b ) {
if ( $a['fecha'] === $b['fecha'] ) {
return strcmp( $a['hora'], $b['hora'] );
}
return strcmp( $a['fecha'], $b['fecha'] );
}
); echo '
';
echo '
Cupos de test drive
';
echo '
Estas son las franjas que la página ya no ofrece porque alguien las agendó. ';
echo 'Si un cliente cancela, libera aquí el cupo para que vuelva a quedar disponible.
';
echo '
Las citas de días que ya pasaron desaparecen solas: no hay que borrarlas.
Vehículos Usados Toyota inspeccionados bajo estrictos estándares de calidad, cuidadosamente revisados para brindarte confianza, seguridad y tranquilidad en tu compra.