po wywołaniu wp_mail otrzymuje X wiadomości o tej samej treści.

0

Witam,

Jestem w trakcie tworzenia swojego pierwszego pluginu do WP, plugin ma generować formularz rezerwacji, z możliwością jej opłacenia przez api dotpay'a.
Założyłem że identyfikator płatności generowany i zwracany do mnie przez dotpay, będzie też identyfikatorem rezerwacji, przez co wymusiło to wysyłanie maila z podsumowaniem dopiero po wykonanej płatności.

Zgodnie z zasadą działania API dotpaya, w pewnym miejscu witryny wywołuję shortcode który odwołuje się do funkcji weryfikującej płatność i wykonującej następne czynności w przypadku powodzenia.

Tak wygląda moja definicja Shortcode'u

function DefineShorcode(){
	ob_start();
    DotpayCallback();
	return ob_get_clean();
}
add_shortcode('ReservationShortcode', 'DefineShorcode');

tak wygląda sama funkcja wywoływana przez shortcode:

function DotpayCallback() {
    $plugin= new plugin_class();

    $verification = verifyCallback();  // zwraca wartość true lub false;

    if($verification == true && $_POST['operation_status'] == 'completed') {
        $data = array(
            'id' => $_POST['operation_number'],
            'control' => $_POST['control'],
            'cs' => 1
        );
        // confirms reservation
        $plugin->ConfirmReservation($data);

        sendMail($_POST['operation_number']); // kod tej funkcji poniżej

    }

    if($_POST['operation_status'] == 'rejected' || $_POST['operation_status'] == 'fail'){
        $data = array(
            'id' => $_POST['operation_number'],
            'control' => $_POST['control'],
            'cs' => 2
        );
        $plugin->ConfirmReservation($data);
    }
}

Tak z kolei wygląda funkcja w której korzystam z funkcji wp_mail():

function sendMail($data){
$plugin= new plugin_class();

    // it gets all updated data about current reservation
    $info = $plugin->GetReservationInfo($data)[0];

    // it prepares me array with parameters to, subject, msg
    $msgHTML = $plugin->PrepareOrderHTMLmsg($info); // przygotowuje teść wiadomości

    // adding headers to array
    $headers = array('Content-Type: text/html; charset=UTF-8','From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>');

    // Send the e-mail:
    wp_mail( $msgHTML['send_to'], $msgHTML['subject'], $msgHTML['msg'] , $headers );
}

w żadnym miejscu nie mam wywołanej pętli (wliczając w to funkcje zastosowane we wskazanych fragmentach kodu których kodu w tym poście nie przytoczyłem), a pomimo to dostaje wiele wiadomości o tej samej treści. Co może być tego przyczyną?

0

Być może masz wywoływany ten kod kilka razy przez wordpressa? Być może masz renderowanych kilka formularzy na stronie? Upewnij się że faktycznie wp_mail jest wołana raz. Zapnij się debuggerem (jeśli umiesz z niego korzystać) albo walnij echo "sending mail..."; i zobacz ile razy faktycznie woła się ta funkcja. Jeśli zobaczysz "sending mail..." kilka razy to jesteś w domu.

0

Żeby było zabawniej, używam tej funkcji wysyłającej maila w 2 miejscach.
Pierwszym jest to automatyczne wysyłanie maili po powrocie z dotpay'a na swoją stronę,
Drugim z kolei jest w panelu administratora tam gdzie listuje rezerwacje, mam zdefiniowany button, po którego naciśnięciu wysyła się formularz z parametrem id i wysyłam ponownie wiadomość.

W przypadku pierwszym wiadomość idzie X razy, w przypadku drugim wiadomość idzie tylko raz.

żeby nie być gołosłownym kod wywołania funkcji przez button:

if(isset($_POST['re_send_confirmation'])) {
        $id = $_POST['id'];
        sendMail($id);
    }

czyli na zdrowy chłopski rozum wynikałoby, że problem leży gdzieś w funkcji DotpayCallback(), jednak za cholerę nie mogę namierzyć co może to powodować.

próbowałem dodać zarówno zwykłe php'owe die(), jak i wp_die() zaraz po wywołaniu funkcji sendMail() w funkcji DotpayCallback(), efekt pozostaje ten sam.

0

To może zamiast echo (wordpress może przemilczeć output), spróbuj dodać tą linijkę

file_put_contents('logi z maila.txt', 'sending mail' . PHP_EOL, FILE_APPEND | LOCK_EX);

Dodaj ją tylko przy funkcji która faktycznie wysyła mail (tej wp_mail), zobacz ile tych logów jednorazowo się dodaje.

Polecam też: https://codex.wordpress.org/Debugging_in_WordPress

0

dodałem, tak jak wspomniałeś

file_put_contents('logi z maila.txt', 'sending mail' . PHP_EOL, FILE_APPEND | LOCK_EX);

zaraz po wysłaniu wypluł do pliku 2 wiersze, od tamtej pory ich trochę przybyło na chwilę obecną jest ich 12

0
sharminte napisał(a):

zaraz po wysłaniu wypluł do pliku 2 wiersze, od tamtej pory ich trochę przybyło na chwilę obecną jest ich 12

Mogłoby to sugerować że zostało wysłanych 12 maili, tyle faktycznie przyszło?

0
TomRiddle napisał(a):
sharminte napisał(a):

zaraz po wysłaniu wypluł do pliku 2 wiersze, od tamtej pory ich trochę przybyło na chwilę obecną jest ich 12

Mogłoby to sugerować że zostało wysłanych 12 maili, tyle faktycznie przyszło?

jest takie prawdopodobieństwo, przy ostatnio odebranej ilości spamu idzie się pogubić :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1