web-dev-qa-db-ja.com

Save_postにアクションを追加すると、機能が機能するためにpostを2回保存する必要があります

投稿が保存されたときに、 "tribe_events_cat"分類から "カテゴリ"分類にすべての投稿の用語をコピーする次の関数を書きました。用語をコピーするには、[更新]を2回クリックする(投稿を2回保存する)必要があるというバグがあります。

get_the_termsを呼び出したときに、投稿がまだ保存されていないので、これが起こると思います。

get_the_termsが新しく更新された投稿から用語を取得するように、それを回避する方法はありますか?

   function bam_save_event_cat( $post_id ) {
        $taxonomy = 'categoria';

        $tribe_cats = get_the_terms( $post_id, 'tribe_events_cat');

        foreach($tribe_cats as $tribe_cat) {
            if( empty($tribe_cat->name) ) continue;
            $catname = $tribe_cat->name;
            $cats[] = $catname;
        }
        wp_set_object_terms( $post_id, $cats, $taxonomy );
    }

    function bam_save_event($post_id) {
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
            return;

        if ( !current_user_can( 'edit_post', $post_id ) )
            return;

        if(get_post_type( $post_id ) == 'tribe_events' ) {
            remove_action( 'save_post', 'bam_save_event' );
            wp_update_post( array( 'ID' => $post_id ) );
            add_action( 'save_post', 'bam_save_event' );

            bam_save_event_cat( $post_id );
        }
    }

    add_action( 'save_post', 'bam_save_event' );
1
j-man86

これは暗闇の中での突き刺しですが、set_object_terms関数にbam_save_event_catフックを使ってみましたか?

function bam_save_event_cat( $post_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ) {
    $taxonomy = 'categoria';

    $tribe_cats = get_the_terms( $post_id, 'tribe_events_cat');

    foreach($tribe_cats as $tribe_cat) {
        if( empty($tribe_cat->name) ) continue;
        $catname = $tribe_cat->name;
        $cats[] = $catname;
    }
    wp_set_object_terms( $post_id, $cats, $taxonomy );
}

function bam_save_event($post_id) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    if ( !current_user_can( 'edit_post', $post_id ) )
        return;

    if(get_post_type( $post_id ) == 'tribe_events' ) {
        remove_action( 'save_post', 'bam_save_event' );
        wp_update_post( array( 'ID' => $post_id ) );
        add_action( 'save_post', 'bam_save_event' );

        add_action( 'set_object_terms', 'bam_save_event_cat', 10, 6 );
    }
}

add_action( 'save_post', 'bam_save_event' );
2
Andy Adams

私は同じ問題に遭遇したと思います。

Save_postアクションには、デフォルトの10よりも高い優先順位を設定する必要があります。コーデックスで説明されているように アクションを追加するときの優先順位は3番目の引数として指定されます

好きです:

add_action( 'save_post', 'bam_save_event', 99 );
1
Mat_