通过前端添加CPT后,无法使wp_reDirect()工作

时间:2013-02-10 作者:Wattsy

我试图通过在wordpress上创建一个相对简单的应用程序来学习PHP,这是一个基本的CRM,我已经取得了不错的进步,但在一些细节上遇到了困难。

在用户创建新客户后,让wp\\u redirect()工作时,我遇到了一些严重的“headers ready sent”问题。

下面是我想做的一个例子:

新客户。php:通过前端创建一个新的自定义帖子类型,然后重定向到特定客户的单个帖子页面。代码如下:

    <?php
        $address_line_1      = $_POST[\'address_line_1\'];
        $address_line_2      = $_POST[\'address_line_2\'];
        $suburb              = $_POST[\'suburb\'];
        $state               = $_POST[\'state\'];
        $post_code           = $_POST[\'post_code\'];
        $country             = $_POST[\'country\'];
        $email               = $_POST[\'email\'];
        $first_name          = $_POST[\'first_name\'];
        $last_name           = $_POST[\'last_name\'];
        $phone_number        = $_POST[\'phone_number\'];
        $progress_identifier = \'1\';

            // PROCESS THE FORM
            if (\'POST\' == $_SERVER[\'REQUEST_METHOD\'] && !empty($_POST[\'action\']) && $_POST[\'action\'] == "new_customer")
            {

                $new_customer = array(
                    \'post_title\'  => wp_rand(100,999).\'-\'.wp_rand(),
                    \'post_author\' => $user_ID,
                    \'post_status\' => \'publish\',
                    \'post_type\'   => \'customer\'
                );

                $pid = wp_insert_post($new_customer);

                add_post_meta($pid, \'address_line_1\',      $address_line_1,      true);
                add_post_meta($pid, \'address_line_2\',      $address_line_2,      true);
                add_post_meta($pid, \'suburb\',              $suburb,              true);
                add_post_meta($pid, \'state\',               $state,               true);
                add_post_meta($pid, \'post_code\',           $post_code,           true);
                add_post_meta($pid, \'country\',             $country,             true);
                add_post_meta($pid, \'email\',               $email,               true);
                add_post_meta($pid, \'first_name\',          $first_name,          true);
                add_post_meta($pid, \'last_name\',           $last_name,           true);
                add_post_meta($pid, \'phone_number\',        $phone_number,        true);
                add_post_meta($pid, \'address\',             $address,             true);
                add_post_meta($pid, \'progress_identifier\', $progress_identifier, true);

                $survey_post = array(
                    \'post_title\' => $pid . \'-\' . wp_rand(),
                    \'post_author\' => $user_ID,
                    \'post_status\' => \'publish\',
                    \'post_type\' => \'survey\'
                );

                $survey_id = wp_insert_post($survey_post);

                global $wpdb;
                $wpdb->insert(
                    $wpdb->p2p,
                    array(
                        \'p2p_from\' => $survey_id,
                        \'p2p_to\' => $pid,
                        \'p2p_type\' => \'survey_to_customer\'
                    )
                );
                wp_redirect(home_url());
                exit();
            }
    ?>
此代码放在HTML表单之后。

我知道在页面开始输出任何内容之前必须调用wp\\u redirect(),但我不确定如何实现这一点,因为我已经尝试将其放在页面的更高位置,但没有任何效果。

请随意滥用我糟糕的代码和模棱两可的问题,但如果你能为我指出正确的方向,以实现我正在努力实现的目标,那将是伟大的!我曾尝试将事情分解成函数,通过“save\\u post”挂钩进行调用,但也没有成功。

感谢阅读!

3 个回复
SO网友:david.binda

你应该打电话给

exit;
之后wp_redirect 您应该将post数据保存在pre_get_posts

SO网友:TomC

你应该保留新客户的表格。然后将表单操作设置为发布到另一个脚本(类似于new customer process.php),然后将php代码粘贴到该脚本中。本质上,用户不会知道任何不同,因为他们将被重定向回主页。

为了给您提供更多的信息,表单就是发送标题的内容,这就是为什么您需要将表单和处理脚本分开。在发送任何HTML之前,需要进行重定向。

SO网友:Maikal

我建议您看看wordpress的ajax调用。

您可以这样添加ajax:

add_action( \'wp_ajax_{nopriv_}new_customer\', \'my_function_to_hendle_ajax\' );

哪里{nopriv_} 用于未登录用户

您的功能如下:

function my_function_to_hendle_ajax() {
$address_line_1      = $_POST[\'address_line_1\'];
$address_line_2      = $_POST[\'address_line_2\'];
$suburb              = $_POST[\'suburb\'];
$state               = $_POST[\'state\'];
//....
// no need in if( \'post\' .... )
$new_customer = array(
  \'post_title\'  => wp_rand(100,999).\'-\'.wp_rand(),
  \'post_author\' => $user_ID,
  \'post_status\' => \'publish\',
  \'post_type\'   => \'customer\'
);

$pid = wp_insert_post($new_customer);

add_post_meta($pid, \'address_line_1\',      $address_line_1,      true);
add_post_meta($pid, \'address_line_2\',      $address_line_2,      true);
// ....
wp_redirect(home_url());
exit();
}
您的html表单应为:

<form action="<?php echo admin_url( \'admin-ajax.php\' ); ?>" method="POST">
<input type="hidden" name="action" value="new_customer" />
...
</form>
你可以带着wp_send_json_error 在表单提交时,在jquery中记录一个错误(但在这种情况下,您需要执行$.ajax或$.post)。

检查有关的文档Wordpress Ajax希望这些会让你失望。

结束

相关推荐