2017-09-13 11 views
1

私は自分のフォームから情報を取得し、それをmuyデータベースに格納するwordpressプラグインを構築しようとしています。これは完全に正常に動作しますが、ページをページにリダイレクトしようとすると、アイテムを編集できるようになるたびに、ヘッダーが既に送信されているというエラーが表示されます。私はget_header()を置くことからすべてを試みました。フックで動作しようとするリダイレクトの下でbuth何も動作しません。私がここで紛失しているものがなければならない。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フックに移動すると役立つかもしれません。

参考として以下の機能をご確認ください。それをテストするためにあなたののfunctions.phpファイルに上記のコードを入れて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(); 
    } 
} 

のために参照してください。

また、あなたは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()形態以下又はどこフォーム内部を追加。ノンス秘密のデータを投稿しています。私たちは、次のように送られたPOSTリクエストをインターセプトしているときに、私たちはこのことを確認されます。

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

関連する問題