繁体   English   中英

wp_redirect给出标题已经发送错误

[英]wp_redirect gives header already send error

我正在尝试构建一个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>

您可以尝试在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>

同样,我在表单提交中看不到任何现时字段。 为了安全起见,请使用随机数。 请检查以下有关如何在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文件中。 我没有触及代码内的任何内容。 因此,您将需要自己重构它。

希望您理解我编写的过程。 如果有任何混淆,请让我知道您的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM