Вопрос или проблема
Я создаю сайт на WooCommerce, и у меня есть несколько полей ввода на странице продукта. Одно из них — это электронная почта получателя (для подарочной карты). Все работает, и электронная почта получателя сохраняется в заказе, но я хочу иметь возможность передать адрес электронной почты в функцию update_meta_data, чтобы я мог использовать его в других частях кода (в частности, чтобы отправить отдельное сообщение получателю для активации карты).
Вот функция, которую я пытаюсь использовать:
add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
$order = wc_get_order( $order_id );
$order->update_meta_data( 'recipient_email', "[email protected]" );
$order->save();
} , 10, 2);
Где “joe@acme”, я хочу передать значение из формы. Форма рендерится с помощью пользовательского плагина формы. HTML формы выглядит так:
<input name="recipient_email" id="recipient_email" data-type="text" data-req="on" data-message="no email" maxlength="255" style="width: 100%; padding: 0px;" type="text">
Как я уже сказал, форма работает и сохраняет электронную почту получателя в заказе, но не как метаданные поста, поэтому я не знаю, как получить и сохранить это значение в переменной, которую я могу использовать в других частях кода.
Вы можете использовать параметр $posted
, чтобы получить нужное значение в вашей функции.
add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
$order = wc_get_order( $order_id );
$order->update_meta_data( 'recipient_email', $posted['recipient_email'] );
$order->save();
} , 10, 2);
Убедитесь, что $posted — это массив, а не объект, с помощью var_dump для $posted. Если это объект, замените $posted['recipient_email']
на $posted->recipient_email
.
Надеюсь, это поможет 🙂
Вы можете использовать следующий код в файле functions.php вашей активной темы или активной дочерней темы
add_action( 'woocommerce_checkout_update_order_meta', 'save_recipient_email_to_order_meta', 10, 2 );
function save_recipient_email_to_order_meta( $order_id, $posted_data ) {
// Получаем электронную почту получателя из переданных данных
$recipient_email = isset( $posted_data['recipient_email'] ) ? $posted_data['recipient_email'] : '';
// Сохраняем электронную почту получателя как метаданные поста заказа
if ( $recipient_email ) {
update_post_meta( $order_id, 'recipient_email', $recipient_email );
}
}
Вы получите метаданные, используя order_id
$order_id = 123; // Замените 123 на фактический ID заказа
// Получите электронную почту получателя из метаданных заказа
$recipient_email = get_post_meta( $order_id, 'recipient_email', true );
Ответ или решение
Конечно, давайте разберем, как получить значение из поля ввода и передать его в функцию update_meta_data
, чтобы сохранить адрес электронной почты получателя для использования в других частях вашего кода.
Для этого вам нужно использовать хук woocommerce_checkout_update_order_meta
, который срабатывает после обновления метаданных заказа во время процесса оформления заказа. Ниже приведен пример кода, который вам нужно вставить в файл functions.php
вашей активной темы или дочерней темы:
add_action('woocommerce_checkout_update_order_meta', 'save_recipient_email_to_order_meta', 10, 2);
function save_recipient_email_to_order_meta($order_id, $posted_data) {
// Получаем адрес электронной почты получателя из переданных данных
$recipient_email = isset($posted_data['recipient_email']) ? sanitize_email($posted_data['recipient_email']) : '';
// Сохраняем адрес электронной почты в метаданных заказа, если он задан
if ($recipient_email) {
update_post_meta($order_id, 'recipient_email', $recipient_email);
}
}
Объяснение кода:
- Добавление действия: Мы используем
add_action
, чтобы запустить нашу функциюsave_recipient_email_to_order_meta
в момент, когда данные заказа обновляются. - Функция: В функции мы проверяем, передан ли адрес электронной почты и очищаем его от лишних символов с помощью функции
sanitize_email
, чтобы избежать возможных проблем с безопасностью. - Сохранение данных: Если адрес электронной почты получателя был передан, мы сохраняем его как метаданные заказа при помощи
update_post_meta
.
Получение метаданных:
Чтобы получить сохранённый адрес электронной почты получателя в других частях вашего кода, вы можете использовать следующую функцию:
$order_id = 123; // Здесь замените 123 на актуальный ID заказа
// Получаем адрес электронной почты получателя из метаданных заказа
$recipient_email = get_post_meta($order_id, 'recipient_email', true);
Таким образом, вы сможете получить доступ к адресу электронной почты получателя в любом месте вашего кода, где у вас есть доступ к идентификатору заказа.
Важно:
- Убедитесь, что в вашем HTML-коде для поля ввода указывается правильное имя (
name="recipient_email"
), чтобы оно совпадало с тем, что вы ожидаете в массиве$posted_data
. - Также важно проверить, что у вас есть необходимые проверки и валидация данных, чтобы избежать проблем с безопасностью и корректностью введённых данных.
Если у вас возникнут дополнительные вопросы или понадобится помощь, не стесняйтесь обращаться!