#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 );