web-dev-qa-db-ja.com

理由アクションフォークはフロントエンドフォームからのupdate_post_metaでは動作しませんか?代替?

以下のコードは、投稿を挿入しているとき、またはフォームを送信するときにadd_post_metaを使用しているときに機能します。ページの更新は完璧です( フロントエンドからのフォーム送信後の遅いリダイレクトを修正するにはどうすればいいですか(プラグインなし)? )。ただし、update_post_metaを使用してカスタム投稿タイプの投稿メタを更新する予定のフォームを使用しても、同じ効果が得られないようです。

function wpd_check_submission(){
    if( isset( $_POST['start'] ) ) {
        // do your post insertion here
    }
}
add_action( 'init', 'wpd_check_submission' );

誰かが私を正しい方向に向けるのを手伝ってくれる?これについてはっきりした答えが見つかりません。私はsave_postフックを使って、if-isset行を私のフォームのすぐ後ろに置き、update_post_meta関数を機能している関数に直接追加してみました。 updated_post_metaとupdate_post_metaを持つpost metaを更新するためのdo_actionメソッドについて読み始めました - 私は本当に混乱しています。

ここに例があります:働くコード:

   function ty_save_post_data() {

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

        $post = array(
        'post_title' => $_POST[ 'mfname' ],
        'post_status' => 'publish', 
        'post_type' => 'add-members' 
        );  


        $post_id = wp_insert_post($post); 

        add_post_meta($post_id, 'mfname', sanitize_text_field( $_POST[ 'mfname' ] ), true);
        add_post_meta($post_id, 'mem', sanitize_text_field( $_POST[ 'mem' ] ), true);
        add_post_meta($post_id, 'mpw', esc_attr( $_POST['mpw'] ), true);
        add_post_meta($post_id, 'second-nom', sanitize_text_field( $_POST[ 'second-nom' ] ), true );
    } 
    }

add_action( 'init', 'ty_save_post_data' );

失敗するコード:

function ty_save_post_data1() { 
if( isset( $_POST['isecond'] ) ) { 
   update_post_meta( get_the_ID(), 'second-nom', sanitize_text_field( $_POST['second-nom'] ) );
   update_post_meta( get_the_ID(), 'second-nom-date', sanitize_text_field( $_POST['second-nom-date'] ) );
   update_post_meta( get_the_ID(), 'approved', sanitize_text_field( $_POST['approved'] ) );    
}
}

add_action( 'init', 'ty_save_post_data1' );

こちらIS失敗したコード例の更新された作業バージョン

//hidden field added to form that grabs the post ID
<input type="hidden" name="post_id" id="post_id" value="<?php echo get_the_ID(); ?>" />

<?php function ty_save_post_data1() { 
if( isset( $_POST['isecond'] ) ) {

   $post_id1 = $_POST['post_id'];

   update_post_meta( $post_id1, 'second-nom', sanitize_text_field( $_POST['second-nom'] ) );
   update_post_meta( $post_id1, 'second-nom-date', sanitize_text_field( $_POST['second-nom-date'] ) );
   update_post_meta( $post_id1, 'approved', sanitize_text_field( $_POST['approved'] ) );    
}
}

add_action( 'init', 'ty_save_post_data1' );
?>
1
WorkingMan8798

失敗したコードのコンテキストは完全には明らかではありませんが、initフックで実行したときにget_the_ID()が投稿IDを返さないため、メインクエリがまだ実行されていないため失敗します。

アクションリファレンス を見てみると、現在のクエリのデータにアクセスできる最も早いアクションは、コードが現在動作している場合はwpです。投稿を表示しました。コードが別の投稿で機能している場合は、その投稿のIDを他のフォームデータと一緒に渡す必要があります。

2
Milo