Вопрос или проблема
У меня есть пользовательский тип записи, который всегда выполняет математические операции с его post_meta и другими post_meta пользовательских типов записей.
Например:
- тип записи 1 = cpt_product_order
- post_meta типа записи 1 = cpt_pm_product_order
- тип записи 2 = cpt_product
- post_meta типа записи 2 = cpt_pm_product_stock
Существует cpt_product с cpt_pm_product_stock = 100, операция на фронтенде позволяет конкретному пользователю сделать заказ, вставив новый cpt_product с post_meta cpt_product_order равным 10, что вычитает cpt_pm_product_stock до 90.
100 cpt_pm_product_stock – 10 cpt_product_order = 90 cpt_pm_product_stock
Отмена заказа удалит/переместит в корзину cpt_product и cpt_product_order, а cpt_pm_product_stock должен вернуться к 100.
Какой хуке действия следует использовать для этой операции? Это trashed_post?
Я не нашел ответа в кодексе, http://codex.wordpress.org/Plugin_API/Action_Reference/trashed_post пустой.
Заранее спасибо за ответ. 😉
wp_trash_post
и trashed_post
– из источника:
function wp_trash_post($post_id = 0) {
if ( !EMPTY_TRASH_DAYS )
return wp_delete_post($post_id, true);
if ( !$post = wp_get_single_post($post_id, ARRAY_A) )
return $post;
if ( $post['post_status'] == 'trash' )
return false;
do_action('wp_trash_post', $post_id);
add_post_meta($post_id,'_wp_trash_meta_status', $post['post_status']);
add_post_meta($post_id,'_wp_trash_meta_time', time());
$post['post_status'] = 'trash';
wp_insert_post($post);
wp_trash_post_comments($post_id);
do_action('trashed_post', $post_id);
return $post;
}
before_delete_post
или wp_trash_post
.
Оба хуки срабатывают перед удалением или перемещением записи в корзину. Вы можете использовать один из этих хуков для выполнения необходимых операций, когда запись типа cpt_product_order
удаляется или перемещается в корзину.
add_action('before_delete_post', 'restore_stock_on_order_cancellation');
function restore_stock_on_order_cancellation($post_id) {
$post_type = get_post_type($post_id);
// Проверьте, является ли удаляемая запись типа 'cpt_product_order'
if ($post_type === 'cpt_product_order') {
// Получите сумму заказа из post meta
$order = get_post_meta($post_id, 'cpt_pm_product_order', true);
// Получите ID продукта из post meta
$product_id = get_post_meta($post_id, 'cpt_pm_product_id', true);
// Увеличьте запас связанного продукта
$current_stock = get_post_meta($product_id, 'cpt_pm_product_stock', true);
$new_stock = $current_stock + $order;
update_post_meta($product_id, 'cpt_pm_product_stock', $new_stock);
}
}
Ответ или решение
Чтобы эффективно обработать удаление записи пользовательского типа cpt_product_order
и восстановить соответствующее значение cpt_pm_product_stock
для связанного пользовательского типа cpt_product
, необходимо использовать хук, который срабатывает при удалении поста. В данном случае, из всех доступных хуков, лучше всего подходит хук before_delete_post
. Это связано с тем, что он позволяет выполнить необходимые операции до фактического удаления поста, обеспечивая возможность изменения метаданных, прежде чем данные будут навсегда удалены.
Подходящая реализация
Ваше требование заключается в том, чтобы увеличить значение запаса продукта при удалении заказа. Рассмотрим конкретную реализацию функции:
add_action('before_delete_post', 'restore_stock_on_order_cancellation');
function restore_stock_on_order_cancellation($post_id) {
// Получаем тип поста
$post_type = get_post_type($post_id);
// Проверяем, является ли удаляемый пост типом 'cpt_product_order'
if ($post_type === 'cpt_product_order') {
// Получаем количество заказанного товара из метаданых поста
$order_amount = get_post_meta($post_id, 'cpt_pm_product_order', true);
// Получаем ID связанного продукта из метаданых поста заказа
$product_id = get_post_meta($post_id, 'cpt_pm_product_id', true);
// Получаем текущее значение запаса продукта
$current_stock = get_post_meta($product_id, 'cpt_pm_product_stock', true);
// Увеличиваем запас продукта на количество отменяемого заказа
$new_stock = intval($current_stock) + intval($order_amount);
// Обновляем метаданные запаса для продукта
update_post_meta($product_id, 'cpt_pm_product_stock', $new_stock);
}
}
Основные моменты реализации:
-
Хук
before_delete_post
: Этот хук позволяет выполнить функции до удаления поста, что удобно для манипуляции постмета, который должен быть изменён до его окончательного удаления. -
Получение метаданных: Используется
get_post_meta
, чтобы получить количество заказанного товара и ID связанного продукта. Убедитесь, что все необходимые метаданные существуют, чтобы избежать возможных ошибок. -
Обновление метаданных: После вычисления нового значения запаса, использован
update_post_meta
, чтобы сохранить обновлённые данные.
Добавление хука trashed_post
Хотя trashed_post
также является важным хуком, в большинстве случаев он используется для логирования или выполнения очистительных действий после того, как пост был перемещён в корзину. В вашем случае, использование before_delete_post
будет более подходящим, так как необходимо изменить метаданные именно перед удалением, а не после.
Заключение
Такой подход позволит вам автоматически управлять метаданными запасов при удалении заказов. Убедитесь, что данная логика завершает корректное управление бизнес-процессами, связанными с продуктами и заказами. Важно также провести тестирование, чтобы гарантировать, что механизм работает и завершает корректные расчёты без ошибок.