下面是一种在结帐页面和其他任何地方获取已发布数据的方法,而不会丢失此已发布数据。为此,我们将发布的数据设置为 WC 会话变量,因此发布的数据在需要时随时可用。
您页面上的表单 (具有多个字段的示例):
?><form action="<?php echo esc_url( wc_get_checkout_url() ); ?>" method="post">
<?php
$dogname = isset( $_POST['dogname'] ) ? sanitize_text_field( $_POST['dogname'] ) : '';
$dogcolor = isset( $_POST['dogcolor'] ) ? sanitize_text_field( $_POST['dogcolor'] ) : '';
?>
<div><label><?php _e("Name of Dog"); ?></label><p><input name="dogname" value="<?php echo $dogname; ?>"></p></div>
<div><label><?php _e("Color of Dog"); ?></label><p><input name="dogcolor" value="<?php echo $dogcolor; ?>"></p></div>
<button class="button" type="submit" name="dog_form" value="submited"><?php _e("Checkout"); ?></button>
</form><?php
将发布的数据设置为WC_Session 变量的代码:
// Early enable customer WC_Session
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
if ( is_user_logged_in() || is_admin() )
return;
if ( isset(WC()->session) && ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
}
// Set posted data in a WC session variable
add_action( 'template_redirect', 'set_custom_posted_data_to_wc_session' );
function set_custom_posted_data_to_wc_session() {
if ( is_checkout() && ! is_wc_endpoint_url() ) {
if ( isset($_POST['dog_form']) ) {
$values = array(); // Initializing
if ( isset($_POST['dogname']) && ! empty($_POST['dogname']) ) {
$values['dogname'] = sanitize_text_field($_POST['dogname']);
}
if ( isset($_POST['dogcolor']) && ! empty($_POST['dogcolor']) ) {
$values['dogcolor'] = sanitize_text_field($_POST['dogcolor']);
}
// Set data to a WC_Session variable
if ( ! empty($values) ) {
WC()->session->set('custom_data', $values);
}
}
}
}
代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。
然后您可以通过以下方式在任何函数或模板上获取该数据:
$values = WC()->session->get('custom_data');
$dogname = isset($values['dogname']) ? $values['dogname'] : '';
$dogcolor = isset($values['dogcolor']) ? $values['dogcolor'] : '';
将该数据保存到订单详情:
// Save WC session data as custom order meta data
add_action( 'woocommerce_checkout_create_order', 'action_checkout_add_custom_order_meta', 10, 2 );
function action_checkout_add_custom_order_meta( $order, $data ) {
$values = WC()->session->get('custom_data'); // Get data from WC Session variable
if( ! empty($values) ) {
if ( isset($values['dogname']) ) {
$order->update_meta_data( '_dogname', $values['dogname'] ); // Set dog name to order details
}
if ( isset($values['dogcolor']) ) {
$order->update_meta_data( '_dogcolor', $values['dogcolor'] ); // Set dog color to order details
}
// Remove the WC_Session variable (as we don't need it anymore)
WC()->session->__unset('custom_data');
}
}
代码进入活动子主题(或活动主题)的functions.php文件中。
然后您可以使用以下命令从 WC_Order 对象 order 中获取该数据:
$order = wc_get_order( $order_id ); // If needed, get the WC_Order object from order Id
$dogname = $order->get_meta('_dogname');
$dogcolor = $order->get_meta('_dogcolor');
就像这个钩子函数一样,它将在“收到订单”页面上显示数据:
add_action( 'woocommerce_thankyou', 'thankyou_display_dog_data' );
function thankyou_display_dog_data( $order_id ) {
$order = wc_get_order( $order_id ); // Get an instance of the WC_Order object
$dog_name = $order->get_meta('_dogname');
$dog_color = $order->get_meta('_dogcolor');
echo ! empty($dog_name) ? '<p>' . $dog_name .'<p>' : '';
echo ! empty($dog_color) ? '<p>' . $dog_color .'<p>' : '';
}
在上一个 WooCommerce 版本上测试并运行。