#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 Также обратите внимание, что соответствующая минимальная информация о бронировании хранится в заказе как метаданные пользовательского элемента заказа (а не метаданные заказа) и связана с записью бронирования… Поэтому лучше задать новый вопрос со всеми связанными деталями в понятном виде. Вы можете уведомить меня здесь.