web-dev-qa-db-ja.com

admin-ajax.phpでフォームを送信する

しようとしています:

Admin-ajax.phpを使用してフォームを送信し、投稿データを「下書き」ステータスから「公開」ステータスに更新し、フィルタタイプのカスタムメタフィールドを追加します。

フォーム内容:

<form action="<?php echo admin_url( 'admin-ajax.php' ) ?>" method="post">

        <?php wp_nonce_field( 'submit_filter', 'my_filter_nonce' ); ?>

        <div class="small-6 medium-3 large-3 columns">
            <div class="card">
                <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, 'thumbnail' ); ?>" class="" id="normal">
                    <div class="card-section">
                        <input type="submit" value="No Filter" name="normal">
                    </div>
            </div>
        </div>
</form>

フォームアクション:

// process form actions
add_action( 'wp_ajax_nopriv_submit_filter', 'my_submission_filter' );
add_action( 'wp_ajax_submit_filter', 'my_submission_filter' );


function my_submission_filter() {

    $postid = get_the_ID();
    $post_data = array(
          'ID'              => $postid,
          'post_status'     => 'publish'

     );


// add filter meta data
add_post_meta($postid, 'filter', $_POST['filter']); 

// Update the post into the database
wp_update_post( $my_post );

// redirect back to site to see post
wp_redirect( site_url());

die();

}

結果:

右上隅に「0」が表示され、投稿内容が更新されていない空白のページ。

したい:

この作業を手伝ってください:)

1
WordyDudeGuyMan

フォームにアクションを設定していないので、何も実行されません。

フォームにactionという隠しフィールドを追加します。

<input type="hidden" value="submit_filter" name="action">

これにも注意してください。

$postid = get_the_ID();

動作しません。これは新しいリクエストなので、IDを取得するための投稿はありません。フォームデータと一緒にこれを渡す必要があります。

1
Milo

admin-ajax.phpはAJAXリクエストを対象としていますが、これはAJAXリクエストではなく、フォーム送信です!おそらくこれがJavaScriptベースの送信であれば適切でしょうが、Admin AJAXの癖を避けて標準のフォームハンドラを作成する必要があります。

フォームを送信するときは、フォームが配置されているのと同じページに送信してください。このように、フォームの処理と表示は互いに隣接しており、検証は表示がはるかに簡単になります。

例えば:

if ( ! empty( $_POST['submission'] )) {
    // the form was submitted!

    $success = false;
    // fetch the parameters, do some validation, etc

    // ... handle the form submission

    // all done, if successful say so else load the form
    if ( true === $success ) {
        get_template_part( 'theform', 'success' ); // theform-success.php
    } else {
        // show the form again with whatever validation errors there were
        get_template_part( 'theform' ); 
    }
} else {
    // the form was not submitted, DISPLAY THE FORM!!! First page
    get_template_part( 'theform' );
}

theform.phpはあなたのフォームを含むでしょう、そしてフォームのアクションのためにあなたはそれを空のままにするでしょう、例えば。 <form method="POST" action="">

複数ページの取り扱い

pageという名前の隠しフィールドを追加してから、その値に応じて異なるテンプレートをロードし、最後のページが+ 1になったときに処理することができます。 2ページなので、隠しフィールドに持ち越す必要があります。

1
Tom J Nowell

あなたはAJAXであなたのデータを提出していないので、admin-ajax.phpwp_ajaxフックを使う必要はありません。代わりにadmin_postフックが必要です。

コードを機能させるには、コードにいくつか変更を加える必要があります。まず、フォームのアクションを<?php echo esc_url( admin_url('admin-post.php') ); ?>に変更し、フォームの最後に隠しアクションフィールドを追加します<input type="hidden" name="action" value="submit_filter">

このように、リクエストがWordPressに送信され、actionパラメータが "submit_filter"に設定されているときはいつでも、フックadmin_post_submit_filterが実行されます。

これがフォームコードの外観です。

<form action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
   <?php wp_nonce_field( 'submit_filter', 'my_filter_nonce' ); ?>
   <div class="small-6 medium-3 large-3 columns">
      <div class="card">
          <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, 'thumbnail' ); ?>" class="" id="normal">
          <div class="card-section">
              <input type="submit" value="No Filter" name="normal">
          </div>
      </div>
    </div>
    <input type="hidden" name="action" value="submit_filter">
</form>

そしてあなたの要求を処理するための機能コード:

add_action( 'admin_post_nopriv_submit_filter', 'my_submission_filter' );
add_action( 'admin_post_submit_filter', 'my_submission_filter' );

function my_submission_filter() {
  $postid = get_the_ID();

  $post_data = array(
    'ID'              => $postid,
    'post_status'     => 'publish'
  );

  add_post_meta($postid, 'filter', $_POST['filter']); 
  wp_update_post( $my_post );

  wp_redirect( site_url());
}

is_wp_errorを使ってエラーをチェックするのもいいでしょう

https://codex.wordpress.org/Plugin_API/Action_Reference/admin_post_(action)https://codex.wordpress.org/Function_Reference/is_wp_error

1
Boris Kuzmanov