WordPress — Функция для запуска после добавления или сохранения поста

#php #wordpress #advanced-custom-fields

Вопрос:

Я хотел бы создавать продукт Woocommerce всякий раз, когда добавляется или обновляется сообщение типа «Категория награды».

Категории наград содержат ряд полей ACF, и я хотел бы перенести некоторые из этих данных из публикации категории наград в публикацию продукта.

Это код, который у меня сейчас есть, который запускается каждый раз, когда сохраняется категория награды:

  • Он видит, есть ли уже продукт с таким же названием
  • Если его нет, создайте новый
  • Если он либо создал новый, либо уже существует, обновите поле ACF под названием «описание» для этого поста.
 
function save_award_category($post_id) {

    // Get Post Object

    $post = get_post($post_id);

    // Check if There is a Product with the Same Name

    $product = get_page_by_path($post->post_name, OBJECT, 'product');       

    // If Product With Same Name Doesn't Exist

    if (!$product) {        

        // Create Product Post

        $product_id = wp_insert_post(array(
            'post_title' => get_the_title($post->ID),
            'post_type' => 'product',
            'post_status' => 'publish'
        ));                     

    }

    // Get Post ACF Field Group Array

    $post = get_field('all_fields', $post->ID);

    // Update Product Description with Post Description

    update_field('description', $post['description'], $product_id);

}

add_action('save_post_award_category', 'save_award_category');

 

Проблема, с которой я сталкиваюсь, заключается в том, что описание поста, которое я просматриваю, либо пустое (при первом добавлении категории наград), либо оно содержит прежнее описание продукта (до того, как оно было сохранено).

Я абсолютно убежден, что использую неправильный хук WordPress, так как сообщение категории награды сохраняется ПОСЛЕ того, как я попытаюсь извлечь из него поля ACF.

Надеюсь, я достаточно хорошо объяснился и надеюсь, что вы сможете предложить некоторую помощь!

Комментарии:

1. Вы должны задать свой вопрос по wordpress.stackexchange.com где больше людей могут знать ответ.

Ответ №1:

Вы можете использовать wp_after_insert_post крючок, недавно добавленный в версию 5.6.0

 /**
 * Fires once a post, its terms and meta data has been saved.
 *
 * @since 5.6.0
 *
 * @param int          $post_id     Post ID.
 * @param WP_Post      $post        Post object.
 * @param bool         $update      Whether this is an existing post being updated.
 * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior
 *                                  to the update for updated posts.
 */

function save_award_category( $post_id, $post, $update, $post_before ) {

    if ( get_post_type( $post_id ) == 'award_category' ) {

        // Get Post Object

        $post = get_post( $post_id );

        // Check if There is a Product with the Same Name

        $product = get_page_by_path( $post->post_name, OBJECT, 'product' );       

        // If Product With Same Name Doesn't Exist

        if ( !$product ) {

            // Create Product Post

            $product_id = wp_insert_post(array(
                'post_title'  => get_the_title($post->ID),
                'post_type'   => 'product',
                'post_status' => 'publish'
            ));                     

        }

        // Get Post ACF Field Group Array

        $post = get_field( 'all_fields', $post->ID );

        // Update Product Description with Post Description

        update_field( 'description', $post['description'], $product_id );

    }
            
}

add_action( 'wp_after_insert_post', 'save_award_category', 10, 4 );
 

Или вы можете использовать updated_post_meta крючок.

 /**
 * Fires immediately after updating metadata of a specific type.
 *
 * The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
 * (post, comment, term, user, or any other type with an associated meta table).
 *
 * Possible hook names include:
 *
 *  - `updated_post_meta`
 *  - `updated_comment_meta`
 *  - `updated_term_meta`
 *  - `updated_user_meta`
 *
 * @since 2.9.0
 *
 * @param int    $meta_id     ID of updated metadata entry.
 * @param int    $object_id   ID of the object metadata is for.
 * @param string $meta_key    Metadata key.
 * @param mixed  $_meta_value Metadata value. Serialized if non-scalar.
 */

function save_award_category( $meta_id, $post_id, $meta_key = '', $meta_value = '' ) {

    if ( get_post_type( $post_id ) == 'award_category' ) {

        // Get Post Object

        $post = get_post( $post_id );

        // Check if There is a Product with the Same Name

        $product = get_page_by_path( $post->post_name, OBJECT, 'product' );       

        // If Product With Same Name Doesn't Exist

        if ( !$product ) {

            // Create Product Post

            $product_id = wp_insert_post(array(
                'post_title'  => get_the_title($post->ID),
                'post_type'   => 'product',
                'post_status' => 'publish'
            ));                     

        }

        // Get Post ACF Field Group Array

        $post = get_field( 'all_fields', $post->ID );

        // Update Product Description with Post Description

        update_field( 'description', $post['description'], $product_id );

    }
            
}

add_action( 'wp_after_insert_post', 'save_award_category', 10, 4 );