web-dev-qa-db-ja.com

データを保存しないフォームのショートコード WP データベース

私はプラグインの起動時にカスタムテーブルを作成するプラグインを開発しています。このプラグインを使用すると、リードのデータを収集するためのフォームのショートコードを追加できます。

データは保存されますが、新しい投稿を作成することはできません(WPエディターで[公開]ボタンをクリックしたときに "ヘッダーは既に送信されます") 、私は新しい投稿を作成することができますが、フォームはショートコードで表示されますが、データはデータベースに保存されません。

私は自分が間違っていることを理解しようとして髪を引き抜いています。

正しい方向へのどんな助けでも大いに感謝されるでしょう。

これがフォームプロセスコードです。

    //Process form data
function el_process_form(){

if (isset($_POST['everlead'])) {

    if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['post_type'] ) &&  $_POST['post_type'] == "everlead"){

             $name = stripcslashes($_POST["name"]);
             $email = stripcslashes($_POST["email"]);
             $phone = stripcslashes($_POST["phone"]);
             $website = stripcslashes($_POST["website"]);

        // Do some minor form validation to make sure there is content
        if (trim($name) == "" ) {

            echo 'Please enter your name. <br />';

        }
        if (trim($email) == "" ) {

            echo 'Please enter a valid email address.<br/>';
        }
        if (trim($phone) == "" ) {

            echo 'Please enter a contact number.<br/>';
        }
        if (trim($website) == "" ) {

            echo 'Please enter your website url.<br/>';
        }

    global $wpdb;
    //Set time
    $formtime = date('m-d-Y h:i:a');
    $ipaddress = $_SERVER['REMOTE_ADDR'];

    //Table data
    $data = array(
        'name'      => $name,
        'email'     => $email,
        'phone'     => $phone,
        'website'   => $website,
        'date'      => $formtime,
        'ipaddress' => $ipaddress
    );

    //set lead data
    $table = $wpdb->prefix . 'el_leads';

    $wpdb->insert( $table, $data, array('%s', '%s', '%s', '%s', '%s') );

    }
}
}

add_action( 'init', 'el_process_form' );

上記のコードで奇妙なことが1つありました^^^。ローカルサーバー(xampp)でif (isset($_POST['everlead'])) {を削除してもすべてうまくいきますが、ライブサイトでは "headers already sent"エラーが発生します。

また、フォーム処理の前にこのifステートメントを追加した場合、データをデータベースに保存することはできません。

    function el_process_form(){
if(isset($_POST['post_type'])){
...process form data
}
}
add_action('init', 'el_process_form' );

上記のコードを使用すると、(前の段落で説明したように)新しい投稿を作成できますが、データは保存されません。

1
Jerry R.

わかりました、どういうわけかそれは今働いています。 'init'にフックする代わりに 'the_post'を使用していますが、ショートコードのフォームを使用しています。新しい投稿を公開したり、データが保存されなかったりする問題はもうありません。また、「ヘッダー情報を変更できません - ヘッダーは既に送信されています」というエラーもありません。

関数

function el_process_form(){
if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['post_type'] ) &&  $_POST['post_type'] == "everlead"){

         $name = stripcslashes($_POST["name"]);
         $email = stripcslashes($_POST["email"]);
         $phone = stripcslashes($_POST["phone"]);
         $website = stripcslashes($_POST["website"]);

    // Do some minor form validation to make sure there is content
    if (trim($name) == "" ) {

        echo 'Please go back and enter your name. <br />';
        exit();         
    }
    if (trim($email) == "" ) {

        echo 'Please go back and enter a valid email address.<br/>';
        exit();
    }
    if (trim($phone) == "" ) {

        echo 'Please go back and enter a contact number.<br/>';
        exit();
    }
    if (trim($website) == "" ) {

        echo 'Please go back and enter your website url.<br/>';
        exit();
    }

global $wpdb;
//Set time
$formtime = date('m-d-Y h:i:a');
$ipaddress = $_SERVER['REMOTE_ADDR'];

//Table data
$data = array(
    'name'      => $name,
    'email'     => $email,
    'phone'     => $phone,
    'website'   => $website,
    'date'      => $formtime,
    'ipaddress' => $ipaddress
);

//set lead data
$table = $wpdb->prefix . 'el_leads';

$wpdb->insert( $table, $data, array('%s', '%s', '%s', '%s', '%s') );

}

}

私は 'the_post'を使っていますが、すべて問題ありません

add_action( 'the_post', 'el_process_form' );

今すぐ私のショートコード[el_form buttonsize="block"]が動作し、任意のページまたは投稿にフォームを表示します。最も重要なことは、データをデータベースに保存することです。

フォームのショートコードを使うとき、なぜ 'the_post'が 'init'に対して機能するのかを深く掘り下げる必要があります。

0
Jerry R.