web-dev-qa-db-ja.com

save_post + insert_post =無限ループ

特定のカスタムフィールドを含む投稿が保存されたときに自動的に新しい投稿を作成しようとしています - insert_post関数をsave_postにフックしています。

これは無限ループを生成します。

この問題に対するいくつかの答えが見つかりました。挿入する前に投稿タイプを確認する必要があることを示唆しています。

しかし、次のコードでも無限ループが発生します。

add_action('save_post', 'createGallery');

function createGallery () {
    global $post;
    if ( $post->post_type == 'activity' ) {
        $gallerypost = array(
            'post_content' => 'the text of the post',
            'post_status' => 'publish', 
            'post_title' => 'Photo album', 
            'post_type' => 'post', 
            'post_author' => 1);  
        wp_insert_post( $gallerypost );
    }
}
4
ptriek

これは、ループを最初に回ったときが$postが現在の投稿だからです。しかし、2度目にループを回っても、$ postは変わりません。同じことが3、4、5などでも起こります。

$ post変数は、保存/挿入したばかりの投稿ではなく、そのページの現在の投稿であるため、ループif文は常に真になり、無限ループが発生します。 $post変数をチェックする代わりに、保存されている投稿のIDをチェックする必要があります。アクションsave_postを実行する呼び出しを見てください。

do_action('save_post', $post_ID, $post);

Save_postにパラメータがあることがわかりました。そのため、追加するときに関数が1つのパラメータを受け取ることを示すとします。

add_action('save_post', 'createGallery',1,1);

それからpost IDパラメータを追加して代わりにそれを使ってください:

function createGallery ($post_ID) {
    if ( get_post_type($post_ID) == 'activity' ) {
        $gallerypost = array(
            'post_content' => 'the text of the post',
            'post_status' => 'publish', 
            'post_title' => 'Photo album', 
            'post_type' => 'post', 
            'post_author' => 1);  
        wp_insert_post( $gallerypost );
    }
}

それであなたの無限ループは消えたはずです!そうでなければ、正しいデータに取り組んでいるので、コードをより正確にすることに飛躍的な進歩を遂げました。

'post_type' => 'post','post_type' => 'activity',に変更すると無限ループが再導入されることを警告します。

3
Tom J Nowell