2017-09-13 75 views
1

我想建立一個wordpress插件,從我的窗體獲取信息,並將其放入muy數據庫中。這工作得很好,但每當我嘗試將頁面重定向到頁面,您可以編輯項目我得到一個錯誤,標題已發送。我嘗試了一切,從放置get_header();在重定向下嘗試使用鉤子工作,但沒有任何工作。我必須在這裏失去一些東西。wp_redirect給頭已發送錯誤

<?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> 

+0

你需要做些什麼才能使這段代碼起作用,你需要刪除什麼?這將讓人深入瞭解是什麼導致了這個問題... – mattfryercom

+3

wp_redirect($ url);在這之後把exit();或wp_die(); –

+0

^聽起來很可能,總是在重定向後退出 – mattfryercom

回答

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來確保安全性。請檢查以下關於我們如何在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文件添加。我沒有觸及代碼內的任何東西。所以,你需要自己重構它。

希望你明白我寫的過程。如果有任何混淆,請讓我知道評論。

+0

當我這樣做時,重定向根本不起作用,我放入函數內的所有代碼都不起作用 –

+0

我是否需要將add_action()掛鉤放在另一個地方,因爲我用它來調用功能在同一個文件中,但它不會做任何事情。此外,我正在使用可能與它有關的wordpress樣板 –

+0

檢查編輯的上述答案。 – DpEN