1

wordpressをCMSとして運用しています。私はシンプルなマルチパート フォームをまとめました。これは非常にうまく機能し、フロントエンドから投稿できます。これは 2 つの部分からなるフォームで、最初の部分でデータを送信し、2 番目のステップで送信したばかりのデータのプレビューを取得します。送信されたデータは、期待どおり wp に素敵なドラフト投稿を作成します。

以下は、フォームを表示するフォームのページ テンプレート内のコードの最初のチャンクです。コードの下部には、送信されたばかりのデータを表示するPREVIEW SECTION (コード内のコメントを読む) があります。これはすべて非常にうまく機能し、送信後に画像を取得することさえできました。

     <?php
            global $wpdb;
            $this_page  =   $_SERVER['REQUEST_URI'];
            $page       =   $_POST['page'];
            if ( $page == NULL ) { ?> 

        <form method="POST" id="test_form" name="test_form" enctype="multipart/form-data" action="">

        <div>LOCATION : <input type="text" name="location" id="location"/></div>

        <div>DESCRIPTION : <textarea id="details" cols="80" rows="10 maxlength="600" name="details" rows="20"></textarea></div>

        <div>UPLOAD IMAGE : <input type="file" name="loc-image" id="loc-image" tabindex="25" /></div>


        <input type="hidden" value="1" name="page" />
        <input type="hidden" name="action" value="post_action" />
        <input type="submit" name="submit" id="submit" value="PROCEED"/>
        </form>

        <?php 
        } else if ( $page == 1 ) { ?> 

        <?php include_once('validate_first_step.php'); ?>
        <?php if (isset($_POST['submit']) && (!empty($error))) { ?>

                    <h3>Submission Failed.  Errors highlighted below.</h3><br/>
                    <a href="javascript:history.go(-1)">GO BACK</a><br/><br/>
                    <?php echo $error . '</br>';
                    } else { ?>


<?php echo 'h2>'.'YOUR SUBMISSION IS ACCEPTED. PREVIEW.'. '</h2>';?>

    <?php  //PREVIEW SECTION OF THE FORM BEGINS 
    $location=$_POST['location'];
    $description=$_POST['details'];
    ?>

    <?php
    echo 'Location : ' . $location . '</br>';
    echo 'Details  : ' . $description . '</br>'; 
    ?>
    <?php echo wp_get_attachment_image( $newupload,'medium' ); ?>

    <?php //PREVIEW ENDS
    }
    }
    ?>

これがフォームの処理方法です。実際のコードはかなり複雑です。アイデアを実現するために必要なコードをここに示しました。ワードプレスに挿入するためのかなり標準的なもの。

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


    // Do some minor form validation to make sure there is content
    if (isset($_POST['submit'])) {
            $error = "";

        if ($_POST['details'] != null) {
            $description = trim(strip_tags($_POST['details']));
        } else {
            $error .= 'Put description.</br>';
        }

        if ($_POST['location'] != null) {
            $location = trim(strip_tags($_POST['location']));
        } else {
            $error .= 'Put location.</br>';
        }

    }  



            if (empty($error)) {   
            $new_post = array(   //insert form inputs, set var and define array
            'post_title'    =>  $location, 
            'post_content'  =>  $description,
            'post_status'   =>  'draft',
            'post_author'   =>  '2',    
            'post_type' =>  'post'  
            // assigning tags and categories are no issue
            );

            $pid = wp_insert_post($new_post);


                    //attachment helper function    
                    function insert_attachment($file_handler,$post_id,$setthumb='false') {

                    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK){ return __return_false(); 
                    } 
                    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
                    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
                    require_once(ABSPATH . "wp-admin" . '/includes/media.php');

                    $attach_id = media_handle_upload( $file_handler, $post_id );

                    //set post thumbnail
                    if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
                    return $attach_id;
                    }


                    //INSERT OUR MEDIA ATTACHMENTS
                    if ($_FILES) {
                    foreach ($_FILES as $file => $array) {
                    $newupload = insert_attachment($file,$pid);
                    }
                    } 

        } //end of if empty error
    }

ISSUE : フォームのテスト中に気付いた問題は次のとおりです。プレビュー セクションでフォームを送信すると、期待どおりにデータが正しく表示されますが、ページを更新すると、同じデータがワードプレスに再度送信され、下書き投稿が重複して作成されます。

試したこと:リダイレクトソリューションを認識しており、wp_redirect使用できますが、プレビューを表示する必要があるため、リダイレクトは私が見ているものではありません。私は解決策と代替案を探すのに数時間を費やしましたが、まだそれを行っています.

REQUEST : これを防ぐ方法を教えてください。人々が更新をクリックしないとは期待できません。基本的に、彼らはやりたいことを何でもします。したがって、javascript 通知の代わりに、サーバー側の php を使用してこれを実行したいと思います。私のコードの残りの部分と同様に、javascriptが無効になっている場合でも実行される可能性があります。基本的に、送信後に更新を単に無視するソリューションが必要です。これを可能にする正しい方向へのコードまたはヒントを教えてください。どうもありがとう。


更新: @ user2758004 で提案されているように、比較方法を試してみましたが、うまくいきました。次のコードをプロセッサの上部に配置しました。

$location=$_POST['location'];

$args = array(
        'post__not_in'=> array($id),
        'post_type' => 'post',
        'post_status' => array('publish','pending','draft','future','private'),
        'meta_query' => array(
        'relation' => 'AND',

        array(
        'key' => 'location',
        'value' => $location,
        'compare' => '='
        ),
    )
);

プロセッサ内で、meta_key 'full_name' の meta_value が既に存在するかどうかを確認します。その場合、フォームはエラーを表示し、単にプロセスを停止します。それが誰かを助けることを願っています。

    $existingMeta = get_posts( $args );
        if(!empty($existingMeta)){ 
    $error .= 'Bummer, ' .$location. ' is already in database.</br>';
        return;

} 
        else { 
                  //check for rest of the errors
    } 
4

2 に答える 2

2

次の 2 つの方法があります。

  1. フォーム データをデータベースに追加する前に、ユーザーが最後に送信したフォーム データを確認し、それらを比較して、同一の場合は拒否します。

  2. jquery の ajax 投稿を使用してデータを特定の処理スクリプトに送信すると、ユーザーが更新しても、ブラウザーに「これをもう一度送信しますか?」というメッセージが表示されません。ヒント。(私は現在このトリックを使用していますが、うまく機能します)

PS。最初の解決策は簡単に思いつきますが、完全ではありません。ユーザーが誤ってページを更新すると、「これをもう一度送信しますか?」という醜いメッセージが表示されます。それでも表示されますが、これら 2 つの方法を組み合わせてセキュリティを追加する方がよいと思います。

于 2013-10-08T16:39:10.710 に答える
1
if (isset($_POST['submit'])) {
            $error = "";
session_start(); // just to make sure you have an active session

        if ($_POST['details'] != null) {
            $_SESSION['description'] = trim(strip_tags($_POST['details']));
        } else {
            $error .= 'Put description.</br>';
        }

        if ($_POST['location'] != null) {
             $_SESSION['location'] = trim(strip_tags($_POST['location']));
        } else {
            $error .= 'Put location.</br>';
        }

    }  

最初のステップでデータベースにデータを送信することはありません。ステップ2で使用するためにセッションに保存するだけです

<?php echo 'h2>'.'YOUR SUBMISSION IS ACCEPTED. PREVIEW.'. '</h2>';?>

    <?php  //PREVIEW SECTION OF THE FORM BEGINS 
    $location=$_SESSION['location'];
    $description=$_SESSION['description'];
    ?>

    <?php
    echo 'Location : ' . $location . '</br>';
    echo 'Details  : ' . $description . '</br>'; 
    ?>
    <?php echo wp_get_attachment_image( $newupload,'medium' ); ?>

    <?php //PREVIEW ENDS
    }
    }
    ?>

ステップ2で、データベースにデータを送信できます

于 2013-10-08T17:24:49.373 に答える