しようとしています:
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」が表示され、投稿内容が更新されていない空白のページ。
したい:
この作業を手伝ってください:)
フォームにアクションを設定していないので、何も実行されません。
フォームにaction
という隠しフィールドを追加します。
<input type="hidden" value="submit_filter" name="action">
これにも注意してください。
$postid = get_the_ID();
動作しません。これは新しいリクエストなので、IDを取得するための投稿はありません。フォームデータと一緒にこれを渡す必要があります。
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ページなので、隠しフィールドに持ち越す必要があります。
あなたはAJAXであなたのデータを提出していないので、admin-ajax.php
とwp_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