SaveTo Wishlist pour WooCommerce
Commencer
Comment étendre le registre SaveTo Wishlist avec des hooks et l'API REST - SaveTo Wishlist
  1. Accueil
  2. Base de connaissances
  3. Liste de souhaits
  4. Guides développeur
  5. Comment étendre SaveTo Wishlist Registry avec des hooks et l'API REST
  1. Accueil
  2. Base de connaissances
  3. Registre
  4. Comment étendre SaveTo Wishlist Registry avec des hooks et l'API REST

Comment étendre SaveTo Wishlist Registry avec des hooks et l'API REST

Vous créez une intégration personnalisée avec des registres cadeaux, ou vous modifiez le comportement des registres sur votre boutique ? SaveTo Wishlist Registry ajoute des hooks PHP et des routes d'API REST qui vous permettent de faire les deux sans modifier les fichiers du plugin. Cet article répertorie les routes, qui peut les appeler, ce que les routes publiques retournent, et les hooks que vous pouvez utiliser, avec des exemples fonctionnels.

Pour la référence développeur du plugin de base, consultez Comment étendre SaveTo Wishlist avec des hooks et l'API REST.

Avant de commencer

  • SaveTo Wishlist Registry (répertorié dans WordPress sous le nom SaveTo Wishlist Gift Registry Addon) nécessite que WooCommerce et SaveTo Wishlist Lite soient actifs. Il est inclus dans les plans Plus et Business et possède sa propre clé de licence, distincte de SaveTo Wishlist Pro.
  • Chaque nom de hook commence par stwreg_. Ajoutez votre code à un petit plugin ou au fichier functions.php d'un thème enfant.
  • Les hooks et les routes de cet article existent dans SaveTo Wishlist Registry 1.0.0.
  • Les données du registre résident dans des tables personnalisées qui utilisent le préfixe de votre table WordPress : wp_stw_registries, wp_stw_registry_items, wp_stw_registry_purchases et wp_stw_registry_contributions. Utilisez les hooks et les routes ci-dessous au lieu d'écrire directement dans ces tables.

Comment fonctionne l'API REST

Toutes les routes utilisent l'espace de noms saveto-wishlist-registry/v1. Sur un site à l'adresse https://example.com, l'URL de base complète est https://example.com/wp-json/saveto-wishlist-registry/v1/.

Les routes qui nécessitent un utilisateur connecté utilisent l'authentification REST standard de WordPress. Dans une session de navigateur, envoyez l'en-tête X-WP-Nonce avec un nonce wp_rest. Pour les appels serveur à serveur, utilisez un mot de passe d'application WordPress. Les routes publiques ne nécessitent aucune connexion.

La colonne « Qui peut l'appeler » dans les tableaux de routes utilise ces termes :

  • N'importe qui : aucune connexion requise.
  • Utilisateur connecté : tout compte connecté.
  • Propriétaire du registre : l'utilisateur connecté qui possède le registre dans la route, ou tout utilisateur ayant la capacité manage_woocommerce (gestionnaires de boutique et administrateurs par défaut).
  • Propriétaire de l'achat : l'utilisateur connecté qui possède le registre auquel l'achat appartient, ou tout utilisateur ayant la capacité manage_woocommerce.
  • Propriétaire ou gestionnaire de boutique (registry_id) : le propriétaire du registre donné dans le paramètre de requête registry_id, ou un utilisateur ayant la capacité manage_woocommerce. Si registry_id est manquant, seuls les utilisateurs ayant cette capacité réussissent.
  • Gestionnaire de boutique : un utilisateur ayant la capacité manage_woocommerce.

Les erreurs reviennent sous forme d'erreurs REST WordPress standard avec un code, un message et un statut HTTP. Les requêtes limitées en bande passante retournent le statut 429 avec le code rate_limited.

Routes de l'API REST

Routes publiques

MéthodeRouteQui peut l'appelerCe qu'il fait
GET/registry/searchN'importe quiRecherche les listes publiées. Paramètres de requête : name (au moins 2 caractères), event_type, page, per_page (maximum 20, par défaut 20). Limité à 30 requêtes par 5 minutes pour chaque adresse IP.
GET/registry/{url_code}N'importe quiRetourne une liste par son code public. Le code est composé de 4 à 16 lettres ou chiffres. Retourne 404 pour une liste supprimée. Les listes archivées sont toujours retournées.
GET/registry/{url_code}/itemsN'importe quiRetourne les articles d'une liste. Retourne 404 pour une liste supprimée.
POST/contributionsN'importe quiEnregistre une contribution monétaire en attente. Champs du corps : registry_id, amount, registry_item_id (facultatif), contributor_name, contributor_email, message. La liste doit être publiée et avoir la collecte de fonds activée. Retourne le nouvel id et le statut pending.

La route POST /contributions enregistre uniquement une ligne avec le statut pending. Elle n'accepte pas de paiement. Une intégration de paiement doit mettre à jour le statut elle-même.

Routes du propriétaire de la liste

MéthodeRouteQui peut l'appelerCe qu'il fait
POST/registry/convertUtilisateur connectéConvertit une liste de souhaits en une liste pour l'utilisateur actuel. Nécessite une licence active, sinon retourne 403 avec le code license_inactive. Champs du corps : collection_id, event_type, event_date, registrant_name, co_registrant_name, message, location, cover_image_attachment_id, allow_fund_pooling.
POST/registry/cover-imageUtilisateur connectéTélécharge une image de couverture sous forme de fichier multipart dans le champ file. JPEG, PNG ou WebP, jusqu'à 5 Mo. Retourne attachment_id et url.
GET/my-registriesUtilisateur connectéListe uniquement les listes appartenant à l'utilisateur actuel, y compris les gestionnaires de boutique, avec le nombre d'articles, le nombre de remerciements et un bloc stats global.
PUT/registry/{id}Propriétaire de la listeMet à jour les détails de la liste. Envoyez un corps JSON avec les champs à modifier.
SUPPRIMER/registry/{id}Propriétaire de la listeSupprime le registre. Renvoie {"deleted":true}.
POST/registre/{id}/itemsPropriétaire de la listeAjoute un produit au registre. Champs du corps : product_id (requis), variation_id, quantity (défaut 1), priority (défaut medium ; valeurs autorisées : low, medium et high).
PATCH/registre/{id}/items/reorderPropriétaire de la listeEnregistre un nouvel ordre d'articles. Champ du corps : item_ids (tableau d'ID d'articles requis). Chaque ID doit appartenir au registre.
PATCH/registre/{id}/items/{item_id}Propriétaire de la listeModifie la quantité demandée d'un article. Champ du corps : quantity. La quantité ne peut pas être inférieure au nombre déjà acheté. Renvoie 409 si le registre est archivé.
SUPPRIMER/registre/{id}/items/{item_id}Propriétaire de la listeSupprime un article. Renvoie 409 si le registre est archivé.
GET/registre/{id}/products/searchPropriétaire de la listeRecherche des produits à ajouter. Paramètres de requête : q, per_page. Limité à 60 requêtes par 5 minutes pour chaque utilisateur.
GET/registre/{id}/products/{product_id}/variationsPropriétaire de la listeListe les variations d'un produit. Limité à 60 requêtes par 5 minutes pour chaque utilisateur.

Routes d'achat et de contribution

MéthodeRouteQui peut l'appelerCe qu'il fait
GET/purchasesPropriétaire ou responsable de boutique (registry_id)Liste les achats pour un registre. Paramètres de requête : registry_id, thank_you_sent (all, true ou false), page, per_page, orderby, order. Chaque ligne contient le nom et l'e-mail de l'acheteur, donc seuls les propriétaires et les responsables de boutique peuvent la lire.
POST/purchases/{id}/notePropriétaire de l'achatEnregistre la note du propriétaire sur un achat. Champ du corps : note.
POST/purchases/{id}/thank-youPropriétaire de l'achatMarque un achat comme remercié ou non. Champ du corps : sent.
POST/purchases/bulk-thank-youPropriétaire de l'achatMarque plusieurs achats à la fois. Champs du corps : ids et sent. Pour un propriétaire, tous les ID doivent appartenir à des registres qu'il possède.
GET/contributionsPropriétaire ou responsable de boutique (registry_id)Liste les contributions pour le registre dans le paramètre de requête registry_id, les plus récentes en premier. Les lignes incluent l'e-mail du contributeur.

Routes d'administration du registre

Toutes les routes d'administration nécessitent un responsable de boutique.

MéthodeRouteCe qu'il fait
GET/admin/registriesListe les registres. Paramètres de requête : status, event_type, search, orderby, order, page, per_page, include_deleted.
GET/admin/registries/{id}Retourne un registre avec ses articles et jusqu'à 100 achats.
PUT/admin/registries/{id}Met à jour un registre en tant qu'administrateur.
SUPPRIMER/admin/registries/{id}Supprime un registre en tant qu'administrateur.
POST/admin/registries/{id}/closeArchive un registre. La page publique reste en ligne avec une bannière d'archivage.
POST/admin/registries/{id}/restoreRestaure un registre.
POST/admin/registries/bulkExécute une action sur plusieurs registres. Champs du corps : action (archive, unarchive ou delete) et ids. Retourne un résultat pour chaque ID plus les décomptes succeeded et failed.
POST/admin/registries/convertConvertit une liste de souhaits en un registre pour le propriétaire de la liste de souhaits. Champ du corps requis : collection_id. Les autres champs correspondent à /registry/convert.
GET/admin/registries/by-collectionsRecherche le registre pour chaque ID de liste de souhaits dans le paramètre de requête ids (séparé par des virgules). Retourne registry_id, url_code, status et public_url pour chaque correspondance. Les registres supprimés sont exclus.

Ce que les routes publiques exposent

Les routes publiques peuvent être appelées par n'importe qui, vérifiez donc ce qu'elles retournent avant de vous y baser.

GET /registry/{url_code} retourne l'enregistrement du registre et les données de la page de destination fusionnés en une seule réponse. Elle inclut :

  • Champs du registre : id, collection_id, owner_user_id, url_code, event_type, event_date, registrant_name, co_registrant_name, message, location, cover_image_id, allow_fund_pooling, status, previous_url_code, created_at et updated_at.
  • Champs d'affichage : title, event_type_label, event_date_iso, event_date_formatted, registrant_names, cover_image_url, cover_image_alt, is_archived, is_owner et public_url.
  • Une liste items. Chaque article contient le titre du produit, l'URL du produit, l'image, le prix formaté, la quantity et la purchased_quantity.

Lorsque l'appelant possède le registre ou est un responsable de boutique, la réponse contient également une liste event_types.

GET /registry/{url_code}/items retourne chaque article avec son ID, un bloc product (ID, ID de variation, nom, SKU, URL de la miniature, prix formaté et si le produit existe toujours), quantity_wanted, quantity_purchased, quantity_remaining, is_fully_claimed, is_archived et priority.

GET /registry/search ne retourne que les listes publiées. Chaque résultat a id, url_code, event_type, event_date, registrant_name, co_registrant_name, cover_image_id, public_url et event_date_formatted. La réponse a aussi total, page et per_page.

Aucune des routes publiques ne retourne les noms des acheteurs, les e-mails des acheteurs, les lignes d'achat, les ID de commande ou les lignes de contribution. Ceux-ci ne sont disponibles que via les routes propriétaire et administrateur. Utilisez le filtre stwreg_registry_data ci-dessous pour ajouter ou supprimer des champs de la réponse GET /registry/{url_code}. Testez votre page de liste après avoir supprimé un champ.

Hooks

Les hooks ci-dessous sont les plus utiles pour étendre le plugin. Le nombre d'arguments est exact. Lorsque vous ajoutez un hook avec plus d'un argument, passez le nombre d'arguments comme quatrième paramètre de add_filter() ou add_action().

Filtres pour les données de liste et la page de destination

FiltreArgumentsCe qu'il change
stwreg_registry_data$data (tableau), $row (objet)La réponse complète de GET /registry/{url_code}. $row est la ligne brute de la liste.
stwreg_registry_items_data$response (tableau), $row (objet)La réponse de GET /registry/{url_code}/items. Le tableau a data, total, currentPage et is_archived.
stwreg_registry_landing_data$payload (tableau), $row (objet)Les données utilisées pour construire la page de destination et la réponse REST, avant qu'elles ne soient rendues.
stwreg_search_results$results (tableau), $args (tableau)Le résultat de recherche de la liste avant qu'il ne soit retourné. Le tableau a data, total, page et per_page.
stwreg_landing_html$html (chaîne), $payload (tableau)Le HTML final de toute la page de destination de la liste.
stwreg_landing_item_card$html (chaîne), $item (tableau), $payload (tableau)Le HTML d'une carte d'article sur la page de destination.

Retournez toujours le même type que celui que vous recevez. Le plugin convertit la valeur de retour en tableau ou en chaîne.

Cet exemple ajoute un champ personnalisé à la réponse publique de la liste :

add_filter( 'stwreg_registry_data', function ( array $data, $row ) {
    $data['shipping_note'] = 'Gifts ship within 3 business days.';

    return $data;
}, 10, 2 );

Cet exemple ajoute une ligne de texte sous la page de destination :

add_filter( 'stwreg_landing_html', function ( $html, $payload ) {
    if ( ! empty( $payload['is_archived'] ) ) {
        return $html;
    }

    return $html . '<p>' . esc_html__( 'Need help choosing a gift? Contact us.', 'your-text-domain' ) . '</p>';
}, 10, 2 );

La page de destination est également construite à partir de filtres de sections plus petits, un pour chaque partie de la page. Leurs noms commencent par stwreg_landing_section_ et ils prennent $html et $payload. Les exemples sont stwreg_landing_section_header, stwreg_landing_section_message et stwreg_landing_section_footer. Pour modifier l'apparence de la page sans code, consultez Paramètres d'apparence de la page de destination de la liste.

Filtres de limitation de débit

Les routes ci-dessous limitent la fréquence à laquelle un utilisateur ou une adresse IP peut les appeler. Chaque limite possède deux filtres. L'un définit le nombre de requêtes. L'autre définit la fenêtre en secondes. Chaque filtre prend un argument et doit retourner un entier.

Filtre de limiteFiltre de fenêtrePar défautRouteCompté par
stwreg_add_item_rate_limitstwreg_add_item_rate_window30 requêtes en 5 minutesPOST /registry/{id}/itemsUtilisateur
stwreg_cover_image_rate_limitstwreg_cover_image_rate_window30 requêtes en 5 minutesPOST /registry/cover-imageUtilisateur
stwreg_convert_rate_limitstwreg_convert_rate_window5 requêtes en 5 minutesPOST /registry/convertUtilisateur
stwreg_contribute_rate_limitstwreg_contribute_rate_window10 requêtes en 5 minutesPOST /contributionsAdresse IP et registre

La limite de recherche (30 requêtes en 5 minutes pour chaque adresse IP) et les limites de recherche de produits et de variations (60 requêtes en 5 minutes pour chaque utilisateur) n'ont pas de filtre. La limite du montant de contribution a son propre filtre, stwreg_contribution_max_amount (float, par défaut 100000).

Cet exemple augmente la limite d'ajout d'éléments à 60 requêtes en 10 minutes :

add_filter( 'stwreg_add_item_rate_limit', function ( $limit ) {
    return 60;
} );

add_filter( 'stwreg_add_item_rate_window', function ( $window ) {
    return 10 * MINUTE_IN_SECONDS;
} );

Par défaut, le plugin utilise REMOTE_ADDR pour trouver l'adresse IP du visiteur pour les limites basées sur l'IP. Si votre site est derrière un proxy ou un CDN, REMOTE_ADDR est l'adresse du proxy, donc tous les visiteurs partagent une seule limite. Utilisez le filtre stwreg_trusted_ip_headers pour lister les variables serveur qui contiennent la véritable adresse IP. Ne listez que les en-têtes que votre proxy définit, car les visiteurs peuvent falsifier les autres.

add_filter( 'stwreg_trusted_ip_headers', function ( array $headers ) {
    $headers[] = 'HTTP_CF_CONNECTING_IP';

    return $headers;
} );

Actions d'achat

ActionArgumentsQuand cela s'exécute
stwreg_after_save_purchase$purchase_id (int), $payload (array)Après la création ou la mise à jour d'une ligne d'achat. Elle s'exécute pour les nouvelles lignes et pour les mises à jour d'une ligne de commande existante.
stwreg_after_void_purchase$purchase_id (int), $purchase (object), $previous_status (string), $refunded_quantity (int)Lorsqu'un achat passe à l'état annulé, par exemple après un remboursement.
stwreg_after_record_purchases_from_order$order_id (int), $order (WC_Order)Après que le plugin a traité une commande payée contenant des articles de liste. Il s'exécute même si certains articles n'ont pas pu être mis en correspondance.
stwreg_overpurchase_recorded$registry_item_id (int), $purchased_total (int), $requested_quantity (int)Après que le total des achats enregistrés pour un article est supérieur à la quantité demandée par le propriétaire.

Le tableau $payload de stwreg_after_save_purchase contient les clés suivantes : registry_id, registry_item_id, order_id, line_item_id, quantity, buyer_name, buyer_email et status. Le statut est recorded, voided ou refunded. Le plugin enregistre les achats des commandes, et il les enregistre à nouveau lorsque la même ligne de commande est traitée à nouveau. Écrivez votre gestionnaire de manière à ce qu'il puisse être exécuté deux fois pour le même achat.

add_action( 'stwreg_after_save_purchase', function ( $purchase_id, $payload ) {
    if ( 'recorded' !== $payload['status'] ) {
        return;
    }

    error_log( sprintf(
        'Registry %d: item %d bought (purchase %d).',
        $payload['registry_id'],
        $payload['registry_item_id'],
        $purchase_id
    ) );
}, 10, 2 );

Un article de liste peut se retrouver avec plus d'achats enregistrés que ce que le propriétaire a demandé, par exemple lorsque deux acheteurs finalisent leur achat en même temps. Le plugin le permet par conception. Lorsque cela se produit, il exécute stwreg_overpurchase_recorded après avoir enregistré le nouveau total. L'action peut s'exécuter à nouveau chaque fois que le plugin recalcule un article qui dépasse toujours sa quantité, alors ne supposez pas qu'elle ne s'exécute qu'une seule fois.

add_action( 'stwreg_overpurchase_recorded', function ( $registry_item_id, $purchased_total, $requested_quantity ) {
    error_log( sprintf(
        'Registry item %d: %d bought, %d requested.',
        $registry_item_id,
        $purchased_total,
        $requested_quantity
    ) );
}, 10, 3 );

Filtres et actions d'e-mail

Le plugin envoie trois e-mails : l'e-mail d'achat du propriétaire (type owner_new_purchase), l'e-mail de remboursement du propriétaire (type owner_order_refund) et l'e-mail de nouvelle liste d'administration (type admin_new_registry). Pour modifier leur contenu, consultez Comment configurer les notifications par e-mail de liste de cadeaux.

HookTypeArgumentsCe qu'il fait
stwreg_email_send_asyncFiltre$async (bool), $payload (array)Par défaut true. Lorsque vrai, le plugin met l'e-mail en file d'attente avec WP-Cron. Lorsque faux, il envoie l'e-mail dans la même requête.
stwreg_email_{type}_subjectFiltre$subject (string), $context (array), $payload (array)Modifie le sujet. Remplacez {type} par un type d'e-mail, par exemple stwreg_email_owner_new_purchase_subject.
stwreg_email_{type}_bodyFiltre$body (string), $context (array), $payload (array)Modifie le corps rendu avant l'ajout de la mise en page de l'e-mail.
stwreg_after_email_dispatchedAction$type (string), $payload (array), $success (bool)S'exécute après que le plugin a tenté d'envoyer un e-mail. $success est faux lorsque l'e-mail a été ignoré ou a échoué.

Utilisez le mode synchrone lorsque WP-Cron est désactivé sur votre site ou lorsque vous souhaitez tester un e-mail dans une seule requête :

add_filter( 'stwreg_email_send_async', '__return_false' );

Si WP-Cron est désactivé et que vous laissez la valeur par défaut, les e-mails mis en file d'attente attendent qu'un vrai cron job s'exécute.

Cet exemple modifie l'objet de l'e-mail d'achat du propriétaire :

add_filter( 'stwreg_email_owner_new_purchase_subject', function ( $subject, $context, $payload ) {
    return 'Good news: ' . $subject;
}, 10, 3 );

Pour les e-mails du propriétaire, $context inclut recipient, owner_display_name, registry (objet ligne), purchase (objet ligne), item (objet ligne), subject, owner_dashboard et public_url.

Filtres de permission REST

Chaque route exécute une vérification de permission, et chaque vérification a un filtre. Utilisez ces filtres pour rendre l'accès plus strict. Ils ne peuvent pas élargir l'accès. Si le plugin refuse une requête, le filtre ne peut pas l'autoriser. Si le plugin autorise une requête, le filtre peut toujours renvoyer une WP_Error pour la refuser.

FiltreUtilisé parArguments
stwreg_api_public_permissions_checkRoutes publiques (/registry/search, /registry/{url_code}, /registry/{url_code}/items, POST /contributions)$decision (bool ou WP_Error), $request (WP_REST_Request)
stwreg_api_logged_in_permissions_checkRoutes pour tout utilisateur connecté$decision, $request
stwreg_api_owner_permissions_checkRoutes du propriétaire de la liste$decision, $request
stwreg_api_admin_permissions_checkRoutes d'administration du registre$decision, $request

Cet exemple rend la recherche de liste disponible uniquement aux utilisateurs connectés :

add_filter( 'stwreg_api_public_permissions_check', function ( $decision, $request ) {
    $search_route = '/saveto-wishlist-registry/v1/registry/search';

    if ( $search_route === $request->get_route() && ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_forbidden',
            'Log in to search registries.',
            array( 'status' => 401 )
        );
    }

    return $decision;
}, 10, 2 );

Les routes /purchases/{id}/note, /purchases/{id}/thank-you et /purchases/bulk-thank-you utilisent leurs propres vérifications de propriété et n'exécutent pas ces filtres. GET /purchases et GET /contributions laissent passer le propriétaire de la liste sans filtre. Pour tous les autres, ils exécutent la vérification administrateur, donc stwreg_api_admin_permissions_check s'applique à eux.

Autres actions

ActionArgumentsQuand cela s'exécute
stwreg_before_convert_wishlist_to_registry$collection_id (int), $args (array)Avant qu'une liste de souhaits ne soit convertie. Voir Comment convertir une liste de souhaits en liste de cadeaux.
stwreg_after_convert_wishlist_to_registry$registry_id (int), $collection_id (int), $args (array)Après la conversion d'une liste de souhaits.
stwreg_after_add_registry_item$registry_id (int), $row (object)Après qu'un article a été ajouté à une liste.
stwreg_after_save_contribution$contribution_id (int), $registry_id (int)Après qu'une ligne de contribution a été enregistrée.

Questions fréquemment posées

Puis-je changer le préfixe de l'URL de la page de la liste ?
Oui. Le filtre stwreg_url_prefix prend le préfixe sous forme de chaîne, et stwreg_registry_public_url prend l'URL complète (chaîne) et le code public (chaîne).

Où trouver l'exportation et la suppression de la confidentialité pour les données du registre ?
Voir Comment exporter et supprimer les données du registre pour les demandes de confidentialité.

Et ensuite ?

Besoin d'aide ?

Si vous avez une question ou rencontrez un problème, nous sommes là pour vous aider.

Cet article vous a-t-il été utile ?

Articles liés

Besoin d'aide ?

Vous ne trouvez pas la réponse que vous cherchez ?
Contacter le support
Finaliser votre achat