Hooks de integración con WooCommerce
Cómo se conecta la ruta de pago y dónde engancharse a ella.
El flujo
- Get access añade el producto al carrito con la identidad del evento adjunta como dato del artículo del carrito.
- En el pago, el evento se escribe sobre el pedido.
- Cuando se renderiza la página de agradecimiento del pedido, el comprador queda inscrito en el evento.
Cada uno de esos es un punto de extensión estándar de WooCommerce, así que las integraciones usan los hooks propios de WooCommerce en lugar de los específicos de POM Events.
El artículo del carrito
La identidad del evento viaja como dato del artículo del carrito bajo la clave event_id_to_enroll.
Para inspeccionarla:
add_filter( 'woocommerce_get_item_data', function ( $item_data, $cart_item ) {
if ( ! empty( $cart_item['event_id_to_enroll'] ) ) {
$item_data[] = array(
'name' => __( 'Event', 'my-plugin' ),
'value' => get_the_title( (int) $cart_item['event_id_to_enroll'] ),
);
}
return $item_data;
}, 10, 2 );
Vale la pena desplegar ese fragmento en cualquier sitio que venda eventos: muestra al comprador qué evento está pagando, en el carrito y en el pago.
El pedido
El evento se almacena en el pedido como meta bajo associated_event_id:
add_action( 'woocommerce_order_status_processing', function ( $order_id ) {
$order = wc_get_order( $order_id );
$event_id = $order ? $order->get_meta( 'associated_event_id' ) : 0;
if ( ! $event_id ) {
return;
}
// React to a paid event order.
} );
Úsalo para correos de confirmación del pedido que mencionen el evento, para informes o para tu propia lógica de inscripción.
La inscripción ocurre en la página de agradecimiento
La inscripción se ejecuta en woocommerce_thankyou. Dos consecuencias para las integraciones:
- Un comprador que nunca llega a la página no queda inscrito. Cualquier integración que asuma que un pedido siempre produce un asistente estará equivocada a veces.
- No elimines ni omitas la página de agradecimiento para los productos de eventos.
Para que la inscripción ocurra en el pago en su lugar, puedes escribir tu propio manejador en una transición de estado del pedido, leyendo associated_event_id y escribiendo en event_assistants. Reproduce el comportamiento del plugin con cuidado —la comprobación de capacidad, la comprobación de duplicados y los valores tomados del pedido— o las dos vías discreparán.
Qué almacena la inscripción
| Campo del asistente | Origen |
|---|---|
| Identidad | La cuenta de cliente del pedido |
comments |
Las notas del pedido del cliente |
tel |
El teléfono de facturación del pedido |
status |
Vacío, o waiting-list si el evento está lleno |
Si tu pago no recoge un teléfono de facturación, los teléfonos de los asistentes estarán vacíos. Esa es una decisión de configuración del pago, no un ajuste del plugin.
Enviar correos de confirmación para eventos de pago
La acción de registro no se dispara para las compras. Implementa la ruta de pago por separado, en un hook del pedido, o los asistentes que compraron no oirán nada mientras que los asistentes que se registraron sí.
La conciliación forma parte de cualquier integración
Como la inscripción depende de un renderizado de página, una integración sólida debería conciliar en lugar de confiar:
$orders = wc_get_orders( array(
'limit' => -1,
'status' => array( 'processing', 'completed' ),
'meta_key' => 'associated_event_id',
'meta_value' => $event_id,
) );
$assistants = get_post_meta( $event_id, 'event_assistants', true ) ?: array();
foreach ( $orders as $order ) {
$user_id = $order->get_user_id();
if ( $user_id && ! isset( $assistants[ $user_id ] ) ) {
// Paid, not enrolled.
}
}
Los pedidos de invitados no tienen ID de usuario y no pueden emparejarse de esta manera, lo que es un buen argumento para exigir cuentas en el pago.
La capacidad y el stock son independientes
El available_space del evento y el stock del producto no están sincronizados. Si tu integración gestiona uno, decide explícitamente qué hace con el otro.