Действие woocommerce_checkout_update_order_meta не работает

Привет, сегодня я работал с woo-commerce и успешно создал несколько настраиваемых полей оформления заказа в соответствии с требованиями пользователя, но не могу сохранить их в базе данных.

Вот как я создал настраиваемые поля оформления заказа... это в дочерней теме functions.php

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Over Ridding, Removing, Creating New Fields.
function custom_override_checkout_fields( $fields ) {
     unset($fields['billing']['billing_company']);
     unset($fields['billing']['billing_address_2']);    
     unset($fields['order']['order_comments']);
     unset($fields['billing']['billing_address_1']);
     unset($fields['billing']['billing_city']);
     unset($fields['billing']['billing_postcode']);
     unset($fields['billing']['billing_email']);


     $fields['billing']['your_name'] = array(
    'type'      => 'text',
    'label'     => __('Full Name', 'woocommerce'),
    'placeholder'   => _x('Full Name', 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['your_phone_number'] = array(
    'type'      => 'text',
    'label'     => __('Your Phone Number', 'woocommerce'),
    'placeholder'   => _x('Your Phone Number', 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_name'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Name", 'woocommerce'),
    'placeholder'   => _x("Recipient's Name", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_company_name'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Company (if any)", 'woocommerce'),
    'placeholder'   => _x("Recipient's Company (if any)", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_phone_number'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Phone Number", 'woocommerce'),
    'placeholder'   => _x("Recipient's Phone Number", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     $fields['billing']['recipient_address'] = array(
    'type'      => 'text',
    'label'     => __("Recipient's Address", 'woocommerce'),
    'placeholder'   => _x("Recipient's Address", 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     return $fields;
}

В БД, где я ищу поля. его wp_postmeta таблица. Прикреплен снимок экрана, который я ищу с идентификатором заказа. stack.imgur.com/NdNTr.png" alt="wp_postmeta db table">

Теперь я добавил действие checkout_update_order_meta, чтобы обновить метаданные заказа и сохранить созданные мной поля. Но похоже, что это не работает, потому что, когда я проверяю таблицу wp_postmeta с последним созданным идентификатором заказа, я не нахожу там свои настраиваемые поля.

add_action( 'woocommerce_checkout_update_order_meta', 'some_custom_checkout_field_update_order_meta' );

function some_custom_checkout_field_update_order_meta( $order_id ) {


if ( ! empty( $_POST['recipient_address'] ) ) {
add_post_meta( $order_id, 'recipient_address', sanitize_text_field( $_POST['recipient_address'] ) );
}
if (!empty($_POST['recipient_phone_number'])) {
        update_post_meta($order_id, 'recipient phone number', sanitize_text_field($_POST['recipient_phone_number']));
    }

}

Это мое первое дело с кодом woocommerce, я много искал и пришел сюда, когда отказался от него. Пожалуйста, помогите мне разгадать эту загадку.

Пожалуйста, поправьте меня, что я делаю неправильно. Кроме того, после этого шага мне нужно будет отобразить эти настраиваемые поля на панели инструментов WordPress в разделе woocommerce> заказы> сведения о заказе, поэтому, если есть какая-либо полезная ссылка для этого, пожалуйста, предоставьте.

Заранее спасибо.


person Aitazaz Khan    schedule 18.05.2017    source источник


Ответы (1)


Я только что немного изменил вашу последнюю перехваченную функцию, и она работает (на версии WC 2.6.x и 3.0+). Лучше с функцией php empty() использовать переменные < em>(для совместимости с ретро).
Также лучше использовать update_post_meta() вместо add_post_meta(), так как эта функция проверит, что meta_key уже существует, а если нет, вместо этого будет вызван add_post_meta()...

Вот скриншот таблицы wp_postmeta, относящейся к метаданным заказа: wp_postmeta table

Если meta_key не начинается с символа подчеркивания, как здесь, он отображается на странице редактирования внутреннего порядка в метабоксе «Пользовательские поля»:введите здесь описание изображения

Вот этот код:

add_action( 'woocommerce_checkout_update_order_meta', 'saving_checkout_cf_data');
function saving_checkout_cf_data( $order_id ) {

    $recipient_address = $_POST['recipient_address'];
    if ( ! empty( $recipient_address ) )
        update_post_meta( $order_id, 'recipient_address', sanitize_text_field( $recipient_address ) );

    $recipient_phone_number = $_POST['recipient_phone_number'];
    if ( ! empty( $recipient_phone_number ) )
        update_post_meta($order_id, 'recipient_phone_number', sanitize_text_field( $recipient_phone_number ) );

}

Код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Если вы хотите, чтобы поле meta_key начиналось с _billing…, как в классических полях оплаты, вам просто нужно изменить это в функции update_post_meta(). Например:

update_post_meta( $order_id, '_billing_recipient_address', sanitize_text_field( $recipient_address ) );

Но в этом случае это не будет отображаться в метабоксе настраиваемых полей на странице редактирования заказа.

person LoicTheAztec    schedule 18.05.2017
comment
Это работало как чемпион, поэтому единственной ошибкой была вложенная функция. if(! empty($_POST['ПРОБЛЕМА, Я НЕ БУДУ РАБОТАТЬ КАК ВЛОЖЕННАЯ ФУНКЦИЯ'])); БОЛЬШОЕ СПАСИБО, ПРИЯТЕЛЬ, КОД РАБОТАЕТ КАК ЧЕМПИОН, ТАКЖЕ ВЫ ОТКРЫЛИ МОЙ РАЗУМ ДЛЯ НЕСКОЛЬКИХ ДРУГИХ ВЕЩЕЙ - person Aitazaz Khan; 19.05.2017
comment
Вы также всегда можете использовать update_post_meta(), так как в него входит add_post_meta() - person LoicTheAztec; 19.05.2017
comment
Я позабочусь о том, что вы упомянули, но есть еще одна проблема: как я собираюсь отображать информацию о настраиваемых полях на панели инструментов WordPress в меню заказа? Вы можете помочь - person Aitazaz Khan; 19.05.2017
comment
Для справки, это официальный документ разработчиков для настраиваемых полей проверки: Настройка полей оформления заказа с помощью действий и фильтров - person LoicTheAztec; 19.05.2017
comment
Я прошел по ссылке, которую вы прислали несколько раз. Но я думаю, проблема заключалась в том, что моя БД не обновлялась с помощью настраиваемого мета-ключа и значений, поэтому я не видел данные настраиваемых полей в бэкэнде, позвольте мне попробовать сейчас и я свяжусь с вами... КСТАТИ большое спасибо вам чемпион чемпион чемпион - person Aitazaz Khan; 19.05.2017
comment
Я имею в виду панель управления wordpress › woocommerce › заказы › новейший заказ › просмотр › и полную информацию о заказе для владельца магазина - person Aitazaz Khan; 19.05.2017