Toda la documentación · Información del plugin

Hooks y referencia para desarrolladores

Documentación de la versión 1.0.4.

Se aplica a la candidata local 0.1.0-alpha.1 . Estos son los contratos actuales del código, no una promesa de que una API alfa sin publicar nunca vaya a cambiar. Los espacios de nombres PHP conservan la grafía heredada HoockSpark; los hooks públicos utilizan hs_po_. No cambies los nombres de las claves persistentes al personalizar.

Cómo llega una opción al pedido

El repositorio selecciona los grupos activos según el producto, la variación y el visitante determinados por el servidor. El motor valida la configuración, evalúa las dependencias de campos anteriores, normaliza los valores elegidos y calcula los suplementos. Se omiten los campos ocultos. Los adaptadores del carrito vuelven a evaluar los precios del catálogo en lugar de confiar en los importes enviados por el navegador. El adaptador de pago guarda metadatos legibles del artículo y una instantánea privada _hs_po_snapshot con las opciones compradas y su suplemento de precio.

Nunca sustituyas el cálculo del servidor por modificaciones de precios en el navegador. Nunca escribas directamente en hs_po_groups_v1 desde una solicitud pública. Las rutas del editor comprueban permisos y nonces. El almacenamiento utiliza una revisión optimista para evitar la pérdida de cambios. Las clases internas no son una API pública general de persistencia.

Hooks de extensión PHP

El primer argumento de un filtro es su resultado actual. Consérvalo para las definiciones que tu proveedor no gestione. Establece expresamente el número de argumentos admitidos al registrar la función de respuesta.

GanchoArgumentos en ordenResultado o acción requeridos
hs_po_field_configuration_error$error, $fieldnull acepta un tipo personalizado; una cadena identifica un error de configuración. El valor predeterminado es unsupported_type.
hs_po_field_value$result, $field, $value, $contextDevuelve un array con una cadena value y display; el valor opcional extra debe ser finito y no negativo. Devuelve ['error' => 'code'] para rechazar.
hs_po_render_field$field, $id, $nameMuestra el control personalizado y escapa cada valor dinámico. Utiliza el identificador y el nombre de entrada facilitados. Es una acción, no un filtro que devuelve HTML.
hs_po_pricing_configuration_error$error, $pricingnull acepta la configuración de precios; de lo contrario, devuelve un código de error.
hs_po_pricing_unit_extra$result, $pricing, $value, $base, $quantitySuplemento entero o decimal, finito y no negativo por unidad. Sustituye al suplemento base del campo; los extras de cada elección siguen sumándose.
hs_po_condition_configuration_error$error, $condition, $fields, $indexnull acepta condiciones compuestas. Valida las referencias a campos anteriores y limita el número de condiciones.
hs_po_condition_visible$visible, $condition, $valuesSolo el valor exacto true hace visible el campo compuesto. Los valores son selecciones validadas disponibles hasta ese momento.
hs_po_steps_configuration_error$error, $groupnull acepta los pasos del grupo; de lo contrario, devuelve un código de error de configuración.

Las funciones de respuesta de valores de campos personalizados reciben una cadena sin espacios iniciales ni finales. Los valores obligatorios vacíos se rechazan antes de llamar a la función; los opcionales vacíos se omiten. El esquema común sigue validando el identificador, la etiqueta, la obligatoriedad y los precios y límites estándar del campo. Cada proveedor personalizado debe validar las propiedades adicionales que introduzca.

$context contiene actualmente los datos proporcionados por el servidor product_id y group_id cuando se llama mediante Quote. Las llamadas directas al motor y las vistas previas sin guardar pueden proporcionar un contexto vacío. Si tu proveedor necesita un contexto fiable, rechaza su ausencia en lugar de leer identificadores de $_POST. El cuarto argumento es adicional: los proveedores existentes registrados con tres argumentos siguen funcionando.

$base es el precio unitario del catálogo con su base fiscal, antes de los extras de Product Options & Add-Ons. WooCommerce sigue siendo responsable de los impuestos y los totales mostrados. Repetir el cálculo con los mismos datos debe producir el mismo resultado; no incrementes un precio de producto ya modificado.

Ejemplo: un código de referencia validado

el proveedor completo que aparece a continuación. Colócalo en un plugin específico del sitio que se cargue junto a Product Options & Add-Ons; no edites el paquete de Product Options & Add-Ons. Acepta letras, dígitos y guiones hasta un máximo de 32 caracteres, los normaliza a mayúsculas y muestra un campo de texto nativo.

Una definición de campo que utiliza este proveedor es:

array(
    'id'       => 'reference',
    'type'     => 'acme_reference',
    'label'    => 'Project reference',
    'required' => true,
    'price'    => 2,
)

Con un precio de catálogo de 20, la referencia abc-42 se convierte en ABC-42. Dos unidades cuestan 44 antes de los efectos de impuestos y descuentos del carrito. Se rechazan la ausencia de referencia, los espacios, el marcado y las cadenas de más de 32 caracteres. El ejemplo se prueba directamente mediante development/tests/product-options/documented-hook-native.php; no guarda ajustes.

Esto registra un proveedor, no una nueva opción de tipo de campo en el menú del editor. También debes ampliar el editor para crear la definición. Evita configuraciones de campos que la tienda pueda mostrar, pero que el comerciante no pueda entender o editar.

Eventos de extensión del editor

Los eventos se emiten en document. Registra los escuchadores antes de que se inicialice el editor de Free. El paquete Pro utiliza una dependencia de script explícita para garantizar ese orden.

EventoDetalleFinalidad
hs-po-editor-fieldcard, field, index, group, input, mark, render, conditionHandledAñade controles al campo actual. Marca los borradores modificados y vuelve a mostrar los controles cuando cambie la estructura. Establece conditionHandled solo cuando sustituyas los controles de condiciones.
hs-po-editor-grouparea, group, input, mark, renderAñade controles de grupo.
hs-po-editor-readymerge(groups)Añade al editor borradores de grupo validados; merge devuelve si la operación se ha completado o ha fallado, y no los guarda.
hs-po-conditioncondition, values, visibleEvaluación de condiciones compuestas en la tienda. Establece visible de forma síncrona. La validación del servidor sigue siendo la que determina la validez.

Utiliza textContent para las etiquetas controladas por usuarios y controles nativos con etiqueta. Un proveedor de condiciones del navegador también necesita los filtros correspondientes de configuración y visibilidad en el servidor. JavaScript por sí solo no puede autorizar una compra.

Solicitudes REST y persistencia

Espacio de nombres: hs-product-options/v1. Utiliza la autenticación por cookies de WordPress con X-WP-Nonce y una cuenta con permiso para gestionar WooCommerce. No incrustes credenciales de administrador en scripts públicos de la tienda.

Las rutas actuales incluyen grupos, búsqueda y vista previa del borrador; Pro añade exportación e import-preview. La vista previa de importación devuelve borradores desactivados o requires_mapping para referencias entre sitios. Se valida cada destino de asignación antes de devolver los grupos de borrador. La vista previa de importación no guarda datos.

Gestiona los conflictos de revisión recargando el estado guardado y conservando el borrador del comerciante para revisarlo. No reintentes automáticamente con una revisión nueva sobrescribiendo el trabajo de otro editor. Los límites de tamaño de solicitud se aplican antes del procesamiento.

Integraciones de archivos protegidos

Los archivos no son adjuntos multimedia públicos. Las opciones de producto contienen una referencia opaca vinculada en el servidor a la sesión propietaria y al producto, grupo y campo exactos. La asociación con el pedido se guarda por separado para que los reintentos de pago no consuman una referencia pendiente del carrito. Las descargas de pedidos requieren un comerciante autenticado, un nonce de pedido y artículo, metadatos coincidentes y permiso sobre el pedido.

No muestres referencias de subida en bruto en correos, no expongas el contenido binario de la base de datos mediante un punto de conexión público propio ni consideres que poseer una referencia concede permiso. El archivo se guarda actualmente de forma privada en la base de datos. Eliminar un pedido definitivamente libera los archivos sin referencias; moverlo a la papelera los conserva. Las descargas del comerciante requieren permisos de pedido y una asociación válida al artículo. Las referencias privadas no son URL multimedia públicas.

Desactivación de Pro y límites de integración

Si falta el proveedor de un campo Pro, un precio avanzado, una condición compuesta o un diseño por pasos, la validación del esquema bloquea el uso de esa configuración. Se conservan las definiciones. Una compra afectada no debe descartar sin aviso una personalización obligatoria ni volver a un precio inferior. La desactivación y reactivación reales en red han superado las comprobaciones de compra de Free y bloqueo seguro de Pro sin pérdida de datos. La interfaz completa de recuperación para el comerciante sigue siendo una comprobación de publicación pendiente; esto no afirma que todos los grupos Free puedan comprarse en cualquier configuración mixta.

La integración con Dynamic Pricing utiliza su filtro hs_pricing_catalog_unit_price para proporcionar la base recién calculada con los extras de opciones después de restaurar los totales anteriores. No vuelvas a añadir esos extras en otro filtro de precio. Min/Max sigue validando las cantidades e importes del carrito de WooCommerce. Las afirmaciones de compatibilidad requieren pruebas con versiones exactas de los plugins.

Contrato de respuesta REST de administración

SolicitudRespuesta correctaErrores que debes gestionar
GET /groupsInstantánea guardada del almacenamiento con revisión y grupos401/403: acceso denegado; 409: esquema guardado incompatible
PUT /groupsEstado guardado tras comprobar la revisión optimista400: revisión o grupos mal formados; 413: cuerpo de más de 1 MB; 422: errores de campos identificados; 409: conflicto de revisión
POST /draft-previewMarcado, validación y cálculo de la vista previa sin guardarComprobaciones de acceso y producto y errores de validación; nunca interpretes una vista previa como un guardado
GET /export (Pro)Documento versionado de configuración guardadaErrores de acceso o del esquema guardado
POST /import-preview (Pro)Grupos nuevos desactivados, o requires_mapping400: formato; 413: tamaño; 422: asignación o grupo inválidos

PUT sustituye todo el conjunto de grupos, no un solo grupo. Lee la instantánea actual, conserva los grupos ajenos al cambio, edita una copia local y envía su revisión original junto con el conjunto completo. Nunca envíes un conjunto vacío como prueba de conexión: una solicitud válida y autorizada eliminaría todos los grupos guardados. En un error 422, data.fields asocia las rutas de campos con códigos de error. Conserva el borrador y vincula los mensajes a sus controles. En un error 409, ofrece comparar o recargar en vez de sobrescribir sin aviso el trabajo de otro editor.

El ejemplo completo de proveedor se volvió a ejecutar con el entorno local actual: siete comprobaciones superadas de aceptación del esquema, valor normalizado en mayúsculas, total de 44, valores inválidos y nombres del control generado. Las seis rutas de administración también rechazan solicitudes HTTP anónimas reales con 401. Esto no verifica los nonces autenticados ni todas las combinaciones de perfiles.

Evaluación multipart de archivos del borrador

El punto de conexión de vista previa también admite datos de formulario multipart: una cadena draft JSON con los datos habituales de la vista previa y archivos subidos indexados por identificador de campo. Los límites son de 1 MiB para JSON, 10 archivos y 10 MiB de tamaño total subido, además de la política de cada campo y los límites de PHP y del servidor. La autenticación y los permisos de producto no cambian.

Solo este punto de conexión proporciona el contexto interno draft_preview/draft_files al motor. El proveedor Pro de subida requiere is_uploaded_file() y reutiliza UploadPolicy. Devuelve un valor de visualización efímero para el cálculo, no una referencia de subida reutilizable en la tienda. Los archivos no se trasladan al almacenamiento, a la biblioteca de medios ni a los pedidos. No aceptes estos indicadores de contexto desde los valores públicos del carrito; las integraciones de campos personalizados deben mantener esa distinción. Las pruebas autenticadas de multipart y navegador verificaron una subida PNG correcta, el rechazo de contenido inválido y la recuperación el 20 de septiembre de 2026.

Ejemplo completo de proveedor

<?php
/** Example custom field provider for HS Product Options & Add-Ons. */
namespace Acme\ProductOptionsExample;

defined( 'ABSPATH' ) || exit;

add_filter('hs_po_field_configuration_error', static function ($error, array $field) {
    return 'acme_reference' === ($field['type'] ?? '') ? null : $error;
}, 10, 2);

add_filter('hs_po_field_value', static function ($result, array $field, string $value, array $context = array()) {
    if ('acme_reference' !== ($field['type'] ?? '')) {
        return $result;
    }
    if (!preg_match('/^[A-Za-z0-9-]{1,32}$/D', $value)) {
        return array('error' => 'invalid_reference');
    }
    $normalized = strtoupper($value);
    return array('value' => $normalized, 'display' => $normalized);
}, 10, 4);

add_action('hs_po_render_field', static function (array $field, string $id, string $name): void {
    if ('acme_reference' !== ($field['type'] ?? '')) {
        return;
    }
    echo '<label for="' . esc_attr($id) . '">' . esc_html($field['label']) . '</label>';
    echo '<input type="text" id="' . esc_attr($id) . '" name="' . esc_attr($name) . '" maxlength="32" pattern="[A-Za-z0-9-]{1,32}"' . (!empty($field['required']) ? ' required' : '') . '>';
}, 10, 3);

Índice del manual · Prueba los ejemplos →

Incorporaciones experimentales en alpha.18

Estos hooks son adicionales, están disponibles con WordPress cargado y todavía no constituyen una API estable entre versiones:

  • hs_po_option_snapshot(array $item, array $field): array: se ejecuta para cada campo seleccionado, validado y visible durante el cálculo. Conserva las claves obligatorias y los importes calculados; Pro añade el valor opcional sku. Aquí no se comprueban permisos, porque el cálculo también se ejecuta para clientes de la tienda. Nunca leas datos privilegiados ni confíes en entradas sin sanear dentro de este filtro.
  • hs_po_field_metadata_error($error, array $field): extensión de validación del esquema; devuelve el error anterior o un código de error. Pro valida los códigos opcionales de campo y elección mediante invalid_option_sku.
  • hs_po_admin_tabs(array $tabs): array: añade el slug y la etiqueta de una pestaña a la lista permitida de navegación de administración existente.
  • hs_po_admin_tab(string $tab): void: muestra el contenido de una pestaña de extensión. Las extensiones deben comprobar sus propios permisos y escapar la salida; los informes de Pro requieren manage_woocommerce.

El elemento del pedido _hs_po_snapshot de schema2 añade base, quantity, currency, catalog_includes_tax; las entradas de artículos añaden pricing_mode, once_extra y, opcionalmente en Pro, sku. Mantén la compatibilidad de lectura con schema1. Estos metadatos son una instantánea inmutable de la compra, no un punto de integración admitido para escritura directa. Los pedidos históricos no se migran.

El adaptador de lotes de Store API de WooCommerce conserva el contrato existente: cada subsolicitud proporciona extensions.hs-product-options.values indexado con sus propios identificadores de grupo. Las pruebas REST nativas utilizan dos productos distintos y un lote mixto válido e inválido: respuesta global 207, válida 201 e inválida 4xx, añadiendo solo la configuración válida. Esto no establece una operación atómica de todo o nada ni sustituye las pruebas HTTP de sesión y nonce.

Los valores item_data del carrito en alpha.18 incluyen HTML escapado dentro de un elemento hs-po-cart-value span para limitar el estilo a su ámbito en WooCommerce clásico y de bloques. Los consumidores que necesiten texto sin formato deben eliminar el marcado. Los metadatos de presentación guardados en el pedido siguen siendo texto sin formato.

Hooks de ampliación: contratos de la candidata local

Estas incorporaciones no constituyen una API pública estable publicada. Registra las funciones de respuesta solo cuando esté disponible el plugin correspondiente, conserva los valores recibidos cuando tu función no sea aplicable y nunca confíes en precios o identificadores multimedia enviados por el cliente.

hs_po_pricing_configuration_error

El filtro existente recibe ahora un tercer argumento opcional: la definición del campo propietario. Las funciones de respuesta existentes de dos argumentos siguen siendo compatibles. Los argumentos son el error anterior o null, el array de precios y el array del campo. Devuelve null solo para una definición compatible y válida; de lo contrario, devuelve un código de error. Pro customer_amount requiere un campo numérico y valores finitos y no negativos de minimum y maximum , con el máximo igual o superior al mínimo.

hs_po_cart_line_quote

Argumentos: array de cálculo validado por el servidor, clave de carrito, array del artículo nativo y WC_Cart. Devuelve un array de cálculo completo. El adaptador de productos vinculados quita del artículo principal los cargos de accesorios porque WooCommerce factura las líneas hijas nativas por separado. No elimines errores de validación ni dupliques los cargos de accesorios en una integración posterior.

hs_po_cart_product

Argumentos: clon aislado de WC_Product para esta línea y array de cálculo validado por el servidor. Devuelve un WC_Product. El adaptador de imagen seleccionada aplica a este clon la referencia del adjunto de la instantánea validada. Nunca guardes este objeto: representa una línea del carrito, no una actualización del catálogo. Evita modificar objetos compartidos del catálogo o suponer que el cálculo no contiene errores.

hs_po_option_snapshot

El filtro existente de instantánea también admite product_image_id rellenado a partir de las opciones visuales validadas del comerciante. Esta referencia se copia en los metadatos privados del pedido _hs_po_snapshot junto con los componentes económicos. No se acepta como parámetro fiable enviado por el comprador. Los consumidores deben admitir instantáneas antiguas sin esta propiedad y adjuntos que ya no existan.

Campos de presentación y vistas previas de grupo

hs_po_field_is_display_only recibe el booleano anterior y la definición del campo. True excluye el campo editorial de la evaluación de valores y precios. No lo utilices para omitir la validación de un dato que forme parte de la compra.

hs_po_render_group_preview es una acción que recibe el grupo validado y su identificador. Escapa la salida según su contexto HTML. Pro lo utiliza para capas limitadas de texto e imagen. hs_po_composite_configuration_error valida la configuración compuesta opcional; si falta compatibilidad, debe mantenerse el error en lugar de ignorar sin aviso una definición no admitida.

Transporte de la edición del carrito

La operación Pro wc-ajax=hs_po_edit solo acepta POST y utiliza la sesión actual de WooCommerce. Requiere la clave de carrito existente key, un nonce vinculado a la sesión y al estado de la línea, y los valores anidados values. Omitir valores significa vaciar todas las opciones opcionales, no eludir los campos obligatorios. El servidor recalcula a partir de los grupos guardados y del catálogo y rechaza la edición directa de líneas hijas.

Un nonce obsoleto, una línea desconocida, un método inválido u otra sesión no permiten seleccionar el carrito de otro cliente. El nonce incluye la cantidad y las selecciones; no es un bloqueo de base de datos ni serializa por sí solo las escrituras simultáneas en sesiones de WooCommerce. Una configuración inválida devuelve mensajes de campo traducidos cuando están disponibles y conserva el carrito anterior. No implementes reintentos POST automáticos tras un fallo de red ambiguo: recarga primero el carrito.

Disponibilidad de la ventana modal

hs_po_modal_available(bool $available): bool tiene false como valor predeterminado. El proveedor Pro instalado lo activa independientemente del derecho de renovación. El servidor muestra los campos integrados en la página si la función modal no está disponible, aunque una definición guardada la solicite. Las definiciones guardadas siguen siendo estructuralmente válidas y no cambian, lo que conserva su comportamiento al reactivar. Esta alternativa solo afecta a la presentación; los proveedores de campos o precios no compatibles siguen provocando errores de validación.

La tienda emite hs-po-refresh en document antes de recalcular los campos visibles, con detail.container y detail.refresh. Pro registra su controlador de presentación modal en este evento. Las extensiones deben evitar llamar a refresh de forma síncrona en cada notificación, porque provocaría recursión. Este evento de la candidata local no es una API pública estable.

Normalización de entradas

hs_po_normalize_field_input($value, array $field) recibe el valor enviado y la definición del campo antes de la conversión escalar, la eliminación de espacios iniciales y finales y las comprobaciones de obligatoriedad. Conserva los valores de los tipos de campo que tu proveedor no gestione. Devuelve una cadena, un entero o un decimal; los demás tipos se rechazan como invalid_value. Pro utiliza este punto para los valores de selección múltiple ilustrada. Normalizar no autoriza: el proveedor aún debe rechazar opciones desconocidas, aplicar los límites de selección y calcular los precios en el servidor. No conviertas arrays arbitrarios de entrada en valores simples para tipos de campo ajenos.

Integración del importe mostrado

hs_po_quote_display_amounts(array $amounts, array $quote, WC_Product $product, int $quantity): array se ejecuta después de la conversión estándar de impuestos de visualización de WooCommerce. Conserva las claves numéricas base, extras y total y la base fiscal aplicable a la visualización. El proveedor de productos vinculados añade los accesorios utilizando la clase fiscal propia de cada uno. Estos números describen la configuración elegida antes de descuentos del carrito y envío; modificarlos no cambia los cargos reales del carrito. Mantén este filtro coherente con el cálculo del servidor y nunca lo utilices para ocultar o duplicar un cargo.

Respuesta de validación: versión 1.0.1

Las selecciones inválidas al añadir al carrito devuelven HTTP 400 con el código hs_product_options_invalid_selection mediante Store API de WooCommerce. Esto incluye valores obligatorios ausentes, datos de selección mal formados y valores de campo inválidos. Una subsolicitud rechazada no añade ninguna línea al carrito. El punto de conexión por lotes conserva el funcionamiento por subsolicitud de WooCommerce: respuesta global 207, válida 201 e inválida 400, añadiendo solo configuraciones válidas. No es una transacción atómica para todo el lote.

Los datos de respuesta siguen siendo extensions.hs-product-options.values. Las incorporaciones clásicas de WooCommerce conservan el aviso de error al cliente y el resultado fallido. Los fallos de repositorio o almacenamiento no se presentan incorrectamente como errores de validación del cliente. No se introduce un nuevo hook público de HookSpark ni una migración de datos.