wp_redirect给出头已发送错误

时间:2017-09-13 11:13:05

标签: php wordpress

我正在尝试构建一个wordpress插件,从我的表单中获取信息并将其放入muy数据库中。这非常好用,但每当我尝试将页面重定向到您可以编辑项目的页面时,我会收到标题已发送的错误。我尝试了get_header();在重定向下面尝试使用钩子但是没有任何作用。我必须在这里找到一些东西。

<?php
global $wpdb;
$path='admin.php?page=my_pirazzo_locations';
$path2='admin.php?page=my_pirazzo_items';
$url=admin_url($path);
$url2=admin_url($path2);
//global $wpdb;
$userdb = $wpdb->prefix. 'users';
$getdata = $wpdb->get_results("SELECT * FROM $userdb");
//if (isset($_GET['id']))
//{
//    $id= $_GET['id'];
//    echo $id;
//}

//echo $userdb;
if (isset($_POST["submit"]) && $_POST["client"] != "" && $_POST["startdate"] != "" && $_POST["enddate"] != "") {

global $wpdb;

$userdb = $wpdb->prefix . 'users';
$table = $wpdb->prefix . "b2bdomain";
$user_id = strip_tags($_POST["client"]);
$startdate = strip_tags($_POST["startdate"]);
$enddate = strip_tags($_POST["enddate"]);
$isActive = 0;
if ($startdate < $enddate) {
    $isActive = 1;
}
$query = $wpdb->get_results("SELECT user_login FROM $userdb WHERE ID = $user_id");
$name = $query[0]->user_login;
$wpdb->insert(
    $table,
    array(
        'userid' => $user_id,
        'isActivated' => $isActive,
        'name' => $name,
        'start_time' => $startdate,
        'end_time' => $enddate,
    )
);

$url = 'admin.php?page=my_pirazzo_edit';
ob_clean();
ob_start();
wp_redirect($url);




};

?>

  <!-- This file should primarily consist of HTML with a little bit of PHP. -->
<div class="wrap">
<h1>beheer zone</h1>
<div class="postbox">
    <div class="meta-th">
        <h2>nieuwe zone toevoegen</h2>
    </div>
    <div class="meta-td">

        <form method="post" name="cleanup_options" action="">
            <fieldset>
                <label for="client">Selecteer een Klant</label>
                <select name="client" id="client">
                    <?php foreach($getdata as $data){ ?>
                        <option value="<?php echo $data->ID ?>"><?php echo $data->user_login ?></option>
                    <?php } ?>
                </select>

            </fieldset>
            <fieldset>
                <label for="startdate">Startdatum</label>
                <input type="date" name="startdate" >
                <label for="enddate">Einddatum</label>
                <input type="date" name="enddate" >
            </fieldset>



            <?php submit_button('bewaar de zone', 'primary','submit', TRUE); ?>

        </form>
    </div>

</div>
<hr>
<div class="postbox">
    <h2>voeg locatie's toe</h2>
    <a href="<?php echo $url ?>"><button class="button-primary">voeg een locatie toe</button></a>
</div>
<hr>
<div class="postbox">
    <h2>voeg Producten toe</h2>
    <a href="<?php echo $url2 ?>"><button class="button-primary">voeg een locatie toe</button></a>
</div>

1 个答案:

答案 0 :(得分:0)

您可以尝试在wp_loaded挂钩中发送您的帖子数据。在将标题内容发送到浏览器之前,您只能使用wp_redirect。因此,而不是在模板文件中处理表单。将它们移动到 wp_loaded 挂钩可能会对您有所帮助。

请查看以下功能以供参考。请参阅https://cdn.tutsplus.com/wp/authors/legacy/tom/2012/09/25/wordpress-core-load-lifecycle.png

add_action( 'wp_loaded', 'pirazzo_edit_form' );
function pirazzo_edit_form(){
  if( isset($_POST["submit"]) && $_POST["client"] != "" && $_POST["startdate"] != "" && $_POST["enddate"] != "") {
    //YOUr additional code here

    // process form, and then Redirect
    $url = 'admin.php?page=my_pirazzo_edit';
    wp_redirect($url);
    exit();
  }
}

将上述代码放入 functions.php 文件中进行测试。

另外,你是WordPress的新手吗?当我正确阅读你的代码时,很少有东西能打动我。现在,WordPress核心内置了许多功能,例如查询用户。我看到你使用了wpdb对象,你不需要这样做。

以下内容适用于您的用户选择字段。以下是我们如何使用get_users函数直接查询用户。请参阅 https://codex.wordpress.org/Function_Reference/get_users

<select name="client" id="client">
   <?php $all_users = get_users(); ?>
   <?php foreach($all_users as $data){ ?>
   <option value="<?php echo $data->ID ?>"><?php echo $data->first_name .' ' .$data->last_name; ?></option>
 <?php } ?>
</select>

同样,我在表单提交中看不到任何nonce字段。请使用nonce来保证安全。请检查以下我们如何在WordPress中实现此功能。

<form method="post" name="cleanup_options" action="">
<?php
//Please check why this is needed https://codex.wordpress.org/Function_Reference/wp_nonce_field
wp_nonce_field( '_nonce_demo_action_field', '_demo_action_name' );
?>

在表单下方或表单内的任何位置添加上述代码 wp_nonce_field()。您正在发布随机数秘密数据。因此,当我们拦截发送的请求时,我们将验证这一点,如下所示:

//Functions.php
add_action( 'wp_loaded', 'pirazzo_edit_form' );
function pirazzo_edit_form(){
        if( isset($_POST["submit"]) && wp_verify_nonce( $_POST['_demo_action_name'], '_nonce_demo_action_field' ) ) {
        global $wpdb;

        $userdb = $wpdb->prefix . 'users';
        $table = $wpdb->prefix . "b2bdomain";
        $user_id = strip_tags($_POST["client"]);
        $startdate = strip_tags($_POST["startdate"]);
        $enddate = strip_tags($_POST["enddate"]);
        $isActive = 0;
        if ($startdate < $enddate) {
            $isActive = 1;
        }
        $query = $wpdb->get_results("SELECT user_login FROM $userdb WHERE ID = $user_id");
        $name = $query[0]->user_login;
        $wpdb->insert(
            $table,
            array(
                'userid' => $user_id,
                'isActivated' => $isActive,
                'name' => $name,
                'start_time' => $startdate,
                'end_time' => $enddate,
                )
            );

        $url = 'admin.php?page=my_pirazzo_edit';
            wp_redirect( $url );
            exit;
        }
    }

以上内容应添加到functions.php文件中。我没有触及代码中的任何内容。所以,你需要自己重构它。

希望您了解我所写的过程。如果有任何混淆,请在评论中告诉我。