【问题标题】:Can the order of Ninja Forms actions be changed?Ninja Forms 动作的顺序可以更改吗?
【发布时间】:2020-03-21 16:51:44
【问题描述】:

我正在尝试从 Ninja Forms 提交中获取一个值,然后根据已提交的值(它是隐藏字段中的附件 ID)操纵成功消息操作以使用 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);

【问题讨论】:

    标签: php wordpress ninja-forms


    【解决方案1】:

    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);
    

    【讨论】:

    • 嘿,我有这个想法,但它似乎没有改变。虽然我有两个优先级是 10 和 20,所以也许 20 还不够高,但它似乎并没有改变任何东西,我不知道要走多高。我实际上为解决此问题所做的不是在成功消息中显示链接,而是实际上创建了另一个电子邮件操作来发送给收件人,并将链接包含在其中。然后我创建了一个 $GLOBAL 变量来传递到电子邮件中。我想我实际上也可以使用这种方法对成功消息做同样的事情......
    【解决方案2】:

    您可以使用ninja_forms_submission_actions 过滤器来调整操作的顺序/位置。

    ninja_forms_run_action_settings 在执行每个单独的操作之前触发不同,ninja_forms_submission_actions 而是在任何操作执行之前触发

    在您的ninja_forms_submission_actions 函数中,您会收到一个包含所有操作和$form_data 变量的$actions 数组。该函数需要按照执行顺序返回一个动作数组。

    因此,如果您想将给定的操作作为最后一个操作执行,您可以循环 $actions 数组,直到找到您想要重新定位的操作。保存它的副本并将其从活动阵列中删除。然后在完成循环后将其再次添加到最后。返回新更新的数组,一切就绪!

    这是我用来确保管理员电子邮件在所有操作结束时触发的实际代码(其操作 ID 为 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 中与动作处理相关的官方源材料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      相关资源
      最近更新 更多