【发布时间】:2019-04-11 13:52:27
【问题描述】:
只需尝试在自定义结帐模板中逐页存储和检索未注册的客户数据。我已经将它剥离到裸露的骨头以试图查明问题。
这个
<?php
$customer = WC()->customer;
$customer->set_billing_first_name("WORKING!!!");
$customer->save();
var_dump($customer->get_billing());
?>
输出这个
array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)
然后这个
<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>
输出这个
array (size=1)
'country' => string 'US' (length=2)
尽管我应该仍然在同一个会话中,因此应该在 cmets 之前获取存储的数据。我所做的只是在注释掉这两行之后刷新页面。
我对这些方法完全错了吗?
已检查
环境配置完全正确。甚至让其他人为我仔细检查。 URL、缓存等。
它在登录时似乎可以工作,但绝大多数用户从不这样做,这不是很有帮助。
已在两台不同的服务器(一台本地服务器,一台远程服务器)上尝试过此操作,但遇到了同样的问题。
从新安装 WP+WC 开始,创建了一个空白主题 functions.php,它在初始化代码上执行上述操作。完全相同的问题。
【问题讨论】:
-
如果
$customer->get_id()是0,这是正常现象,这在您未登录时发生。 WooCommerce 将会话标识符(用户 ID 或自动生成的客户 ID)存储在浏览器的 cookie 中,而不是超全局$_SESSION。尝试var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() )并在您登录而不是登录时查看输出。 -
@SallyCJ 啊,好吧,所以我认为在会话中存储客户数据的根本假设是错误的?我看到在请求中传递了
wp_woocommerce_session_xxx=yyyycookie……它有一个内置的方法来临时存储这个客户数据吗? -
你的假设基本正确;但是,会话数据(会话标识符除外;例如购物车内容)存储在
{prefix}woocommerce_sessions表中 - 例如wp_woocommerce_sessions。这与 WordPress 身份验证的工作方式相同,您的用户 ID 保存在 cookie 中,但会话的其余部分保存在数据库中。您可以使用WC()->session->set()临时保存数据,这些数据可以跨页面持续存在 - 但当然必须在用户的浏览器中启用 cookie。 -
@SallyCJ 我看到了同样的问题,使用
WC()->session,设置一个变量,然后注释掉集合并刷新页面。我使用WC()->session->set()和WC()->session->get()保存并成功返回的值在导航后完全不存在。 -
检查我的答案,让我知道它是怎么回事。希望它有效..
标签: php wordpress session woocommerce