{"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":"entwickleraktionen-und-filter","status":"publish","type":"docs","link":"https:\/\/relywp.com\/de\/docs\/einfache-punkte-belohnungen-woocommerce\/entwickleraktionen-und-filter\/","title":{"rendered":"Entwickler: Aktionen und Filter"},"content":{"rendered":"<p>Diese Seite dokumentiert alle \u00f6ffentlichen Aktionen und Filter, die in <strong>Einfache Punkte und Belohnungen (Pro)<\/strong> um das Verhalten zu erweitern oder mit benutzerdefiniertem Code zu integrieren.<\/p>\n\n\n\n<p><em>Der auf dieser Seite zur Verf\u00fcgung gestellte Code dient nur als Beispiel und sollte mit Vorsicht und nach entsprechender Pr\u00fcfung verwendet werden.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lebenszyklus der Kernpunkte<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Filter: <code>spar_benutzer_punkte<\/code><\/h3>\n\n\n\n<p>\u00c4ndern Sie den zur\u00fcckgegebenen (angezeigten) Saldo f\u00fcr einen Benutzer.<\/p>\n\n\n\n<p><strong>Parameter:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>int $points<\/code> Gespeicherter Saldo aus der Benutzer-Meta <code>_spar_points<\/code>.<\/li>\n\n\n\n<li><code>int 1TP4Benutzer_id<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Beispiel:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_user_points', function( $points, $user_id ) {\n    \/\/ Hinzuf\u00fcgen eines virtuellen 100pt Vorschau-Bonus f\u00fcr Administratoren\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\">Filter: <code>spar_update_user_points_args<\/code><\/h3>\n\n\n\n<p>Argumente anpassen, bevor eine Punktaktualisierung durchgef\u00fchrt wird.<\/p>\n\n\n\n<p><strong>Parameter:<\/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\">Aktion: <code>spar_before_points_update<\/code><\/h3>\n\n\n\n<p>Feuern Sie vor einer Aktualisierung des Gleichgewichts.<\/p>\n\n\n\n<p><strong>Parameter:<\/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\">Aktion: <code>spar_after_points_update<\/code><\/h3>\n\n\n\n<p>Feuer nach einer Balance-Aktualisierung.<\/p>\n\n\n\n<p><strong>Parameter:<\/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\">Aktion: <code>spar_points_added<\/code><\/h3>\n\n\n\n<p>Back-Compat-Haken, der beim Hinzuf\u00fcgen von Punkten ausgel\u00f6st wird.<\/p>\n\n\n\n<p><strong>Parameter:<\/strong> <code>(int $user_id, int $points, string $note, string $action_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aktion: <code>spar_points_removed<\/code><\/h3>\n\n\n\n<p>Wird ausgel\u00f6st, wenn Punkte entfernt werden.<\/p>\n\n\n\n<p><strong>Parameter:<\/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\">Filter: <code>spar_points_history_per_page<\/code><\/h3>\n\n\n\n<p>Steuern Sie, wie viele Protokollzeilen pro Seite im Verlauf angezeigt werden.<\/p>\n\n\n\n<p><strong>Parameter:<\/strong> <code>(int $per_page, int $user_id)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Filter: <code>spar_user_points_history<\/code><\/h3>\n\n\n\n<p>\u00c4ndern Sie die zusammengestellte Antwort auf die Historie.<\/p>\n\n\n\n<p><strong>Parameter:<\/strong> <code>(Array $result, int $user_id)<\/code> wobei <code>$result = [ 'logs' =&gt; [], 'pagination' =&gt; [] ]<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aktion: <code>spar_user_level_changed<\/code><\/h3>\n\n\n\n<p>Wird ausgel\u00f6st, wenn ein Benutzer in eine neue Ebene wechselt.<\/p>\n\n\n\n<p><strong>Parameter:<\/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\">Auftr\u00e4ge (verdienen\/abziehen)<\/h2>\n\n\n\n<p>Filter und Aktionen f\u00fcr die Vergabe oder den Entzug von Punkten bei Bestellvorg\u00e4ngen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_bestellung_punkte_rate<\/code> - \u00dcberschreiben Sie die Berechnung der Punkte pro W\u00e4hrungseinheit.<\/li>\n\n\n\n<li><code>spar_order_base_points<\/code> - Basispunkte vor Tiers\/Multiplikatoren anpassen.<\/li>\n\n\n\n<li><code>spar_order_fixed_points<\/code> - Anpassung der Punkte der festen Ebene.<\/li>\n\n\n\n<li><code>spar_order_points_multiplikator<\/code> - Anpassung des effektiven Multiplikators f\u00fcr den Auftrag.<\/li>\n\n\n\n<li><code>spar_order_awarded_points<\/code> - Anpassung der f\u00fcr eine Bestellung vergebenen Endpunkte.<\/li>\n\n\n\n<li><code>spar_order_points_action_text<\/code> - \u00c4ndern Sie die Protokollnotiz f\u00fcr vergebene Auftragspunkte.<\/li>\n\n\n\n<li><code>spar_before_award_order_points<\/code> \/ <code>spar_after_award_order_points<\/code> - Vor und nach der Punktevergabe.<\/li>\n\n\n\n<li><code>spar_bestellung_punkte_abzuziehen<\/code> - Stellen Sie ein, wie viele Punkte bei Erstattung oder Stornierung entfernt werden sollen.<\/li>\n\n\n\n<li><code>spar_order_deduction_action_id<\/code> - \u00c4ndern Sie die f\u00fcr das Abzugsprotokoll verwendete Aktions-ID.<\/li>\n\n\n\n<li><code>spar_order_deduction_action_text<\/code> - Protokollmeldung f\u00fcr Abzugsereignisse \u00e4ndern.<\/li>\n\n\n\n<li><code>spar_nach_Abzug_von_Bestellpunkten<\/code> - Feuer nach Abzug von Punkten aufgrund der \u00c4nderung des Auftragsstatus.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Einl\u00f6sung &amp; Gutscheine<\/h2>\n\n\n\n<p>Hooks f\u00fcr die Einl\u00f6sung von Pr\u00e4mien, die Erstellung von Gutscheinen und den Front-End-Einl\u00f6sefluss.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_vor_belohnung_wiedereinl\u00f6sung<\/code> - Vor der Bearbeitung einer Pr\u00e4mieneinl\u00f6sung.<\/li>\n\n\n\n<li><code>spar_belohnung_objekt<\/code> - Passen Sie das Belohnungsfeld vor der Logik an.<\/li>\n\n\n\n<li><code>spar_belohnung_kosten_punkte<\/code> - \u00c4ndern Sie, wie viele Punkte erforderlich sind.<\/li>\n\n\n\n<li><code>spar_can_redeem_reward<\/code> - R\u00fccknahme zulassen oder verweigern.<\/li>\n\n\n\n<li><code>spar_belohnung_zuruecknahme_erstattet<\/code> - Wird entlassen, wenn die Einl\u00f6sung fehlschl\u00e4gt und erstattet.<\/li>\n\n\n\n<li><code>spar_nach_belohnung_wiedereinl\u00f6sung<\/code> - Nach erfolgreicher Einl\u00f6sung.<\/li>\n\n\n\n<li><code>spar_belohnung_gutschein_meta<\/code> - \u00c4ndern Sie die Metadaten f\u00fcr den Gutschein.<\/li>\n\n\n\n<li><code>spar_belohnung_gutschein_erstellt<\/code> - Wenn der Coupon erstellt wird.<\/li>\n\n\n\n<li><code>spar_voucher_claimed<\/code> - Wenn ein Gutschein in Anspruch genommen wird.<\/li>\n<\/ul>\n\n\n\n<p><strong>Frontend-Integrationshaken:<\/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\">E-Mails<\/h2>\n\n\n\n<p>Generischer Haken f\u00fcr das Ergebnis des E-Mail-Versands, der f\u00fcr alle Typen gilt:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aktion: <code>spar_email_gesendet<\/code><\/h3>\n\n\n\n<p><strong>Parameter:<\/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>$-Typ<\/code>: <code>Punkte_verdient<\/code> | <code>Gutschein_eingel\u00f6st<\/code><\/li>\n\n\n\n<li><code>$Kontext_id<\/code>: F\u00fcr points_earned ist dies <code>$action_id<\/code>; f\u00fcr voucher_claimed ist dies der <code>gutschein_code<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Filter:<\/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\">Ebenen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_badge_icons<\/code><\/li>\n\n\n\n<li><code>spar_alle_ebenen<\/code><\/li>\n\n\n\n<li><code>spar_user_level<\/code><\/li>\n\n\n\n<li><code>spar_user_next_level<\/code><\/li>\n\n\n\n<li><code>spar_level_fortschritt<\/code><\/li>\n\n\n\n<li><code>spar_benutzer_punkte_multiplikator<\/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\">Mein Konto \/ Shortcode UI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spar_pr\u00e4mien_menu_label<\/code><\/li>\n\n\n\n<li><code>spar_account_menu_items<\/code> - Endg\u00fcltiges Men\u00fcfeld nach dem Einf\u00fcgen filtern.<\/li>\n\n\n\n<li><code>spar_pr\u00e4mien_uebersicht_html<\/code><\/li>\n\n\n\n<li><code>spar_pr\u00e4mien_sichtbare_tabs<\/code><\/li>\n\n\n\n<li><code>spar_before_rewards_tab<\/code><\/li>\n\n\n\n<li><code>spar_nach_belohnungen_tab<\/code><\/li>\n\n\n\n<li><code>spar_render_tab_{key}<\/code> - Schl\u00fcssel: <code>verdienen<\/code>, <code>Anspruch<\/code>, <code>Ebenen<\/code>, <code>Geschichte<\/code>, <code>Gutscheine<\/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\">Gutscheine (Admin-Liste)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Filter: <code>spar_belohnung_gutschein_pr\u00e4fixe<\/code><\/h3>\n\n\n\n<p>Passen Sie an, welche Gutscheincode-Pr\u00e4fixe in der Standard-Coupon-Liste ausgeblendet werden (z. B. Pr\u00e4miengutscheine, Empfehlungsgutscheine).<\/p>\n\n\n\n<p><strong>Standard:<\/strong> <code>[ 'Geschenk-', 'Gutschein-', 'Erstattung-' ]<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schnelle Beispiele<\/h2>\n\n\n\n<p><strong>Vergeben Sie pauschal 50 Extrapunkte auf alle abgeschlossenen Auftr\u00e4ge f\u00fcr die VIP-Rolle:<\/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>Sie ben\u00f6tigen 20% weniger Punkte, um eine Pr\u00e4mie am Black Friday einzul\u00f6sen:<\/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>Ersetzen Sie den Betreff und den Text der E-Mail mit dem beanspruchten Voucher:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'spar_email_voucher_claimed_subject', function( $subject, $ctx ) {\n    return 'Ihre Verg\u00fcnstigung ist aktiviert! Code: ' . $ctx['voucher_code'];\n}, 10, 2 );\n\nadd_filter( 'spar_email_voucher_claimed_body', function( $body, $ctx ) {\n    return wpautop( 'Verwenden Sie Ihren Code an der Kasse, um zu sparen!' );\n}, 10, 2 );<\/code><\/pre>\n\n\n\n<p><strong>Reagiere auf Levelaufstiege:<\/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    \/\/ Tag in 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\">Funktionen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Punkteverwaltung (programmatisch hinzuf\u00fcgen\/entfernen)<\/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>Aktualisieren Sie den Saldo eines Benutzers und f\u00fcgen Sie eine Protokollzeile ein.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>$action<\/code>: <code>'hinzuf\u00fcgen'<\/code> oder <code>'entfernen'<\/code><\/li>\n\n\n\n<li><code>$note<\/code>: Kurzer Text im Punkteprotokoll (bereinigt gespeichert)<\/li>\n\n\n\n<li><code>$action_id<\/code>: stabiler Maschinenschl\u00fcssel f\u00fcr das Ereignis, zum Beispiel <code>Bestellung_Erstattung<\/code>, <code>Anmeldung<\/code>, <code>pr\u00fcfungs_bonus<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Beispiele:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * 50 Punkte mit einem eindeutigen Protokollvermerk und einer benutzerdefinierten Aktionstaste hinzuf\u00fcgen.\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 * 30 Punkte entfernen (z.B. manuelle Admin-Anpassung).\n *\/\n$user_id = 123;\n$points = absint( 30 );\n$note = sanitize_text_field( &#039;Manuelle Anpassung&#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\">Berechnung der Bestellpunkte (f\u00fcr Vorschauen\/Sch\u00e4tzungen)<\/h3>\n\n\n\n<p>Helfer, um die gleichen Werte zu berechnen, die das Plugin bei der Vergabe von Bestellpunkten verwendet.<\/p>\n\n\n\n<p>N\u00fctzlich, um auf Produkt- oder Warenkorbseiten \u201cSie erhalten X Punkte\u201d anzuzeigen.<\/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>Gibt Punkte pro 1,0 W\u00e4hrungseinheit nach Einstellungen und Filtern zur\u00fcck.<\/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>Ausgabenbasierte Punkte vor Multiplikatoren und R\u00e4ngen.<\/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>Das Ergebnis ist auf einer festen Ebene angesiedelt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Punkte<\/code> (int) aktuelle Stufenpunkte<\/li>\n\n\n\n<li><code>n\u00e4chstes_delta<\/code> (float|null) Ausgaben, die zum Erreichen der n\u00e4chsten Stufe erforderlich sind<\/li>\n\n\n\n<li><code>n\u00e4chste_Punkte<\/code> (int|null) Punkte f\u00fcr die n\u00e4chste Stufe<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cart-&gt;get_total( 'edit' ); \/\/ Oder Ihre eigene Summe.\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>Beispiel: \u201cSie erhalten X Punkte\u201d auf Produktseiten<\/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;Wagen ) ) {\n        zur&uuml;ck;\n    }\n\n    $currency = get_woocommerce_currency();\n    $rate = (float) spar_get_order_points_rate( $currency );\n\n    wenn ( $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;Verdienen Sie ungef&auml;hr %d Punkte f&uuml;r diesen Artikel&#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\">Niveaustufen-Helfer<\/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>Gibt den aktuellen stufenbasierten Multiplikator zur\u00fcck, oder <code>1.0<\/code> wenn die Ebenen deaktiviert sind.<\/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\">Zuschlag\/Abzug gebunden an Auftr\u00e4ge (manueller Ausl\u00f6ser)<\/h3>\n\n\n\n<p>Das Plugin vergibt automatisch Pr\u00e4mien oder zieht sie bei Bestellungsereignissen ab, je nach den Einstellungen. Um die Pr\u00e4mienlogik manuell auszuf\u00fchren:<\/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, wenn die Punkte bereits im Auftrag meta gespeichert sind.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ Mit Vorsicht zu verwenden; normalerweise durch Einstellungen und Hooks gesteuert.\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>Zieht zuvor vergebene Punkte f\u00fcr erstattete, stornierte oder fehlgeschlagene Bestellungen ab, sofern aktiviert.<\/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\">Individuelle Belohnungen<\/h3>\n\n\n\n<p>Sie k\u00f6nnen auf der Registerkarte Belohnungseinstellungen eine Belohnung des Typs \u201cBenutzerdefiniert (Entwicklerhaken)\u201d erstellen. Bei einer benutzerdefinierten Belohnung k\u00f6nnen Sie Punkte abziehen und dann Ihre eigene Logik ausf\u00fchren, wenn der Kunde sie einfordert.<\/p>\n\n\n\n<p>Felder:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kurzbeschreibung - wird den Kunden in der Liste der Einl\u00f6sem\u00f6glichkeiten angezeigt.<\/li>\n\n\n\n<li>Entwickler-Belohnungs-ID - eindeutige Kennung in Kleinbuchstaben (Buchstaben, Zahlen, Bindestriche, Unterstriche), die Sie zur Unterscheidung mehrerer benutzerdefinierter Belohnungen verwenden k\u00f6nnen.<\/li>\n<\/ul>\n\n\n\n<p>Haken nach erfolgreicher Klage und Punktabzug entlassen:<br><code>spar_custom_reward_claimed( $user_id, $developer_id, $reward_array, $points_spent )<\/code><\/p>\n\n\n\n<p>Beispiel:<\/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    \/\/ Gew\u00e4hrung der VIP-Rolle oder Setzen eines Benutzer-Metaflags\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    \/\/ Optional: Benutzer benachrichtigen\n    wp_mail( $user-&gt;user_email, 'VIP-Zugang gew\u00e4hrt', 'Genie\u00dfen Sie Ihre neuen VIP-Vorteile!' );\n  }\n}, 10, 4 );<\/code><\/pre>\n\n\n\n<p>Wenn Ihre Logik versagt und Sie Punkte zur\u00fcckerstatten m\u00fcssen, rufen Sie an:<\/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>Dadurch bleibt das Plugin flexibel f\u00fcr ma\u00dfgeschneiderte Belohnungsarten. .<\/p>","protected":false},"excerpt":{"rendered":"<p>Diese Seite dokumentiert alle \u00f6ffentlichen Aktionen und Filter, die in Simple Points &amp; Rewards (Pro) verf\u00fcgbar sind, um das Verhalten zu erweitern oder mit benutzerdefiniertem Code zu integrieren. Der auf dieser Seite zur Verf\u00fcgung gestellte Code dient nur als Beispiel und sollte mit Vorsicht und nach sorgf\u00e4ltiger Pr\u00fcfung verwendet werden. Kernpunkte-Lebenszyklus Filter: spar_user_points \u00c4ndern Sie den zur\u00fcckgegebenen (angezeigten) Saldo f\u00fcr einen Benutzer. [...]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"https:\/\/relywp.com\/de\/docs\/einfache-punkte-belohnungen-woocommerce\/entwickleraktionen-und-filter\/\">Weiterlesen ...<span class=\"screen-reader-text\"> von Entwicklern: Aktionen und Filter<\/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":"749","reactions":{"happy":"0","normal":"0","sad":"0"},"author_info":{"name":"Elliot Sowersby","author_nicename":"elliot","author_url":"https:\/\/relywp.com\/de\/author\/elliot\/"},"doc_category_info":[{"term_name":"Developers","term_url":"https:\/\/relywp.com\/de\/docs\/einfache-punkte-belohnungen-woocommerce\/entwickler\/"}],"doc_tag_info":[],"knowledge_base_info":[{"term_name":"Simple Points and Rewards","term_url":"https:\/\/relywp.com\/de\/docs\/einfache-punkte-belohnungen-woocommerce\/","term_slug":"simple-points-rewards-woocommerce"}],"knowledge_base_slug":["simple-points-rewards-woocommerce"],"_links":{"self":[{"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/docs\/41835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/comments?post=41835"}],"version-history":[{"count":15,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/docs\/41835\/revisions"}],"predecessor-version":[{"id":42372,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/docs\/41835\/revisions\/42372"}],"wp:attachment":[{"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/media?parent=41835"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/doc_category?post=41835"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/doc_tag?post=41835"},{"taxonomy":"knowledge_base","embeddable":true,"href":"https:\/\/relywp.com\/de\/wp-json\/wp\/v2\/knowledge_base?post=41835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}