Можно ли изменить порядок действий Ninja Forms?

Я пытаюсь получить значение из отправки Ninja Forms, а затем манипулировать действием сообщения об успехе, чтобы использовать функцию WP на основе отправленного значения (это идентификатор вложения в скрытом поле).

Однако действие «Сообщение об успехе» запускается перед действием «Электронная почта», что означает, что переменная, которую я пытаюсь установить, которая содержит значение, устанавливается ПОСЛЕ того, как происходит изменение сообщения об успешном завершении.

Мне нужно изменить порядок этих двух действий, чтобы действие «Электронная почта» запускалось перед действием «Сообщение об успешном завершении».

Кто-нибудь знает как это сделать?

function sg_download_nf_success_message($action_settings, $form_id, $action_id, $form_settings) {

    if(isset($action_settings['email_message'])) {

        $doc = new DOMDocument();
        $doc->loadHTML($action_settings['email_message']);

        $rows = $doc->getElementsbyTagName('td');
        $count = 0;
        foreach($rows as $row) {
            if($count == 15) {
                $download_id = $row->nodeValue;
            }
            $count++;
        }

    }

    if(isset($action_settings['success_msg'])) {

        global $download_id;

        $action_settings['success_msg'] = str_replace(
            '[download_link]',
            '<a href="'.wp_get_attachment_url($download_id).'" class="btn btn-outline-light">Download your item</a>',
            $action_settings['success_msg']
        );

    }

    return $action_settings;

}
add_filter('ninja_forms_run_action_settings', 'sg_download_nf_success_message', 10, 4);

person Lee    schedule 26.11.2019    source источник


Ответы (2)


Третий параметр add_filter — это приоритет. Может быть, вам поможет разделение вашего вызова на две отдельные функции add_filter с разным приоритетом?

function sg_download_nf_email_message($action_settings, $form_id, $action_id, $form_settings) {

    if(isset($action_settings['email_message'])) {

        $doc = new DOMDocument();
        $doc->loadHTML($action_settings['email_message']);

        $rows = $doc->getElementsbyTagName('td');
        $count = 0;
        foreach($rows as $row) {
            if($count == 15) {
                $download_id = $row->nodeValue;
            }
            $count++;
        }
    }
    return $action_settings;
}
add_filter('ninja_forms_run_action_settings', 'sg_download_nf_email_message', 10, 4);


function sg_download_nf_success_message($action_settings, $form_id, $action_id, $form_settings) {
    if(isset($action_settings['success_msg'])) {

        global $download_id;

        $action_settings['success_msg'] = str_replace(
            '[download_link]',
            '<a href="'.wp_get_attachment_url($download_id).'" class="btn btn-outline-light">Download your item</a>',
            $action_settings['success_msg']
        );
    }
    return $action_settings;
}
add_filter('ninja_forms_run_action_settings', 'sg_download_nf_success_message', 11, 4);
person Stefan Lindberg    schedule 26.11.2019
comment
Эй, у меня была такая идея, но, похоже, она не изменилась. Хотя у меня было два приоритета: 10 и 20, так что, возможно, 20 было недостаточно высоким, но, похоже, это ничего не меняло, и я не знал, как высоко подняться. Что я на самом деле сделал, чтобы решить эту проблему, так это то, что вместо того, чтобы показывать ссылку в сообщении об успехе, я фактически создал другое действие электронной почты для перехода к получателю и включил туда ссылку. Затем я создал переменную $GLOBAL для передачи в электронное письмо. Я полагаю, что я мог бы сделать то же самое с сообщением об успехе, используя этот метод... - person Lee; 26.11.2019

Вы можете использовать фильтр ninja_forms_submission_actions для настройки порядка/положения действий.

В отличие от ninja_forms_run_action_settings, который срабатывает перед выполнением каждого отдельного действия, ninja_forms_submission_actions вместо этого срабатывает до выполнения любого из действий.

В вашей ninja_forms_submission_actions функции вы получаете $actions массив всех действий и $form_data переменных. Функция требует возврата массива действий в том порядке, в котором они должны выполняться.

Итак, если вы хотите выполнить данное действие как последнее, вы можете зациклить массив $actions, пока не найдете действие, которое хотите изменить. Сохраните его копию и удалите из активного массива. Затем, когда закончите зацикливание, добавьте его снова в самый конец. Верните этот недавно обновленный массив, и все готово!

Вот фактический код, который я использую, чтобы гарантировать, что электронная почта администратора будет запущена в самом конце всего (его идентификатор действия равен 18). Я перестраиваю копию массива $actions в своем примере, потому что мне нужна была возможность иметь исходную копию массива для других нужд обработки.

// processed before _ANY_ actions are executed
add_filter( "ninja_forms_submission_actions", "my_ninja_forms_submission_actions", 10, 2 );

function my_ninja_forms_submission_actions($actions, $form_data) {
    
    // will hold my new sequence of actions
    $seq = null;

    // will hold my admin notification action once found in the loop
    $admin_notif_action = null;
    
    // loop the actions
    foreach($actions as $n=>$a) {
            
        if ($a["id"]==18) {

            // if this action is my admin notification then save it to my variable above
            $admin_notif_action = $a;
        }
        else {

            // append to my new sequence all other actions that aren't my admin notification
            $seq[] = $a;
        }
    }

    // finally append as the final item my admin notification and return    
    $seq[] = $admin_notif_action;
    return $seq;
}

См. также https://developer.ninjaforms.com/codex/submission-processing-hooks/ для официальных исходных материалов от Ninja Forms, связанных с обработкой действий.

person Art Geigel    schedule 29.12.2020