![](/img/trans.png)
[英]WP_redirect not working (header already sent in pluggable.php)
[英]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.