WP_POST不工作,保持重定向到帖子页面

时间:2021-09-02 作者:Stephynoe

我已经做了两个多星期了,我查阅了很多资源,我一直得到相同的结果;我的网站重定向到帖子页面,而不在定义的函数中执行任何操作。我正在尝试使用admin\\u POST挂钩获取$\\u POST数据的值。下面是挂钩和功能

add_action( \'admin_post_nopriv_add_foobar\', \'prefix_admin_add_foobar\' );
function prefix_admin_add_foobar() {
    status_header(200);
    $mydata = $_POST[\'data\'];
    echo \'<script>
        console.log(\'.$mydata.\');
    </script>\';
    //request handlers should exit() when they complete their task
    wp_redirect(\'somewhereelse.php\');
    exit();
}
下面是表格

<form action="<?php echo esc_url( admin_url(\'admin-post.php\') ); ?>" method="post">
   <input type="hidden" name="action" value="add_foobar">
   <input type="hidden" name="data" value="foobarid">
   <input type="submit" value="Submit">
</form>
我正在wamp localhost上测试这一点,我不知道这是否是一个因素。我也不确定是否应该在函数中添加挂钩及其函数。php或页面模板文件内部。

1 个回复
SO网友:Buttered_Toast

因为您想使用WordPress运行JS代码post 操作处理程序不会为您提供解决方案。

为此,您需要使用ajax。

我创建了一个可以复制/粘贴的小示例。

<form method="post" class="myform">
    <input type="hidden" name="action" value="add_foobar">
    <input type="hidden" name="data" value="foobarid">
    <input type="submit" value="Submit">
</form>
对于我们的表单,我删除了该操作(不需要它,因为我们将使用ajax)
还添加了一个类,以便于确定目标。

($ => {
    $(\'.myform\').on(\'submit\', e => {
        // prevent form from submit
        e.preventDefault();

        // get current element (form)
        const $this = $(e.currentTarget);

        // get form values
        const action = $this.find(\'[name="action"]\').val();
        const data   = $this.find(\'[name="data"]\').val();
    
        // send the form data to our ajax action,
        // and handle the response
        // btSystemGlobals.ajaxUrl = http://localhost/timber/wp-admin/admin-ajax.php
        // I have a property that contains the ajax endpoint
        // you can copy the url but change it accordingly
        $.ajax({
            type: "post",
            dataType: "json",
            url: btSystemGlobals.ajaxUrl, // btSystemGlobals.ajaxUrl = http://localhost/timber/wp-admin/admin-ajax.php
            data: {
                action,
                data
            },
            success: res => {
                if (res.status) location.href = res.redirectTo;
                else console.log(res);
            }
        });
    });
})(jQuery);
处理请求/响应的JS
我使用ajax来保持简单,但您可以使用axios来实现一种现代化的方法,而且它会使代码更短,更易于阅读(如果您需要的话,我可以添加它)。

add_action(\'wp_ajax_nopriv_add_foobar\', \'add_foobar\');
function add_foobar () {
    // get and sanitize the passed data
    $data = filter_input(INPUT_POST, \'data\', FILTER_SANITIZE_STRING);

    // do what ever logic you need here with $data

    // create the response
    $res = [
        \'status\'     => true,
        \'data\'       => $data,
        \'redirectTo\' => \'http://example.com/\'
    ];

    // return the response as json object
    echo json_encode($res);
    // die, stop any other code from running after this point
    die;
}
最后是我们处理数据并返回响应的操作
我没有使用nonce 尽可能简单,但考虑添加它(如果你愿意,我也可以添加)。

使用您提供的代码,我创建了这个用ajax和表单处理JS代码的简短示例
如果需要为表单提交和PHP逻辑运行JS代码,则需要使用XHR请求,因此ajax/axios/fetch将是正确的方法。

相关推荐

404在wp-admin上找不到nginx

我有自己的域名,我在InfinityFree上托管这个网站。所以在打字时http:// mysite.com/wp-admin 它给了我404找不到的nginx页面。我已成功安装WordPress,并添加了名称服务器。我什么都没有改变,只是安装了新的,并以这个结束。我不知道怎么了?我正在为自己创建网站,并且还在学习。我读了几篇文章,但没有找到确切的答案。非常感谢。