Tutta la documentazione · Panoramica del plugin
Hook e riferimenti per sviluppatori
Documentazione della versione 1.0.4.
Si applica al candidato locale 0.1.0-alpha.1 . Sono i contratti del codice corrente, non una promessa che un’API alpha non pubblicata resti immutata. I namespace PHP mantengono la grafia storica HoockSpark; gli hook pubblici usano hs_po_. Non rinominare le chiavi persistenti durante le personalizzazioni.
Come un’opzione arriva all’ordine
Il repository seleziona i gruppi attivi usando prodotto, variante e visitatore verificati. Il motore valida la configurazione, valuta le dipendenze dai campi precedenti, normalizza i valori e calcola i prezzi extra. I campi nascosti sono omessi. Gli adattatori del carrello rivalutano i prezzi di catalogo invece di fidarsi degli importi inviati dal browser. L’adattatore checkout scrive metadati leggibili nella riga ordine e una copia privata _hs_po_snapshot con le opzioni acquistate e il relativo prezzo extra.
Non modificare mai i prezzi nel browser come sostituto del calcolo sul server. Non scrivere mai direttamente in hs_po_groups_v1 da una richiesta pubblica. Le rotte dell’editor verificano permessi e nonce; l’archivio usa una revisione ottimistica per impedire aggiornamenti persi. Le classi interne non sono un’API pubblica generale di persistenza.
Hook di estensione PHP
Il primo argomento di un filtro è il risultato corrente. Conservalo per le definizioni non gestite dal tuo componente. Registra la callback indicando esplicitamente quanti argomenti accetta.
| Hook | Argomenti nell’ordine | Risultato o azione richiesti |
|---|---|---|
hs_po_field_configuration_error | $error, $field | null accetta un tipo personalizzato; una stringa identifica un errore di configurazione. Il valore predefinito è unsupported_type. |
hs_po_field_value | $result, $field, $value, $context | Restituisci un array con una stringa value e display; il valore facoltativo extra deve essere finito e non negativo. Restituisci ['error' => 'code'] per rifiutare. |
hs_po_render_field | $field, $id, $name | Mostra il controllo personalizzato eseguendo l’escape di ogni valore dinamico. Usa ID e nome dell’input forniti. È un’azione, non un filtro che restituisce HTML. |
hs_po_pricing_configuration_error | $error, $pricing | null accetta la configurazione del prezzo; altrimenti restituisci un codice di errore. |
hs_po_pricing_unit_extra | $result, $pricing, $value, $base, $quantity | Supplemento intero o decimale finito e non negativo per unità. Sostituisce il supplemento base del campo; gli extra delle scelte continuano a sommarsi. |
hs_po_condition_configuration_error | $error, $condition, $fields, $index | null accetta condizioni composte. Valida i riferimenti ai campi precedenti e limita il numero delle condizioni. |
hs_po_condition_visible | $visible, $condition, $values | Solo il valore true rende visibile il campo composto. I valori sono selezioni validate disponibili fino a quel punto. |
hs_po_steps_configuration_error | $error, $group | null accetta i passaggi del gruppo; altrimenti indica un codice di errore di configurazione. |
Le callback dei valori dei campi personalizzati ricevono una stringa senza spazi iniziali e finali. I valori obbligatori vuoti vengono rifiutati prima della callback; quelli facoltativi vuoti sono omessi. Lo schema comune valida comunque ID, etichetta, obbligatorietà, prezzo e limiti standard del campo. Il componente personalizzato deve validare ogni proprietà aggiuntiva che introduce.
$context contiene attualmente dati forniti dal server: product_id e group_id quando viene chiamato tramite Quote. Chiamate dirette al motore e anteprime non salvate possono fornire un contesto vuoto. Se il componente richiede un contesto verificato, rifiutane l’assenza invece di leggere ID da $_POST. Il quarto argomento è aggiuntivo: i componenti esistenti registrati per tre argomenti continuano a funzionare.
$base è il prezzo unitario di catalogo sulla relativa base fiscale, prima degli extra di Product Options & Add-Ons. WooCommerce resta responsabile di imposte e totali mostrati. Ripetere il calcolo con gli stessi dati deve dare lo stesso risultato: non incrementare un prezzo prodotto già modificato.
Esempio: codice di riferimento validato
Il codice qui sotto è un esempio completo di componente. Inseriscilo in un plugin dedicato al sito, caricato insieme a Product Options & Add-Ons; non modificare il pacchetto del prodotto. Accetta lettere, cifre e trattini fino a 32 caratteri, li converte in maiuscolo e mostra un input di testo nativo.
Una definizione di campo che usa il componente è:
array(
'id' => 'reference',
'type' => 'acme_reference',
'label' => 'Project reference',
'required' => true,
'price' => 2,
)Con prezzo di catalogo 20, il riferimento abc-42 diventa ABC-42. Due unità costano 44 prima degli effetti di imposte e sconti del carrello. Riferimento mancante, spazi, markup e stringhe oltre 32 caratteri vengono rifiutati. L’esempio viene provato direttamente da development/tests/product-options/documented-hook-native.php; non scrive impostazioni.
Questo registra un componente, non una nuova voce nel menu dei tipi di campo dell’editor. Va esteso anche l’editor per creare la definizione. Evita configurazioni che il negozio può mostrare ma che il venditore non può comprendere o modificare.
Eventi di estensione dell’editor
Gli eventi vengono emessi su document. Registra i listener prima dell’inizializzazione dell’editor Free. Il pacchetto Pro usa una dipendenza esplicita degli script per garantire l’ordine.
| Evento | Dettaglio | Scopo |
|---|---|---|
hs-po-editor-field | card, field, index, group, input, mark, render, conditionHandled | Aggiungi controlli al campo corrente. Segnala le bozze cambiate e aggiorna il rendering quando cambia la struttura. Imposta conditionHandled soltanto quando sostituisci i controlli delle condizioni. |
hs-po-editor-group | area, group, input, mark, render | Aggiungi controlli a livello di gruppo. |
hs-po-editor-ready | merge(groups) | Aggiungi all’editor bozze di gruppo validate; l’unione restituisce successo o fallimento e non le salva. |
hs-po-condition | condition, values, visible | Valutazione delle condizioni composte nel frontend. Imposta visible in modo sincrono. La validazione sul server resta il riferimento. |
Usa textContent per etichette controllate dagli utenti e controlli nativi con etichetta. Un componente di condizioni nel browser richiede anche i corrispondenti filtri di configurazione e visibilità sul server. JavaScript da solo non può autorizzare un acquisto.
Richieste REST e persistenza
Namespace: hs-product-options/v1. Usa l’autenticazione tramite cookie WordPress con X-WP-Nonce e un account autorizzato a gestire WooCommerce. Non incorporare credenziali amministrative negli script del frontend.
Le rotte correnti includono gruppi, ricerca e anteprima della bozza; Pro aggiunge esportazione e anteprima di importazione. Quest’ultima restituisce bozze disabilitate oppure requires_mapping per i riferimenti tra siti. Ogni associazione di destinazione viene validata prima di restituire le bozze. L’anteprima di importazione non è un salvataggio.
Gestisci i conflitti di revisione ricaricando lo stato salvato e conservando la bozza del venditore per il confronto. Non ritentare automaticamente con una nuova revisione sovrascrivendo il lavoro di un altro editor. I limiti di dimensione delle richieste vengono applicati prima dell’elaborazione.
Integrazioni dei file protetti
I file non sono allegati media pubblici. Le opzioni contengono un riferimento opaco legato alla titolarità della sessione sul server e al prodotto, gruppo e campo esatti. L’associazione all’ordine è separata, così i nuovi tentativi di checkout non consumano un riferimento pendente del carrello. Scaricare dall’ordine richiede un venditore autenticato, un nonce di ordine e articolo, metadati coerenti e permessi sull’ordine.
Non mostrare riferimenti grezzi dei caricamenti nelle email, non esporre contenuti binari del database tramite endpoint pubblici personalizzati e non considerare il possesso di un riferimento come autorizzazione. L’archivio corrente è privato nel database; l’eliminazione definitiva dell’ordine libera i file senza riferimenti, mentre il Cestino li conserva. I download del venditore richiedono permessi sull’ordine e un’associazione valida alla riga; i riferimenti privati non sono URL media pubblici.
Disattivazione di Pro e limiti delle integrazioni
Senza il componente necessario per campo Pro, prezzo avanzato, condizione composta o layout a passaggi, la validazione dello schema blocca l’operazione. Le definizioni restano. Un acquisto interessato non deve perdere senza avviso personalizzazioni obbligatorie o tornare a un prezzo inferiore. Le prove effettive di disattivazione e riattivazione in rete hanno superato i controlli di acquisto Free e blocco Pro senza perdita di dati. L’interfaccia completa di recupero per il venditore resta una verifica di rilascio; non si dichiara che ogni gruppo Free resti acquistabile in qualsiasi configurazione mista.
L’integrazione Dynamic Pricing usa il filtro hs_pricing_catalog_unit_price per fornire la base appena calcolata con gli extra delle opzioni dopo il ripristino dei totali precedenti. Non aggiungere gli stessi extra di nuovo in un altro filtro prezzo. Min/Max continua a validare quantità e importi del carrello Woo. Le dichiarazioni di compatibilità richiedono prove sulle versioni esatte.
Contratto delle risposte REST amministrative
| Richiesta | Messaggio di conferma | Errori da gestire |
|---|---|---|
GET /groups | Copia dello stato salvato con revisione e gruppi | 401/403 accesso negato; 409 schema salvato incompatibile |
PUT /groups | Stato salvato dopo il controllo ottimistico della revisione | 400 revisione o gruppi malformati; 413 corpo oltre 1 MB; 422 errori associati ai campi; 409 revisione in conflitto |
POST /draft-preview | Markup, validazione e anteprima calcolata senza salvataggio | Controlli di accesso e prodotto ed errori di validazione; l’anteprima non è mai un salvataggio |
GET /export (Pro) | Documento di configurazione salvata con versione | Errori di accesso o schema salvato |
POST /import-preview (Pro) | Nuovi gruppi disabilitati oppure requires_mapping | 400 formato, 413 dimensione, 422 associazione o gruppo non validi |
PUT sostituisce l’intera raccolta dei gruppi, non un singolo gruppo. Leggi lo stato corrente, conserva i gruppi estranei alla modifica, lavora su una copia locale e invia la revisione originale con la raccolta completa. Non inviare mai una raccolta vuota per provare la connessione: una richiesta valida e autorizzata eliminerebbe tutti i gruppi salvati. Con 422, data.fields associa i percorsi dei campi ai codici di errore; conserva la bozza e collega i messaggi ai controlli. Con 409 offri confronto o ricaricamento invece di sovrascrivere senza avviso un altro editor.
L’esempio completo del componente è stato rieseguito sul runtime locale corrente: sette controlli superati per accettazione dello schema, valore normalizzato in maiuscolo, totale 44, valori non validi e nomi del rendering. Anche le sei rotte amministrative rifiutano richieste HTTP reali anonime (401); questo non verifica ogni combinazione di nonce autenticato o ruolo.
Valutazione multipart dei file nella bozza
L’endpoint di anteprima accetta anche dati di modulo multipart: una stringa JSON draft con il normale contenuto dell’anteprima e file caricati indicizzati per ID del campo. I limiti sono 1 MiB per JSON, 10 file e 10 MiB complessivi, oltre alle regole del campo e ai limiti PHP e server. Autenticazione e permessi sui prodotti non cambiano.
Soltanto questo endpoint fornisce il contesto interno del motore draft_preview/draft_files . Il componente di caricamento Pro richiede is_uploaded_file() e riusa UploadPolicy. Restituisce un valore temporaneo per visualizzazione e calcolo, non un riferimento riutilizzabile di caricamento nel negozio. I file non vengono spostati nell’archivio, nei media o negli ordini. Non accettare questi indicatori di contesto dai valori pubblici del carrello; le integrazioni personalizzate devono conservare la distinzione. L’accettazione multipart e nel browser autenticato ha verificato successo PNG, rifiuto di contenuto non valido e recupero il 20 settembre 2026.
Esempio completo di componente
<?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);
Indice del manuale · Prova gli esempi →
Aggiunte sperimentali in alpha.18
Questi hook sono aggiuntivi, disponibili con WordPress caricato e non costituiscono ancora un’API stabile tra versioni:
hs_po_option_snapshot(array $item, array $field): array: viene eseguito per ogni campo selezionato visibile e validato durante il calcolo del preventivo. Conserva chiavi obbligatorie e importi calcolati; Pro aggiunge il valore facoltativosku. Qui non c’è un controllo di permessi: i preventivi vengono calcolati anche per i clienti del negozio. Non leggere dati riservati e non fidarti di input non sanitizzati in questo filtro.hs_po_field_metadata_error($error, array $field): estensione della validazione dello schema; restituisci l’errore precedente o un codice di errore. Pro valida i codici facoltativi di campo e scelta usandoinvalid_option_sku.hs_po_admin_tabs(array $tabs): array: aggiunge identificatore ed etichetta di una scheda all’elenco consentito della navigazione amministrativa.hs_po_admin_tab(string $tab): void: mostra il contenuto della scheda di estensione. Ogni estensione deve controllare i propri permessi ed eseguire l’escape dell’output; i report Pro richiedonomanage_woocommerce.
Nella riga ordine, _hs_po_snapshot lo schema2 aggiunge base, quantity, currency, catalog_includes_tax; le voci degli articoli aggiungono pricing_mode, once_extra e il valore Pro facoltativo sku. Mantieni compatibili le letture dello schema1. Questi metadati sono una copia immutabile dell’acquisto, non un endpoint supportato di scrittura diretta. Gli ordini storici non vengono migrati.
L’adattatore batch della Woo Store API mantiene il contratto esistente: ogni sottorichiesta fornisce extensions.hs-product-options.values indicizzato con i propri ID gruppo. I test REST nativi provano due prodotti diversi e un batch misto valido e non valido: 207 complessivo, 201 valido, 4xx non valido e aggiunta della sola configurazione valida. Questo non stabilisce una transazione atomica tutto o niente e non sostituisce prove HTTP su sessioni e nonce.
In alpha.18 i valori item_data del carrello includono HTML con escape dentro uno span hs-po-cart-value per una presentazione circoscritta in Woo Classic e Blocks. Chi richiede testo semplice deve rimuovere il markup. I metadati di visualizzazione salvati negli ordini restano testo semplice.
Hook di espansione — contratti del candidato locale
Queste aggiunte non sono un rilascio di API pubbliche stabili. Registra le callback soltanto quando il plugin pertinente è disponibile, conserva i valori ricevuti se la callback non si applica e non fidarti mai di prezzi o ID media inviati dal browser.
hs_po_pricing_configuration_error
Il filtro esistente riceve ora un terzo argomento facoltativo: la definizione del campo a cui è associato. Le callback esistenti a due argomenti restano compatibili. Gli argomenti sono errore precedente o null, array dei prezzi e array del campo. Restituisci null solo per una definizione supportata e valida; altrimenti restituisci un codice di errore. La modalità Pro customer_amount richiede un campo Numero e valori finiti non negativi minimum e maximum , con massimo non inferiore al minimo.
hs_po_cart_line_quote
Argomenti: array del preventivo verificato, chiave del carrello, array nativo dell’articolo e WC_Cart. Restituisci un array completo del preventivo. L’adattatore dei prodotti collegati rimuove i costi degli accessori dalla riga principale perché WooCommerce addebita separatamente le righe figlie native. Non rimuovere errori di validazione né duplicare i costi degli accessori nelle integrazioni successive.
hs_po_cart_product
Argomenti: clone isolato di WC_Product per questa riga e array del preventivo verificato. Restituisci un oggetto WC_Product. L’adattatore della foto selezionata applica al clone il riferimento all’allegato della copia validata. Non salvare mai l’oggetto: rappresenta una riga del carrello, non un aggiornamento del catalogo. Evita di modificare oggetti di catalogo condivisi o presumere che il preventivo non abbia errori.
hs_po_option_snapshot
Il filtro esistente della copia dei dati supporta anche product_image_id compilato dalle scelte visive validate del venditore. Il riferimento viene copiato nei metadati privati dell’ordine _hs_po_snapshot con le componenti economiche. Non viene accettato come parametro attendibile del cliente. I consumatori devono gestire copie più vecchie senza questa proprietà e allegati non più esistenti.
Campi di sola visualizzazione e anteprime dei gruppi
hs_po_field_is_display_only riceve il booleano precedente e la definizione del campo. True esclude il campo editoriale dalla valutazione di valore e prezzo. Non usarlo per saltare la validazione di un dato acquistato.
hs_po_render_group_preview è un’azione che riceve gruppo validato e ID gruppo. Esegui l’escape per il contesto HTML. Pro lo usa per livelli limitati di testo e immagine. hs_po_composite_configuration_error valida la configurazione composita facoltativa; l’assenza del supporto deve restare un errore invece di ignorare senza avviso una definizione non supportata.
Trasporto della modifica dal carrello
L’azione Pro wc-ajax=hs_po_edit accetta soltanto POST e usa la sessione Woo corrente. Richiede l’esistente chiave del carrello key, un nonce legato a sessione e stato della riga e valori annidati values. Omettere i valori significa cancellare tutte le scelte facoltative, non aggirare i campi obbligatori. Il server ricalcola da gruppi e catalogo salvati e rifiuta modifiche dirette alle righe figlie.
Un nonce scaduto, una riga sconosciuta, un metodo non valido o un’altra sessione non possono selezionare il carrello di un altro cliente. Il nonce include quantità e scelte: non è un lock del database e da solo non serializza scritture simultanee delle sessioni Woo. Configurazioni non valide restituiscono, quando disponibili, messaggi localizzati per campo e conservano il carrello precedente. Non implementare nuovi tentativi POST automatici dopo un errore di rete dall’esito ambiguo: ricarica prima il carrello.
Disponibilità della finestra modale
hs_po_modal_available(bool $available): bool è false per impostazione predefinita. Il componente Pro installato lo abilita indipendentemente dal diritto al rinnovo. Il rendering sul server usa il contenuto direttamente nella pagina quando non è disponibile, anche se una definizione salvata richiede la finestra modale. Le definizioni restano strutturalmente valide e invariate, conservando il comportamento alla riattivazione. È soltanto un adattamento della presentazione: campi o componenti di prezzo non supportati continuano a fallire la validazione.
Il frontend emette hs-po-refresh su document prima di ricalcolare i campi visibili, con detail.container e detail.refresh. Pro registra il controller della presentazione modale su questo evento. Le estensioni devono evitare di chiamare refresh in modo sincrono a ogni notifica, creando ricorsione. L’evento del candidato locale non è un’API pubblica stabile.
Normalizzazione dell’input
hs_po_normalize_field_input($value, array $field) riceve valore inviato e definizione del campo prima della conversione scalare, rimozione degli spazi e verifica dell’obbligatorietà. Conserva i valori dei tipi di campo non gestiti dal componente. Restituisci stringa, intero o decimale; gli altri tipi vengono rifiutati come invalid_value. Pro usa questo passaggio per valori di scelte multiple illustrate. Normalizzare non significa autorizzare: il componente deve ancora rifiutare scelte sconosciute, applicare limiti di selezione e calcolare i prezzi sul server. Non appiattire array arbitrari di input per tipi di campo estranei.
Integrazione degli importi visualizzati
hs_po_quote_display_amounts(array $amounts, array $quote, WC_Product $product, int $quantity): array viene eseguito dopo la conversione standard WooCommerce per la visualizzazione delle imposte. Conserva le chiavi numeriche base, extras e total e la base fiscale applicabile. Il componente dei prodotti collegati aggiunge gli accessori con la classe fiscale di ciascuno. I numeri descrivono la configurazione scelta prima di sconti del carrello e spedizione; modificarli non cambia gli addebiti effettivi. Mantieni il filtro coerente con il calcolo sul server e non usarlo per nascondere o duplicare un costo.
Risposta di validazione — versione 1.0.1
Selezioni non valide all’aggiunta al carrello restituiscono HTTP400 con codice hs_product_options_invalid_selection tramite WooCommerce Store API. Include valori obbligatori mancanti, selezioni malformate e valori di campo non validi. Una sottorichiesta rifiutata non aggiunge righe. Il batch mantiene la semantica WooCommerce per sottorichiesta: 207 complessivo, 201 valido e 400 non valido, con aggiunta delle sole configurazioni valide; non è una transazione atomica sull’intero batch.
Il contenuto della risposta resta extensions.hs-product-options.values. Le aggiunte classiche WooCommerce mantengono l’avviso di errore al cliente e il risultato di aggiunta fallita. Errori del repository o dell’archivio non vengono attribuiti erroneamente alla validazione del cliente. Non vengono introdotti nuovi hook pubblici HookSpark o migrazioni dei dati.