{"id":41835,"date":"2025-11-03T23:12:47","date_gmt":"2025-11-03T23:12:47","guid":{"rendered":"https:\/\/relywp.com\/?post_type=docs&#038;p=41835"},"modified":"2025-11-15T12:21:38","modified_gmt":"2025-11-15T12:21:38","password":"","slug":"actions-et-filtres-des-developpeurs","status":"publish","type":"docs","link":"https:\/\/relywp.com\/fr\/documents\/simple-points-rewards-woocommerce\/actions-et-filtres-des-developpeurs\/","title":{"rendered":"D\u00e9veloppeurs : Actions et filtres"},"content":{"rendered":"<p>Cette page pr\u00e9sente toutes les actions publiques et tous les filtres disponibles dans la base de donn\u00e9es <strong>Simple Points &amp; Rewards (Pro)<\/strong> pour \u00e9tendre le comportement ou l'int\u00e9grer \u00e0 un code personnalis\u00e9.<\/p>\n\n\n\n<p><em>Le code fourni sur cette page n'est donn\u00e9 qu'\u00e0 titre d'exemple et doit \u00eatre utilis\u00e9 avec prudence et en effectuant des tests appropri\u00e9s.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cycle de vie des points essentiels<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Filtre : <code>spar_user_points<\/code><\/h3>\n\n\n\n<p>Modifier le solde restitu\u00e9 (affichage) pour un utilisateur.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>int $points<\/code> Solde stock\u00e9 \u00e0 partir des m\u00e9ta utilisateurs <code>Points d'\u00e9pargne<\/code>.<\/li>\n\n\n\n<li><code>int $user_id<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Exemple :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_user_points', function( $points, $user_id ) {\n    \/\/ Ajout d'un bonus virtuel de 100pt pour les administrateurs\n    if ( user_can( $user_id, 'manage_options' ) ) {\n        $points += 100 ;\n    }\n    return $points ;\n}, 10, 2 ) ;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Filtre : <code>spar_update_user_points_args<\/code><\/h3>\n\n\n\n<p>Ajuster les arguments avant l'application d'une mise \u00e0 jour des points.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, int $points, string $action, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_before_points_update<\/code><\/h3>\n\n\n\n<p>Le feu avant une mise \u00e0 jour de l'\u00e9quilibre.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, int $points, string $action, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_after_points_update<\/code><\/h3>\n\n\n\n<p>Feu apr\u00e8s une mise \u00e0 jour de l'\u00e9quilibre.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, int $new_balance, int $delta, string $action, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_points_added<\/code><\/h3>\n\n\n\n<p>Le crochet de r\u00e9trocompatibilit\u00e9 est d\u00e9clench\u00e9 lorsque des points sont ajout\u00e9s.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, int $points, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_points_supprim\u00e9s<\/code><\/h3>\n\n\n\n<p>D\u00e9clench\u00e9 lorsque des points sont retir\u00e9s.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, int $points, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Filtre : <code>spar_points_histoire_par_page<\/code><\/h3>\n\n\n\n<p>Contr\u00f4le le nombre de lignes de journal par page affich\u00e9es dans l'historique.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $per_page, int $user_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Filtre : <code>histoire_des_points_des_utilisateurs_de_spar_spar_spar_spar_spar_users_points_history<\/code><\/h3>\n\n\n\n<p>Modifier la r\u00e9ponse de l'historique assembl\u00e9.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(tableau $result, int $user_id)<\/code> o\u00f9 <code>$result = [ 'logs' =&gt; [], 'pagination' =&gt; [] ]<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_user_level_changed<\/code><\/h3>\n\n\n\n<p>D\u00e9clench\u00e9 lorsqu'un utilisateur passe \u00e0 un nouveau niveau.<\/p>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(int $user_id, array $new_level, array|null $previous_level, int $lifetime_total_earned)<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Commandes (gagner\/d\u00e9duire)<\/h2>\n\n\n\n<p>Filtres et actions permettant d'attribuer ou de supprimer des points lors d'\u00e9v\u00e9nements de commande.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>taux_de_points_de_ordre_de_spar<\/code> - Ignorer le calcul des points par unit\u00e9 mon\u00e9taire.<\/li>\n\n\n\n<li><code>points_de_base_de_l'ordre_de_spar<\/code> - Ajuster les points de base avant les paliers\/multiplicateurs.<\/li>\n\n\n\n<li><code>spar_order_fixed_points<\/code> - Ajuster les points fixes.<\/li>\n\n\n\n<li><code>multiplicateur_de_points_de_ordre_de_spar<\/code> - Ajuster le multiplicateur effectif pour l'ordre.<\/li>\n\n\n\n<li><code>points_ordre_attribu\u00e9s_spar<\/code> - Ajuster le nombre final de points attribu\u00e9s \u00e0 une commande.<\/li>\n\n\n\n<li><code>spar_order_points_action_text<\/code> - Modifier la note de journal pour les points d'ordre attribu\u00e9s.<\/li>\n\n\n\n<li><code>points d'ordre spar_before_award_order_points<\/code> \/ <code>points d'ordre spar_after_award<\/code> - Avant et apr\u00e8s l'attribution des points.<\/li>\n\n\n\n<li><code>spar_order_points_to_deduct<\/code> - Ajuster le nombre de points \u00e0 retirer en cas de remboursement ou d'annulation.<\/li>\n\n\n\n<li><code>spar_order_deduction_action_id<\/code> - Modifier l'identifiant de l'action utilis\u00e9 pour l'enregistrement des d\u00e9ductions.<\/li>\n\n\n\n<li><code>spar_order_deduction_action_text<\/code> - Modifier le message du journal pour les \u00e9v\u00e9nements de d\u00e9duction.<\/li>\n\n\n\n<li><code>spar_after_deduct_order_points<\/code> - Feu apr\u00e8s d\u00e9duction des points en raison d'une modification de l'\u00e9tat de la commande.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Remboursement et bons<\/h2>\n\n\n\n<p>Hooks relatifs \u00e0 l'\u00e9change de r\u00e9compenses, \u00e0 la cr\u00e9ation de bons et au flux d'\u00e9change frontal.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_before_reward_redemption<\/code> - Avant de traiter un \u00e9change de primes.<\/li>\n\n\n\n<li><code>objet_de_la_r\u00e9compense_de_la_spar<\/code> - Ajustez le tableau des r\u00e9compenses avant la logique.<\/li>\n\n\n\n<li><code>points_de_r\u00e9compense_de_co\u00fbt_de_spar<\/code> - Modifier le nombre de points requis.<\/li>\n\n\n\n<li><code>spar_can_redeem_reward<\/code> - Autoriser ou refuser le rachat.<\/li>\n\n\n\n<li><code>spar_reward_redemption_refunded<\/code> - Renvoy\u00e9 en cas d'\u00e9chec du rachat et rembours\u00e9.<\/li>\n\n\n\n<li><code>spar_after_reward_redemption<\/code> - Apr\u00e8s un rachat r\u00e9ussi.<\/li>\n\n\n\n<li><code>spar_reward_voucher_meta<\/code> - Modifier le coupon de r\u00e9duction m\u00e9ta.<\/li>\n\n\n\n<li><code>spar_reward_voucher_created<\/code> - Lors de la cr\u00e9ation d'un poste de coupon.<\/li>\n\n\n\n<li><code>spar_voucher_claimed<\/code> - Lorsqu'un bon est r\u00e9clam\u00e9.<\/li>\n<\/ul>\n\n\n\n<p><strong>Crochets d'int\u00e9gration frontale :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_before_handle_redeem_request<\/code><\/li>\n\n\n\n<li><code>spar_redeem_product_redirect_url<\/code><\/li>\n\n\n\n<li><code>spar_redeem_success_redirect<\/code><\/li>\n\n\n\n<li><code>spar_before_apply_coupon_from_query<\/code> \/ <code>spar_after_apply_coupon_from_query<\/code><\/li>\n\n\n\n<li><code>spar_ajax_before_apply_voucher<\/code> \/ <code>spar_ajax_after_apply_voucher<\/code><\/li>\n\n\n\n<li><code>spar_voucher_deferred<\/code>, <code>spar_voucher_pending_invalid<\/code>, <code>spar_voucher_auto_applied<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Courriels<\/h2>\n\n\n\n<p>Crochet g\u00e9n\u00e9rique de r\u00e9sultat d'envoi d'email partag\u00e9 par tous les types :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Action : <code>spar_email_sent<\/code><\/h3>\n\n\n\n<p><strong>Param\u00e8tres :<\/strong> <code>(string $type, bool $sent, string $to, string $subject, int $user_id, string $context_id)<\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Type $<\/code>: <code>points_gagn\u00e9s<\/code> | <code>voucher_claimed<\/code><\/li>\n\n\n\n<li><code>$context_id<\/code>: Pour les points_gagn\u00e9s, c'est <code>$action_id<\/code>; pour voucher_claimed, il s'agit du <code>code_voucher<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Filtres :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_email_points_earned_subject<\/code><\/li>\n\n\n\n<li><code>spar_email_points_earned_body<\/code><\/li>\n\n\n\n<li><code>spar_email_voucher_claimed_subject<\/code><\/li>\n\n\n\n<li><code>spar_email_voucher_claimed_body<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Niveaux<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ic\u00f4nes de badges spar_badge<\/code><\/li>\n\n\n\n<li><code>tous_les_niveaux<\/code><\/li>\n\n\n\n<li><code>Niveau de l'utilisateur<\/code><\/li>\n\n\n\n<li><code>spar_user_next_level<\/code><\/li>\n\n\n\n<li><code>progr\u00e8s_niveau_de_spar<\/code><\/li>\n\n\n\n<li><code>multiplicateur de points spar_utilisateur<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Mon compte \/ Shortcode UI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_rewards_menu_label<\/code><\/li>\n\n\n\n<li><code>\u00e9l\u00e9ments de menu du compte spar<\/code> - Filtre le tableau de menu final apr\u00e8s l'insertion.<\/li>\n\n\n\n<li><code>spar_rewards_overview_html<\/code><\/li>\n\n\n\n<li><code>spar_rewards_visible_tabs<\/code><\/li>\n\n\n\n<li><code>spar_before_rewards_tab<\/code><\/li>\n\n\n\n<li><code>onglet spar_after_rewards_tab<\/code><\/li>\n\n\n\n<li><code>spar_render_tab_{key}<\/code> - Cl\u00e9s : <code>gagner<\/code>, <code>demande<\/code>, <code>niveaux<\/code>, <code>l'histoire<\/code>, <code>bons<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Coupons (liste administrative)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Filtre : <code>Pr\u00e9fixes des coupons spar_r\u00e9compense<\/code><\/h3>\n\n\n\n<p>Ajustez les pr\u00e9fixes des codes de coupon qui sont masqu\u00e9s dans le tableau de la liste des coupons par d\u00e9faut (par exemple, les bons de r\u00e9compense, les coupons de parrainage).<\/p>\n\n\n\n<p><strong>Par d\u00e9faut :<\/strong> <code>['gift-', 'voucher-', 'ref-' ]<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Exemples rapides<\/h2>\n\n\n\n<p><strong>Attribution de 50 points suppl\u00e9mentaires sur toutes les commandes pass\u00e9es pour le r\u00f4le VIP :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_order_awarded_points', function( $points, $order_id, $user_id ) {\n    if ( user_can( $user_id, 'vip_customer' ) ) {\n        $points += 50 ;\n    }\n    return $points ;\n}, 10, 3 ) ;<\/code><\/pre>\n\n\n\n<p><strong>Il faut 20% points en moins pour obtenir une r\u00e9compense lors du Black Friday :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_reward_cost_points', function( $cost, $reward, $user_id ) {\n    if ( date( 'm-d' ) === '11-28' ) {\n        $cost = (int) round( $cost * 0.8 );\n    }\n    return max( 1, $cost );\n}, 10, 3 );<\/code><\/pre>\n\n\n\n<p><strong>Remplacer l'objet et le corps de l'e-mail de r\u00e9clamation de bons d'\u00e9tudes :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_email_voucher_claimed_subject', function( $subject, $ctx ) {\n    return 'Votre bon est en ligne ! Code : ' . $ctx['voucher_code'] ;\n}, 10, 2 ) ;\n\nadd_filter( 'spar_email_voucher_claimed_body', function( $body, $ctx ) {\n    return wpautop('Utilisez votre code \u00e0 la caisse pour \u00e9conomiser. Profitez-en!') ;\n}, 10, 2 ) ;<\/code><\/pre>\n\n\n\n<p><strong>R\u00e9agir aux mont\u00e9es en niveau :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_action( 'spar_user_level_changed', function( $user_id, $new_level, $prev_level ) {\n    \/\/ Etiqueter dans le CRM, etc.\n}, 10, 3\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fonctions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Gestion des points (ajout\/suppression programmatique)<\/h3>\n\n\n\n<p><strong><code>spar_update_user_points( int $user_id, int $points, string $action, string $note = '', string $action_id = 'custom' )<\/code><\/strong><\/p>\n\n\n\n<p>Mise \u00e0 jour du solde d'un utilisateur et insertion d'une ligne de journal.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>$action<\/code>: <code>'add' (ajouter)'<\/code> ou <code>'supprimer'<\/code><\/li>\n\n\n\n<li><code>$note<\/code>texte court plac\u00e9 dans le relev\u00e9 de points (stock\u00e9 sous forme aseptis\u00e9e)<\/li>\n\n\n\n<li><code>$action_id<\/code>Cl\u00e9 de machine stable : cl\u00e9 de machine stable pour l'\u00e9v\u00e9nement, par exemple <code>commande_remboursement<\/code>, <code>s'inscrire<\/code>, <code>prime d'examen<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Exemples :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * Ajoutez 50 points avec une note de journal claire et une cl\u00e9 d&#039;action personnalis\u00e9e.\n *\/\n$user_id = get_current_user_id() ;\nif ( $user_id ) {\n    $points = absint( 50 ) ;\n    $note = sanitize_text_field( &#039;Promo Bonus&#039; ) ;\n    $action_id = sanitize_key( &#039;promo_bonus&#039; ) ;\n\n    spar_update_user_points( $user_id, $points, &#039;add&#039;, $note, $action_id ) ;\n}\n\n\/**\n * Supprimer 30 points (par exemple, ajustement manuel de l&#039;administrateur).\n *\/\n$user_id = 123 ;\n$points = absint( 30 ) ;\n$note = sanitize_text_field( &#039;Ajustement manuel&#039; ) ;\n$action_id = sanitize_key( &#039;admin_adjust&#039; ) ;\n\nspar_update_user_points( $user_id, $points, &#039;remove&#039;, $note, $action_id ) ;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Calculs des points de commande (pour les aper\u00e7us\/estimations)<\/h3>\n\n\n\n<p>Des aides pour calculer les m\u00eames valeurs que celles utilis\u00e9es par le plugin lors de l'attribution des points de commande.<\/p>\n\n\n\n<p>Utile pour afficher \u201cVous gagnerez X points\u201d sur les pages de produits ou de paniers.<\/p>\n\n\n\n<p><strong><code>spar_get_order_points_rate( string $currency_code = '' ) : float<\/code><\/strong><\/p>\n\n\n\n<p>Renvoie les points par unit\u00e9 mon\u00e9taire de 1,0 apr\u00e8s les r\u00e9glages et les filtres.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$rate = (float) spar_get_order_points_rate( get_woocommerce_currency() ) ;<\/code><\/pre>\n\n\n\n<p><strong><code>spar_calculate_order_base_points( WC_Order $order ) : int<\/code><\/strong><\/p>\n\n\n\n<p>Points bas\u00e9s sur les d\u00e9penses avant les multiplicateurs et les niveaux.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$order = wc_get_order( $order_id ) ;\n$base = (int) spar_calculate_order_base_points( $order ) ;<\/code><\/pre>\n\n\n\n<p><strong><code>spar_calculate_fixed_order_points_for_total( float $total, string $currency ) : array<\/code><\/strong><\/p>\n\n\n\n<p>Les retours de r\u00e9sultats \u00e0 niveau fixe :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>points<\/code> (int) points d'\u00e9chelon actuels<\/li>\n\n\n\n<li><code>delta_suivant<\/code> (float|null) d\u00e9penses n\u00e9cessaires pour atteindre le niveau suivant<\/li>\n\n\n\n<li><code>points_suivants<\/code> (int|null) points gagn\u00e9s au niveau suivant<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cart-&gt;get_total( 'edit' ) ; \/\/ Ou votre propre total.\n$info = spar_calculate_fixed_order_points_for_total( $total, get_woocommerce_currency() ) ;\n$current_points = (int) $info['points'] ;<\/code><\/pre>\n\n\n\n<p><strong>Exemple : \u201cVous gagnerez X points\u201d sur les pages de produits<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nadd_action( &#039;woocommerce_single_product_summary&#039;, function() {\n    if ( ! is_user_logged_in() || empty( WC()-&gt;cart ) ) {\n        retour ;\n    }\n\n    $currency = get_woocommerce_currency() ;\n    $rate = (float) spar_get_order_points_rate( $currency ) ;\n\n    si ( $rate &lt;= 0 ) {\n        return;\n    }\n\n    global $product;\n\n    $price    = (float) wc_get_price_excluding_tax( $product );\n    $estimate = (int) floor( $price * $rate );\n\n    if ( $estimate &gt; 0 ) {\n        echo &#039;&lt;p class=&quot;spar-estimate&quot;&gt;&#039; . esc_html(\n            sprintf(\n                __(&#039;Gagnez environ %d points pour cet article&#039;, &#039;simple-points-and-rewards&#039; ),\n                $estimate\n            )\n        ) . &#039;&lt;\/p&gt;&#039;;\n    }\n}, 25 );<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Aide aux niveaux<\/h3>\n\n\n\n<p><strong><code>spar_get_user_points_multiplier( int $user_id ) : float<\/code><\/strong><\/p>\n\n\n\n<p>Renvoie le multiplicateur actuel bas\u00e9 sur le niveau, ou <code>1.0<\/code> si les niveaux sont d\u00e9sactiv\u00e9s.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$multiplier = function_exists( &#039;spar_get_user_points_multiplier&#039; )\n    ? (float) spar_get_user_points_multiplier( get_current_user_id() )\n    : 1.0 ;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Attribution\/d\u00e9duction li\u00e9e aux commandes (d\u00e9clenchement manuel)<\/h3>\n\n\n\n<p>Le plugin attribue ou d\u00e9duit automatiquement les prix sur les \u00e9v\u00e9nements de la commande en fonction des param\u00e8tres. Pour ex\u00e9cuter la logique d'attribution manuellement :<\/p>\n\n\n\n<p><strong><code>spar_award_order_points( int $order_id ) : void<\/code><\/strong><\/p>\n\n\n\n<p>Idempotent si les points sont d\u00e9j\u00e0 stock\u00e9s dans l'ordre m\u00e9ta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ A utiliser avec pr\u00e9caution ; normalement contr\u00f4l\u00e9 par les param\u00e8tres et les crochets.\nspar_award_order_points( (int) $order_id ) ;<\/code><\/pre>\n\n\n\n<p><strong><code>spar_deduct_refunded_order_points( int $order_id ) : void<\/code><\/strong><\/p>\n\n\n\n<p>D\u00e9duit les points pr\u00e9c\u00e9demment attribu\u00e9s pour les commandes rembours\u00e9es, annul\u00e9es ou \u00e9chou\u00e9es, lorsque cette option est activ\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nspar_deduct_refunded_order_points( (int) $order_id ) ;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">R\u00e9compenses personnalis\u00e9es<\/h3>\n\n\n\n<p>Vous pouvez cr\u00e9er une r\u00e9compense de type \u201cPersonnalis\u00e9e (Crochet du d\u00e9veloppeur)\u201d dans l'onglet Param\u00e8tres des r\u00e9compenses. Une r\u00e9compense personnalis\u00e9e vous permet de d\u00e9duire des points et d'ex\u00e9cuter votre propre logique lorsque le client la r\u00e9clame.<\/p>\n\n\n\n<p>Domaines :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Br\u00e8ve description - affich\u00e9e aux clients dans la liste des moyens de remboursement.<\/li>\n\n\n\n<li>ID de r\u00e9compense du d\u00e9veloppeur - identifiant unique en minuscules (lettres, chiffres, traits d'union, traits de soulignement) que vous pouvez utiliser pour distinguer plusieurs r\u00e9compenses personnalis\u00e9es.<\/li>\n<\/ul>\n\n\n\n<p>Crochet renvoy\u00e9 apr\u00e8s une r\u00e9clamation r\u00e9ussie et une d\u00e9duction de points :<br><code>spar_custom_reward_claimed( $user_id, $developer_id, $reward_array, $points_spent )<\/code><\/p>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_action( 'spar_custom_reward_claimed', function( $user_id, $developer_id, $reward, $points_spent ) {\n  if ( 'vip_access' === $developer_id ) {\n    \/\/ Octroi du r\u00f4le VIP, ou d\u00e9finition d'un m\u00e9ta-flagrant utilisateur\n    $user = get_user_by( 'ID', $user_id ) ;\n    if ( $user &amp;&amp; ! in_array( 'vip', $user-&gt;roles, true ) ) {\n      $user-&gt;add_role( 'vip' ) ;\n    }\n    \/\/ Facultatif : notifier l'utilisateur\n    wp_mail( $user-&gt;user_email, 'VIP Access Granted', 'Enjoy your new VIP benefits!' ) ;\n  }\n}, 10, 4 ) ;<\/code><\/pre>\n\n\n\n<p>Si votre logique \u00e9choue et que vous devez rembourser des points, appelez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spar_update_user_points( $user_id, $points_spent, 'add', 'Refund : custom reward failed', 'redeem_refund' ) ;<\/code><\/pre>\n\n\n\n<p>Cela permet au plugin de rester flexible pour des types de r\u00e9compenses sur mesure. .<\/p>","protected":false},"excerpt":{"rendered":"<p>Cette page pr\u00e9sente toutes les actions et tous les filtres publics disponibles dans Simple Points &amp; Rewards (Pro) pour \u00e9tendre le comportement ou l'int\u00e9grer \u00e0 un code personnalis\u00e9. Le code fourni sur cette page n'est donn\u00e9 qu'\u00e0 titre d'exemple et doit \u00eatre utilis\u00e9 avec prudence et en effectuant des tests appropri\u00e9s. Cycle de vie des points Filtre : spar_user_points Modifier le solde affich\u00e9 pour un utilisateur. [...]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"https:\/\/relywp.com\/fr\/documents\/simple-points-rewards-woocommerce\/actions-et-filtres-des-developpeurs\/\">Lire la suite...<span class=\"screen-reader-text\"> des d\u00e9veloppeurs : Actions et filtres<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":"","_links_to":"","_links_to_target":""},"doc_category":[55],"doc_tag":[],"knowledge_base":[52],"class_list":["post-41835","docs","type-docs","status-publish","hentry","doc_category-developers","knowledge_base-simple-points-rewards-woocommerce"],"acf":[],"year_month":"2026-04","word_count":1616,"total_views":"760","reactions":{"happy":"0","normal":"0","sad":"0"},"author_info":{"name":"Elliot Sowersby","author_nicename":"elliot","author_url":"https:\/\/relywp.com\/fr\/author\/elliot\/"},"doc_category_info":[{"term_name":"Developers","term_url":"https:\/\/relywp.com\/fr\/documents\/simple-points-rewards-woocommerce\/developpeurs\/"}],"doc_tag_info":[],"knowledge_base_info":[{"term_name":"Simple Points and Rewards","term_url":"https:\/\/relywp.com\/fr\/documents\/simple-points-rewards-woocommerce\/","term_slug":"simple-points-rewards-woocommerce"}],"knowledge_base_slug":["simple-points-rewards-woocommerce"],"_links":{"self":[{"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/docs\/41835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/comments?post=41835"}],"version-history":[{"count":15,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/docs\/41835\/revisions"}],"predecessor-version":[{"id":42372,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/docs\/41835\/revisions\/42372"}],"wp:attachment":[{"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/media?parent=41835"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/doc_category?post=41835"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/doc_tag?post=41835"},{"taxonomy":"knowledge_base","embeddable":true,"href":"https:\/\/relywp.com\/fr\/wp-json\/wp\/v2\/knowledge_base?post=41835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}