Contents
Introducción
En este artículo encontrarás un tutorial completo y detallado para crear endpoints personalizados en WooCommerce usando PHP. Cubriremos dos enfoques principales: añadir endpoints en la sección Mi cuenta (endpoints de tipo página/URL) y crear endpoints REST (para integraciones, AJAX y APIs). Incluye ejemplos listos para usar, consideraciones de seguridad, buenas prácticas, pruebas y cómo desplegar correctamente en producción.
Requisitos previos
- WordPress actualizado.
- WooCommerce activo.
- Acceso para crear un plugin o editar un plugin hijo / functions.php de tu theme (se recomienda crear un plugin propio para mantener el código separado).
- Permisos de administrador para activar el plugin y refrescar permalinks si hace falta.
¿Qué tipo de endpoint necesitas?
Antes de comenzar, decide qué necesitas:
- Endpoint en Mi cuenta: una URL accesible dentro de la cuenta de usuario (p. ej. /mi-cuenta/mi-endpoint/) que muestra contenido HTML y se integra con el menú de WooCommerce.
- Endpoint REST: ruta en la API REST de WordPress (p. ej. /wp-json/mi-plugin/v1/…) para retornar JSON, usado por aplicaciones, AJAX o clientes externos.
Estructura recomendada: crear un plugin básico
Vamos a usar un plugin simple como contenedor. El siguiente ejemplo incluye la estructura mínima y el manejo de flush_rewrite_rules en la activación/desactivación.
Crear un endpoint en Mi cuenta (WooCommerce)
Pasos principales:
- Registrar un rewrite endpoint con add_rewrite_endpoint.
- Añadir la query var correspondiente para que WP la reconozca.
- Añadir el item en el menú de Mi cuenta.
- Definir la acción para mostrar el contenido (hook específico de WooCommerce).
- Refrescar permalinks (flush_rewrite_rules).
Código completo para Mi cuenta
Este bloque contiene la implementación completa y auto-contenida para agregar un endpoint en Mi Cuenta con contenido básico.
label ) {
if ( key === customer-logout ) {
new_items[mi-endpoint] = __( Mi Endpoint, text-domain )
}
new_items[ key ] = label
}
return new_items
}
/
Contenido del endpoint.
Nota: la acción es woocommerce_account_{endpoint}_endpoint
/
function wcce_account_endpoint_content() {
// Puedes obtener información del usuario actual
user_id = get_current_user_id()
if ( ! user_id ) {
echo . esc_html__( Debes estar logueado para ver esta página., text-domain ) .
return
}
// Ejemplo: obtener 5 últimos pedidos del usuario
args = array(
customer_id => user_id,
limit => 5,
orderby => date,
order => DESC,
)
orders = wc_get_orders( args )
echo . esc_html__( Tus últimos pedidos, text-domain ) .
if ( empty( orders ) ) {
echo . esc_html__( No se encontraron pedidos., text-domain ) .
return
}
echo -
foreach ( orders as order ) {
order_id = order->get_id()
date = wc_format_datetime( order->get_date_created() )
total = order->get_formatted_order_total()
printf(
- %s — %s — %s , esc_html( sprintf( __( Pedido #%d, text-domain ), order_id ) ), esc_html( date ), wp_kses_post( total ) ) } echo
Después de activar el plugin, ve a Ajustes > Enlaces permanentes y guarda para refrescar las reglas de reescritura (si no usas la activación que ya llama flush_rewrite_rules).
Crear endpoints REST personalizados
Los endpoints REST son ideales para integrar con frontends JavaScript, aplicaciones móviles o servicios externos. Se registran con register_rest_route dentro de rest_api_init. Asegúrate de implementar permission_callback para seguridad.
Ejemplo: Endpoint REST para obtener pedidos del usuario actual
Ruta: /wp-json/mi-plugin/v1/my-orders
GET,
callback => wcce_rest_get_my_orders,
permission_callback => wcce_rest_permission_logged_in,
),
)
)
// Ejemplo POST seguro: añadir una nota al pedido (solo si eres propietario del pedido)
register_rest_route(
mi-plugin/v1,
/orders/(?Pd )/add-note,
array(
methods => POST,
callback => wcce_rest_add_order_note,
permission_callback => wcce_rest_permission_can_modify_order,
args => array(
note => array(
required => true,
sanitize_callback => sanitize_text_field,
),
),
)
)
}
function wcce_rest_permission_logged_in() {
return is_user_logged_in()
}
function wcce_rest_get_my_orders( WP_REST_Request request ) {
user_id = get_current_user_id()
args = array(
customer_id => user_id,
limit => 20,
orderby => date,
order => DESC,
)
orders = wc_get_orders( args )
data = array()
foreach ( orders as order ) {
data[] = array(
id => order->get_id(),
status => order->get_status(),
total => order->get_total(),
currency => order->get_currency(),
date => order->get_date_created()->date_i18n( get_option( date_format ) . H:i ),
)
}
return rest_ensure_response( data )
}
function wcce_rest_permission_can_modify_order( WP_REST_Request request ) {
order_id = (int) request->get_param( id )
order = wc_get_order( order_id )
if ( ! order ) {
return new WP_Error( no_order, Pedido no encontrado, array( status => 404 ) )
}
user_id = get_current_user_id()
// Permitir si es admin o si el pedido pertenece al usuario actual
if ( current_user_can( manage_woocommerce ) ) {
return true
}
if ( (int) order->get_user_id() === user_id ) {
return true
}
return new WP_Error( rest_forbidden, No tienes permiso para modificar este pedido, array( status => 403 ) )
}
function wcce_rest_add_order_note( WP_REST_Request request ) {
order_id = (int) request->get_param( id )
note = request->get_param( note )
order = wc_get_order( order_id )
if ( ! order ) {
return new WP_Error( no_order, Pedido no encontrado, array( status => 404 ) )
}
// Añadir nota privada al pedido
order->add_order_note( sanitize_text_field( note ), false )
return rest_ensure_response( array( success => true, order_id => order_id ) )
}
?>
Control de acceso y seguridad
- permission_callback: Siempre valida quién puede acceder a tu endpoint REST. No confíes solo en is_user_logged_in para acciones sensibles.
- Validación y saneamiento: Usa sanitize_text_field, absint, esc_sql, wp_kses, o funciones específicas según el tipo de dato y contexto.
- Comprobar propiedad de recursos: Al modificar pedidos, verifica que el current_user sea el propietario o tenga capacidad administrativa (p. ej. edit_shop_orders o manage_woocommerce).
- Nonces y CSRF: Para peticiones desde el frontend en el mismo sitio (AJAX), utiliza wp_create_nonce y wp_verify_nonce cuando proceda.
- Respuestas REST: Devuelve objetos WP_REST_Response o errores con WP_Error y códigos HTTP adecuados.
Buenas prácticas y rendimiento
- Limita la cantidad de elementos por petición (paginación) para evitar consultas pesadas.
- Implementa caché cuando sea posible (transients, cache HTTP, control de cabeceras).
- Usa capacidades correctas para endpoints que modifican datos.
- Versiona tu API (p. ej. mi-plugin/v1) para permitir cambios no rompientes en el futuro.
- Evita exponer información sensible en respuestas JSON.
Ejemplo avanzado: Endpoint que devuelve productos relacionados con stock bajo
Route: /wp-json/mi-plugin/v1/low-stock-products
GET,
callback => wcce_get_low_stock_products,
permission_callback => function() { return current_user_can( manage_woocommerce ) }, // solo admin / manager
args => array(
limit => array(
required => false,
default => 20,
sanitize_callback => absint
),
),
)
)
})
function wcce_get_low_stock_products( WP_REST_Request request ) {
limit = request->get_param( limit )
limit = limit ? limit : 20
args = array(
status => publish,
limit => limit,
stock_status => instock,
orderby => date,
)
// Usamos wc_get_products con meta_query para stock bajo
products = wc_get_products( array(
limit => limit,
status => publish,
meta_query => array(
array(
key => _stock,
value => 5, // ejemplo: stock <= 5
compare => <=,
type => NUMERIC
),
),
) )
data = array()
foreach ( products as product ) {
data[] = array(
id => product->get_id(),
name => product->get_name(),
stock => product->get_stock_quantity(),
)
}
return rest_ensure_response( data )
}
?>
Pruebas y depuración
- Usa Postman o curl para probar tus endpoints REST. Ejemplo curl:
curl -X GET https://tusitio.com/wp-json/mi-plugin/v1/my-orders -b cookie.txt - Para endpoints privados, incluye cookies de sesión o usa autenticación básica / JWT si procede.
- Activa WP_DEBUG y revisa el log de errores para detectar problemas.
- Para endpoints Mi cuenta, revisa que las reglas de reescritura funcionen (Ajustes > Enlaces permanentes > Guardar cambios).
Tabla comparativa rápida
| Tipo | Uso típico | Formato | Autenticación |
|---|---|---|---|
| Endpoint Mi Cuenta | Contenido HTML para usuario en su panel | HTML | Sesión del usuario (WP login) |
| Endpoint REST | Integraciones, AJAX, móviles | JSON | Nonces, cookies, tokens, permission_callback |
Despliegue y mantenimiento
- Versiona tu plugin y mantén cambios documentados.
- Antes de lanzar a producción, prueba con datos reales o en un entorno staging.
- Monitorea uso y errores (logs, Sentry, etc.) y aplica límites de uso si recibes tráfico masivo.
Conclusión
Crear endpoints personalizados para WooCommerce es una forma poderosa de extender la funcionalidad y personalizar la experiencia del usuario o exponer capacidades a aplicaciones externas. Con los ejemplos mostrados tienes plantillas claras para implementar endpoints en Mi cuenta y rutas REST seguras y escalables. Mantén siempre la validación, las comprobaciones de permisos y la limitación de recursos para garantizar la seguridad y rendimiento del sitio.
|
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |
