Felhasználók automatikus értesítése új termék feltöltése esetén előnézeti képe

Felhasználók automatikus értesítése új termék feltöltése esetén

| Olvasási idő: 3 perc

Ha vásárlóid egyben a rajongóid is, és tűkön ülve várják, hogy egy újabb terméked megjelenjen, ez a snippet segíthet: automatikusan értesíti minden vásárlódat akkor, ha új termék került fel a WooCommerce webshopodba. 

Egy korábbi bejegyzésben már érintettük a mai témát, igazából csak egy kis fűszerezéssel látjuk el: a mai bejegyzés nem lesz más, mint az Egyszerű értesítő plugin WordPress-hez bejegyzés, újramelegítve. 

    Rövid emlékeztető:

    • Ahogy a rendelések, úgy a termékek is post-ok, így azoknak az állapotváltozásaira is tudunk figyelni: emlékszünk, hogy a ${POST_STATUS}_${POST_HANDLE} formátumú hook-ra kell figyelnünk, jelen esetben tehát a publish_product-ra
    • WP_Query mellett létezik a WP_User_Query, amivel felhasználókat lehet lekérdezni az adatbázisból

    Tehát amit tenni fogunk: lekérdezzük (query_users_to_notify) az összes, általunk meghatározott kritériumoknak megfelelő felhasználót (jelen esetben mindenkit, akinek a szerepköre Customer), és ha találunk ilyet, akkor mindegyiknek kiküldünk egy egyszerű értesítést (meghívjuk a send_notification függvényünket, ami a wp_mail() függvény használatával kiküldi a leveleket). 

    Fontos: ahhoz, hogy a levelek biztosan célba érjenek a "rajongóinkhoz",  érdemes egy lehet egy külső SMTP szolgáltatót használni, és azt a WordPressben levélküldéshez beállítani.  

    Elég a dumából, kezdjünk neki: a megszokott módon hozzunk létre egy fájlt az mu-plugins mappánkban, nevezzük mondjuk notify_users_on_product_publish.php-nek, és másoljuk be az alábbi tartalmat:

    php
    <?php
    /*
    Plugin Name: Product publish notification
    Plugin URI: https://www.webmenedzser.hu
    Description: Notify specific user group on product publish event
    Version: 1.0
    Author: Radics Ottó
    Author URI: https://www.webmenedzser.hu
    License: GPLv3
    */
    
    function send_notification($user, $post_id) {
        $post_title = get_the_title( $post_id );
        $post_url = get_permalink( $post_id );
        $subject = 'Új termék került fel!';
    
        $message = "Kedves $user->display_name! \n\nÚj termék ($post_title) került feltöltésre, amit ide kattintva tudsz megvásárolni: $post_url";
    
        wp_mail( $user->user_email, $subject, $message );
    }
    
    function query_users_to_notify($post_id) {
        $args = array(
            'role' => 'Customer'
        );
        $user_query = new WP_User_Query( $args );
    
        if ( ! empty( $user_query->get_results() ) ) {
            foreach ( $user_query->get_results() as $user ) {
                send_notification($user, $post_id);
            }
        }
    }
    add_action( 'publish_product', 'query_users_to_notify', 10, 1 );

    Készen is vagyunk, tehát ha ezt - ne adj'Isten - az éles oldaladra dobtad fel kapásból, akkor arra figyelj, hogy csak akkor tedd közzé az újabb termékedet, ha már teljesen elkészültél a feltöltésével. 

    Figyelem! A jelen #plugout bizonyos esetekben NAGYON lelassíthatja az oldaladat, illetve nem várt mellékhatásokkal járhat: 

    • Tömeges termék import esetén a publish_product esemény sokszor történik meg (minden termék esetében egyszer), és ilyenkor mindig egyszer lekéri az összes felhasználódat, majd mindegyik felhasználónál végrehajt egy külső hívást a WordPress. Tehát: 100 regisztrált vásárló és 10 termék importja esetén 10-szer kéri le az összes felhasználót, minden lekérésnél egyesével kiküld egy levelet. Tehát viszonylag rövid időn belül kimegy 1000 levél - ez hosszabb idővel járhat ezért: figyelj a PHP timeoutra, illetve ne légy türelmetlen. :) 
    • A fentinek egy enyhébb módja egy új termék mentése esetén jelentkezik: a termék mentése a szokásosnál hosszabb ideig fog tartani, hiszen minden felhasználó esetében ki kell küldeni az értesítő levelet. 
    • Amennyiben egy külső szolgáltatót használsz a levelek kézbesítésére, a levélküldés viszonylag hosszú ideig (1-2 másodperc) is eltarthat. Ez azt jelenti, hogy ha 1000 felhasználónak küldene a rendszer levelet, akkor akár 15-20 percig is tarthat egy termék mentése. 

    A WordPress fejlesztők és felhasználók csoportban merült fel a kérdés egy posztban - köszi a témáért, Karesz!