1

我希望客户能够在将产品添加到购物车之前设置他们的邮政编码。
然后保存此邮政编码并用于定义可用的交付方式。

我已经制作了以下功能,但它并不总是有效,我不确定应该使用哪些 Woocommerce 方法以及它们之间有什么区别:

  • WC()->customer->set_shipping_postcode(...)WC()->customer->get_shipping_postcode()
  • WC()->session->set('shipping_postcode', ...)WC()->session->get('shipping_postcode')
  • update_user_meta(get_current_user_id(), 'shipping_postcode', ...)get_user_meta(get_current_user_id(), 'shipping_postcode', true)

此外,我正在保存账单和运输的邮政编码,因为我不知道用户之前是否下过订单并选择将其交付到与账单地址不同的送货地址。


function getDeliveryZipcode()
{
  $shipping_postcode = WC()->customer->get_shipping_postcode();
  $billing_postcode = WC()->customer->get_billing_postcode();
  return $shipping_postcode ? $shipping_postcode : $billing_postcode;
}

function setDeliveryZipcode()
{
  $zipcode = $_GET['zipcode'];

  // ...

  WC()->customer->set_shipping_postcode(wc_clean($zipcode));
  WC()->customer->set_billing_postcode(wc_clean($zipcode));
}

谢谢

4

1 回答 1

2

您的代码大部分是正确的,但缺少一些东西,以避免任何问题:

// Important: Early enable customer WC_Session 
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
    if ( ! is_admin() && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
}

function getDeliveryZipcode()
{
    $shipping_postcode = WC()->customer->get_shipping_postcode();
    $billing_postcode = WC()->customer->get_billing_postcode();

    return ! empty($shipping_postcode) ? $shipping_postcode : $billing_postcode;
}

function setDeliveryZipcode()
{
    if ( isset($_GET['zipcode']) ) {
        WC()->customer->set_shipping_postcode(wc_clean($_GET['zipcode']));
        WC()->customer->set_billing_postcode(wc_clean($_GET['zipcode']));
    }
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。测试和工作。


以下是 之间解释的差异WC_SessionWC_Customer以及WordPress与用户数据相关的差异:

  • WC()->customer从定义的登录用户(即存储在数据库和表中的数据)WC_Customer访问注册用户数据的对象,否则它将读取来宾的会话数据wp_userswp_usermeta
  • WC()->sessionWooCommerce session为任何客户或客人wp_woocommerce_sessions存储的数据,通过表格链接到浏览器 cookie 和数据库。但请注意,“客户”WC 会话在第一次添加到购物车时启用。
  • WordPress 功能get_user_meta()set_user_meta()update_user_meta()允许从wp_usermeta注册用户的表中读取/写入/更新用户元数据。

注意: WooCommerce 中不存在以下内容:

$postcode = WC()->session->get('shipping_postcode'); 
WC()->session->set('shipping_postcode', $postcode);

可以使用以下方式读取客户会话数据:

// Get an array of the current customer data stored in WC session
$customer_data = (array) WC()->session->get('customer'); 

// Get the billing postcode
if ( isset( $customer_data['postcode'] ) )
    $postcode = $customer_data['postcode']; 

// Get the shipping postcode
if ( isset( $customer_data['shipping_postcode'] ) )
    $postcode = $customer_data['shipping_postcode'];

例如,可以使用以下方式设置客户会话数据:

// Get an array of the current customer data stored in WC session
$customer_data = (array) WC()->session->get('customer'); 

// Change the billing postcode
$customer_data['postcode'] = '10670';

// Change the shipping postcode
$customer_data['shipping_postcode'] = '10670';

// Save the array of customer WC session data
WC()->session->set('customer', $customer_data);

对于WC()->customer,您可以使用任何WC_Customer可用的 getter 和 setter 方法,但有些方法不适用于客人。

于 2020-06-04T20:01:12.057 回答