automatisierter Email Versand Hook wird nicht erreicht

  • Moin, ich arbeite gerade an einer kleinen Funktion für meinen Woocommerce-Shop. Ich möchte den Kunden eine E-Mail senden, wenn sich die Kundengruppe geändert hat.
    Ich habe einige Beispiele gefunden, die aber nicht wirklich zufriedenstellend funktionieren.


    in meiner debug.log habe ich diese Ausgaben gefunden:
    [25-Nov-2022 18:58:56 UTC] ats_neuer_benutzer_freigeschaltet user_id:1267
    [25-Nov-2022 18:58:56 UTC] ats_neuer_benutzer_freigeschaltet VOR woocommerce_ats_customer_activated benutzerDaten->user_login:andi
    [25-Nov-2022 18:58:56 UTC] ats_neuer_benutzer_freigeschaltet NACH woocommerce_ats_customer_activated benutzerDaten->user_login:andi
    [25-Nov-2022 18:58:57 UTC] __construct
    [25-Nov-2022 18:58:57 UTC] __construct AFTER woocommerce_ats_customer_activated
    also erreicht das Programm niemals die trigger Funktion der Klasse, aber warum?.
    In den Woocommerce Einstellungen sieht es gut aus, dort kann ich alles einstellen, es wird aber keine Email verschickt.
    Warum erreicht das Programm niemals die function ats_trigger?
    Kann mir da jemand von Euch weiterhelfen?

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Code
    // in my functions.php
    add_action( 'set_user_role', 'new_role_A', 10, 3 );
     
    function new_role_A( $user_id, $role, $old_roles ) {
        if($user_id)
            {
                do_action( 'woocommerce_ats_customer_activated', $user_id );
            }
    }

    Wo kommt die user_id her?


    und wenn der Kunde keine Mail Adresse hat.

    Code
    $user      = new WP_User( $user_id );
           $recipient = $user->user_email;
           if ( '' === $recipient ) {
               return;
           }

    du verwendest WC_Customer so =>

    Code
    $customer = new WC_Customer( $user_id );
           $this->object = $customer;
    
    
           $this->recipient = $customer->get_email();


    Ich hätte vermutlich etwas wie folgendes erwartet =>

    Code
    function new_role_A($args = null ) {
           $args         = wp_parse_args( $args, array(
               'user_id' => '',
               'user'    => '',
           ) );
    
    
           $user_id      = intval( $args['user_id'] );
           $user         = ! empty( $args['user'] ) && is_a( $args['user'], 'WP_User' ) ? $args['user'] : new WP_User( $user_id );

    Mit offenen Augen träumen

  • Moin,


    Wo kommt die user_id her?


    die kommt vom Hook
    https://developer.wordpress.org/reference/hooks/set_user_role/


    und wenn der Kunde keine Mail Adresse hat.

    Code
    $user      = new WP_User( $user_id );
           $recipient = $user->user_email;
           if ( '' === $recipient ) {
               return;
           }


    das ist bei dieser Seite ein Pflichtfeld, das muss immer belegt sein.


    du verwendest WC_Customer so =>

    Code
    $customer = new WC_Customer( $user_id );
           $this->object = $customer;
    
    
           $this->recipient = $customer->get_email();


    Ich hätte vermutlich etwas wie folgendes erwartet =>

    Code
    function new_role_A($args = null ) {
           $args         = wp_parse_args( $args, array(
               'user_id' => '',
               'user'    => '',
           ) );
    
    
           $user_id      = intval( $args['user_id'] );
           $user         = ! empty( $args['user'] ) && is_a( $args['user'], 'WP_User' ) ? $args['user'] : new WP_User( $user_id );


    naja, dabei ist aber das wichtigste Problem, dass der Code niemals die Stelle
    "error_log("TRIGGER START");"
    erreicht.
    Ich verstehe halt nicht, warum nie diese Ausgabe erreicht wird. Da muss noch es noch ein gewaltiges Verständnisproblem bei mir geben...

  • Ich vermute

    Code
    do_action( 'woocommerce_ats_customer_activated', $user_id );

    wird bereits VOR der Klasse gefeuert, da

    Code
    add_action( 'set_user_role', 'new_role_A', 10, 3 );

    vor der Initiierung der Klasse Custom_WC_Email gesetzt wird. Das ist also eher ein Problem der Hook-Reihenfolge denke ich.

    Wieso initiierst Du Custom_WC_Email einfach so bei jedem Ladevorgang? Ich würde das eher in init laden, dann wäre es auch durch Wordpress gesteuert vor set_user_role denke ich. Schau dir das auch mal per error_log()-Debugging an.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!