Сохранение нескольких пользовательских полей оформления заказа WooCommerce в качестве метаданных заказа

#php #wordpress #woocommerce #metadata #orders

#php #wordpress #woocommerce #метаданные #заказы

Вопрос:

Я ищу какой-нибудь php-код, который позволит мне извлекать информацию (имя, адрес и т.д.) из полей оформления заказа и добавлять ее в метаданные заказа.

Ищите, чтобы это было как можно проще

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

 // Our hooked in function - $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
     $fields['shipping']['shipping_phone'] = array(
        'label'     => __('Phone', 'woocommerce'),
    'placeholder'   => _x('Phone', 'placeholder', 'woocommerce'),
    'required'  => false,
    'class'     => array('form-row-wide'),
    'clear'     => true
     );

     return $fields;
}

/**
 * Display field value on the order edit page
 */
 
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );

function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Phone From Checkout Form').':</strong> ' . get_post_meta( $order->get_id(), '_shipping_phone', true ) . '</p>';
}
/**
 * Add the field to the checkout
 */
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

    echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';

    woocommerce_form_field( 'my_field_name', array(
        'type'          => 'text',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Fill in this field'),
        'placeholder'   => __('Enter something'),
        ), $checkout->get_value( 'my_field_name' ));

    echo '</div>';

}
/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['my_field_name'] )
        wc_add_notice( __( 'Please enter something into this new shiny field.' ), 'error' );
}
/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['my_field_name'] ) ) {
        update_post_meta( $order_id, 'My Field', sanitize_text_field( $_POST['my_field_name'] ) );
    }
}
 

Мне это нравится, и это работает, но просто не так, как мне нужно, чтобы это работало. спасибо за любую помощь

Комментарии:

1. /** * Обновите метаданные заказа значением поля */ add_action( ‘woocommerce_checkout_update_order_meta’, ‘my_custom_checkout_field_update_order_meta’ ); функция my_custom_checkout_field_update_order_meta( $order_id ) { if ( ! empty( $field[billing_first_name] ) ) { update_post_meta( $order_id, ‘start_date_’, sanitize_text_field( $field[billing_first_name]) ); } } Это созданный мной код, я хочу, чтобы имя выставления счета копировалось в метаданные заказа

2. Привет, чтобы уточнить, я попытался создать некоторый код, который принимал бы значение имени для выставления счета и добавлял его в метаданные заказа, однако мои коды, похоже, не работают, и я не понимаю, почему

Ответ №1:

В вашем коде есть некоторые ошибки и недостающие элементы… Попробуйте вместо этого следующий код замены:

 // Add shipping phone (in checkout and My account edit shipping address) and save field value
add_action( 'woocommerce_shipping_fields', 'add_shipping_phone_field' );
function add_shipping_phone_field( $fields ) {
     $fields['shipping_phone'] = array(
        'label'     => __('Phone', 'woocommerce'),
        'placeholder'   => _x('Phone', 'placeholder', 'woocommerce'),
        'required'  => false,
        'class'     => array('form-row-wide'),
        'clear'     => true
     );

     return $fields;
}

// Display shipping phone value on the order edit pages under shipping section
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_shipping_phone_in_admin_orders' );
function display_shipping_phone_in_admin_orders( $order ){
    $phone_value = $order->get_meta('_shipping_phone');

    if ( ! empty($phone_value) ) {
        echo '<p><strong>'.__('Shipping phone').':</strong> ' . $phone_value . '</p>';
    }
}

// Add a custom checkout field
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {

    echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';

    woocommerce_form_field( 'my_field_slug', array(
        'type'          => 'text',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('My custom field'),
        'placeholder'   => __('Enter something… '),
        'required'      => true,
    ), $checkout->get_value( 'my_field_slug' ) );

    echo '</div>';
}
// Validate required checkout fields
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( isset($_POST['my_field_slug']) amp;amp; empty($_POST['my_field_slug']) ) {
        wc_add_notice( __( '"My custom field" is a required field.' ), 'error' );
    }
}

// Add custom checkout field value as custom order meta data
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order ) {
    if ( isset($_POST['my_field_slug']) amp;amp; ! empty($_POST['my_field_slug']) ) {
        $order->update_meta_data( 'My Field', sanitize_text_field( $_POST['my_field_slug'] ) );
    }
}

// Display "My field" value on the order edit pages under billing section
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_my_custom_checkout_field_in_admin_orders', 10, 1 );
function display_my_custom_checkout_field_in_admin_orders($order){
    $my_field_value = $order->get_meta('My Field');

    if ( ! empty($my_field_value) ) {
        echo '<p><strong>'.__('My field').':</strong> ' . $my_field_value . '</p>';
    }
}
 

Ввод кода functions.php файл активной дочерней темы (или активной темы). Протестировано и работает.


Теперь, если вам нужно извлечь некоторые данные из существующих полей оформления заказа Woocommerce и объединить их пользовательским способом, чтобы сохранить их как метаданные пользовательского заказа, постарайтесь быть более явным:

  • Какие поля?
  • Как вы хотите это объединить?
  • Что такое пользовательское поле, которое будет использоваться для сохранения этой комбинации данных?

Комментарии:

1. Привет, большое спасибо за помощь, код отличный. Я пытаюсь использовать этот код и его идею для сбора данных, в основном, я использую плагин бронирования woocommerce и пытаюсь получить дату начала, дату окончания, время начала и время окончания, которые выбираются клиентом для передачи в метаданные заказа, чтобы их можно было использовать для экспортаи сортировка заказов Я попробовал несколько разных вариантов кода, но, похоже, я не могу этого сделать

2. @AlasdairMacEwan Также обратите внимание, что соответствующая минимальная информация о бронировании хранится в заказе как метаданные пользовательского элемента заказа (а не метаданные заказа) и связана с записью бронирования… Поэтому лучше задать новый вопрос со всеми связанными деталями в понятном виде. Вы можете уведомить меня здесь.