我在结帐(选择字段)中添加了一个自定义字段,我想将该字段与所有其他字段一起保存,但它在我使用的任何插件上根本不显示自定义字段。
这是我添加到我的functions.php 文件中的代码:
//* Add select field to the checkout page
add_action('woocommerce_before_order_notes', 'wps_add_select_checkout_field');
function wps_add_select_checkout_field( $checkout ) {
woocommerce_form_field( 'studio', array(
'type' => 'select',
'class' => array( 'wps-drop' ),
'label' => __( 'Select your studio' ),
'required' => true,
'priority' => 5, // Priority sorting option
'options' => array(
'blank' => __( 'Select Your Studio', 'wps' ),
'Ukraine & Poland' => __('Ukraine & Poland', 'wps' ),
'Israel' => __('Israel', 'wps' ),
'Kyiv' => __('Kyiv', 'wps' ),
'Finland ' => __('Finland', 'wps' )
)
),
$checkout->get_value( 'studio' ));
}
//* Process the checkout
add_action('woocommerce_checkout_process', 'wps_select_checkout_field_process');
function wps_select_checkout_field_process() {
global $woocommerce;
// Check if set, if its not set add an error.
if ($_POST['studio'] == "blank")
wc_add_notice( '<strong>Please select your studio</strong>', 'error' );
}
知道我需要做什么才能保存这个字段吗?
您的代码没问题,但您没有保存该字段!
添加此字段以保存订单元数据中的字段:
/**
* Saves the value of the "studio" custom checkout field to the order meta data.
*
* @param int $order_id The ID of the order being processed.
*/
function wps_save_select_checkout_field( $order_id ) {
// Check if the "studio" field was submitted and is not empty.
if ( ! empty( $_POST['studio'] ) ) {
// Sanitize the input before saving it to the database.
$studio_value = sanitize_text_field( $_POST['studio'] );
// Update the order meta data.
update_post_meta( $order_id, 'studio', $studio_value );
}
}
add_action( 'woocommerce_checkout_update_order_meta', 'wps_save_select_checkout_field' );
然后您可以像任何其他元字段一样检索它。这是一个函数,它将输出在“studio”字段中所做的选择:
/**
* Gets the value of the "studio" custom checkout field from a WooCommerce order.
*
* @param int $order_id The ID of the WooCommerce order.
* @return string|null The value of the "studio" field, or null if not found.
*/
function wps_get_order_studio_field( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
return $order->get_meta( 'studio' );
}
return null;
}
用途:
// save the choice in a variable for order with id 1235
$studio_selection = wps_get_order_studio_field( '1235 );
// display the choice
echo esc_html( $studio_selection );
注意:我强烈建议不要使用“studio”作为字段名称,添加前缀以避免冲突,即“wps_studio”
从版本 3 开始,WooCommerce 正在迁移到自定义数据库表,特别是订单。实际上,自从 WooCommerce 版本 8 具有高性能订单存储 (HPOS) 以来,您需要使用 WooCommerce setter 方法来保存数据,而不是使用 WordPress post 元函数。
要将自定义结账字段选择的值保存为订单元数据,请使用:
add_action( 'woocommerce_checkout_create_order', 'save_custom_fields_as_order_metadata' );
function save_custom_fields_as_order_metadata( $order ) {
if ( isset($_POST['studio']) )
$order->add_meta_data('studio', esc_attr($_POST['studio']), true );
}
}
例如,您可以在管理订单中显示它:
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'admin_order_display_custom_field_after_shipping_address' );
function admin_order_display_custom_field_after_shipping_address( $order ) {
if ( $studio_value = $order->get_meta('studio') ) {
printf( '<div><strong>%s:</strong> <span>%s</span></div>',
__('Studio', 'wps'), $studio_value
);
}
}
如您所见,您可以从
WC_Order
对象访问此元数据,例如:
$studio_value = $order->get_meta('studio');
注意:与旧版发布数据和高性能订单存储 (HPOS) 兼容。