Как я могу вставить другой пост при сохранении поста?

Я пытаюсь вставить новый пост в хук save_post и функцию wp_insert_post в Wordpress. Когда я пытаюсь сохранить или обновить пост, он запускает бесконечный цикл. Кто-нибудь может помочь?

Вот мой код:

function mv_save_wc_order_other_fields( $post_id ) {    
    if(isset($_POST[ '....' ]) && !empty($_POST["...."])){
    if($_POST[ '....' ] == 3){          
        $my_post = array(
                   'post_title'    => "$post_id Bill",
                    'post_content'  => "-",
                    'post_status'   => 'publish',
                    'post_type'   => 'tahsilat',
                   'post_author'   => 1,
                 
              );
         $bill_id = wp_insert_post( $my_post, $wp_error );    
          update_post_meta( $bill_id, 'customer', $_POST[ 'user' ] );
          update_post_meta( $bill_id, 'customer', $_POST[ 'user' ] );
    }else{
        update_post_meta( $post_id, 'payment', $_POST[ '...' ] );
        update_post_meta( $post_id, 'amount', $_POST[ 'amount' ] );
    }
    
    }
   add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );       

person Tolgahan Demir    schedule 13.10.2020    source источник
comment
сохранить или обновить публикацию, это вызывает бесконечный цикл, потому что действие save_post определено в функции wp_insert_post().   -  person Bhautik    schedule 13.10.2020


Ответы (2)


Вы хотите использовать transition_post_status, чтобы срабатывать только при изменении статуса. Вот что я сделал:

function video_post_created($new, $old, $post) {
    if ( ( $new == 'publish' ) && ( $old != 'publish' ) && ( $post->post_type == 'roku_video' ) ) {
        my_update_post_meta_function($post);
    }
}
add_action( 'transition_post_status', 'video_post_created', 10, 3 );

Обратите внимание, как я проверяю, является ли новый статус опубликованным, но полученным из другого статуса (например, черновик), и проверяю мой конкретный тип сообщения. У меня был пользовательский тип поста. И если все совпадает, то я вызываю свою собственную функцию my_update_post_meta_function и передаю объект сообщения. Вам не нужно вызывать другую функцию. Вместо этого вы можете поместить свой код прямо туда. Я просто держал его в чистоте.

person swg1cor14    schedule 13.10.2020

Вы можете избежать проблемы с бесконечным циклом, удалив свое действие и добавив его после кода функции wp_insert_post(). проверьте код ниже.

function mv_save_wc_order_other_fields( $post_id ) {

    remove_action( 'save_post', 'mv_save_wc_order_other_fields' );

    if(isset($_POST[ '....' ]) && !empty($_POST["...."])){
        if($_POST[ '....' ] == 3){          
            $my_post = array(
                'post_title'    => "$post_id Bill",
                'post_content'  => "-",
                'post_status'   => 'publish',
                'post_type'   => 'tahsilat',
                'post_author'   => 1, 
            );
            $bill_id = wp_insert_post( $my_post, $wp_error );    
            update_post_meta( $bill_id, 'customer', $_POST[ 'user' ] );
            update_post_meta( $bill_id, 'customer', $_POST[ 'user' ] );
        }else{
            update_post_meta( $post_id, 'payment', $_POST[ '...' ] );
            update_post_meta( $post_id, 'amount', $_POST[ 'amount' ] );
        }

    add_action( 'save_post', 'mv_save_wc_order_other_fields' );

}
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 ); 
person Bhautik    schedule 13.10.2020