Вопрос или проблема
Я хочу обновить мета-данные поста в продукте WooCommerce, когда сохраняю или обновляю продукт. Я написал эту функцию (и вставил в functions.php) с помощью save_post_NAME_CPT, но она не работает.
add_action('save_post_product', 'update_post_meta_subito', 10, 3 );
function update_post_meta_subito($post_id){
$post_type = get_post_type($post_id);
$term_taxonomy_ids = wp_set_object_terms( $post_type, 'leopardi',
'pa_autore', true );
$thedata = Array(
'pa_autore'=>Array(
'name'=>'pa_autore',
'value'=>'leopardi',
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
),
);
update_post_meta( $post_type, '_product_attributes',$thedata);
}
Я решил:
add_action('save_post_product', 'update_post_meta_subito', 10, 3 );
function update_post_meta_subito($post_id){
$prova_termine="inzaghi";
$term_taxonomy_ids = wp_set_object_terms( $post_id, $prova_termine, 'pa_autore', true );
$thedata = Array(
'pa_autore'=>Array(
'name'=>'pa_autore',
'value'=>$prova_termine,
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
),
);
update_post_meta( $post_id, '_product_attributes',$thedata);
}
Ответ или решение
Как добавлять действие для сохранения типа поста и обновления метаданных в WooCommerce
Когда вы работаете с WooCommerce и хотите обновить метаданные продукта при его сохранении или обновлении, необходимо правильно использовать хуки и функции WordPress. Ваша цель — использовать функционал для обновления метаданных, таких как атрибуты продуктов, и сделать это корректно.
Как это сделать
В вашем первоначальном коде вы использовали хук save_post_product
, что является правильным шагом. Однако имеются некоторые моменты, которые стоит учесть для правильной работы вашей функции.
Исправленный код функции для обновления метаданных
Вот улучшенная версия вашего первоначального функционала, которая учитывает важные нюансы при работе с хуками и сохранением данных:
add_action('save_post_product', 'update_post_meta_subito', 10, 3 );
function update_post_meta_subito($post_id, $post, $update) {
// Проверяем, является ли основной запрос, и что мы не выполняем автоматическое сохранение
if (!defined('DOING_AUTOSAVE') || (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) {
return;
}
// Проверяем права пользователя на редактирование записи
if (!current_user_can('edit_post', $post_id)) {
return;
}
$prova_termine = "inzaghi"; // Название термина, который мы будем добавлять
// Устанавливаем объектные термины для продукта
$term_taxonomy_ids = wp_set_object_terms($post_id, $prova_termine, 'pa_autore', true);
// Формируем данные для обновления атрибутов продукта
$thedata = array(
'pa_autore' => array(
'name' => 'pa_autore',
'value' => $prova_termine,
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
),
);
// Обновляем метаданные продукта
update_post_meta($post_id, '_product_attributes', $thedata);
}
Объяснение ключевых элементов кода
-
Проверка условия автоматического сохранения:
Мы используем проверкуDOING_AUTOSAVE
для предотвращения выполнения кода, когда WordPress автоматически сохраняет пост. -
Проверка прав пользователя:
Проверкаcurrent_user_can('edit_post', $post_id)
обеспечивает, что текущий пользователь имеет право редактировать продукт, что повышает безопасность вашего кода. -
Сохранение терминов и атрибутов:
Мы обновляем постовые метаданные, что позволяет корректно сохранять атрибуты, связанные с продуктом.
Подведение итогов
Используя приведенные идеи и код, вы сможете добавлять и обновлять метаданные продуктов в WooCommerce корректным и безопасным образом. Этот подход также обеспечивает, что ваш код будет более устойчивым к ошибкам и не будет выполнять лишние действия, что, в свою очередь, улучшит производительность вашего сайта.
Таким образом, следуя этим рекомендациям, вы сможете эффективно обновлять метаданные продуктов и управлять ими через WooCommerce, что в конечном итоге приведет к лучшему пользовательскому опыту и повышению продаж вашего магазина.