Php WordPress/WC会话未转到下一页
只需尝试在自定义签出模板中逐页存储和检索未注册的客户数据。我已经把它剥离到了最底层,试图找出问题所在 这个 但是这个Php WordPress/WC会话未转到下一页,php,wordpress,session,woocommerce,Php,Wordpress,Session,Woocommerce,只需尝试在自定义签出模板中逐页存储和检索未注册的客户数据。我已经把它剥离到了最底层,试图找出问题所在 这个 但是这个 <?php $customer = WC()->customer; //$customer->set_billing_first_name("WORKING!!!"); //$customer->save(); var_dump($customer->get_billing()); ?> 即使我仍然应该在同一个
<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>
即使我仍然应该在同一个会话中,因此应该在注释之前存储数据。我所做的只是在注释掉这两行之后刷新页面
我对这些方法完全错了吗
已选中
您是否正在使用Wordpress中设置的Url?它似乎基于应用程序中配置的url而不是实际的url来存储cookie 希望这有帮助 来源:如果
$customer->save()
没有保留您对客户数据所做的更改(例如$customer->set_billing_first_name('Test')
),则可能是因为客户未注册到该网站或未登录,$customer->get_id()
是0
这是正常的,因为需要用户ID或会话ID才能正确保存更改并使其在不同页面上持久化
因此,当用户未注册/登录时,WooCommerce在用户登录或将产品添加到购物车之前不会启动其会话
但是您可以手动启动会话,如下所示:(将代码添加到活动主题的functions.php
文件)
然后,只要浏览器上启用了Cookie,对客户数据的更改就会被转移到其他页面,因为就像WoodPress一样,WooCommerce存储其会话ID(用户ID或自动生成的ID/哈希)在cookies中-会话ID用于设置/检索数据库中的会话数据-如果没有任何表前缀,则表名为woocommerce\u sessions
启动WooCommerce会话后,请尝试以下操作:
$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}
$customer=WC()->customer;
//如有必要,更改“测试”-例如“独一无二的东西”
如果('Test'!=$customer->get\u billing\u first\u name()){
$customer->set_billing_first_name('Test');
echo“将名字添加到会话
”;
}否则{
回显“从会话读取的名字
”;
}
这一个-你应该在每个页面加载上看到一个新的日期:(好的,就是你之前设置的日期)
echo WC()->session->get('test','None set')。'
';
WC()->session->set('test',当前时间('mysql');
echo WC()->session->get('test','It不能为空');
这实际上是我网站的本地副本。您是否有要检查的位置/设置的快速参考?在wp-config.php中或在wp-config.php中的General SettingsCheck wp_SITEURL下的界面中。通常,此站点根目录中的wp-config.php中没有设置wp_SITEURL。如中所示,该属性未列出。这是一个托管在wpengine上的站点,它们在这里有一些自定义设置,但我不确定这是否会有任何影响。但是我喜欢这种思路,现在就做更多这是一件正常的事情,如果$customer->get_id()
是0
,这在您未登录时发生。WooCommerce将会话标识符(用户ID或自动生成的客户ID)存储在浏览器的Cookie中,而不是超级全局$\u会话
。尝试var\u dump($customer->get\u billing(),$customer->get\u id(),WC->session->get\u customer\u id())
,并在登录和未登录时查看输出。@SallyCJ好的,那么我的根假设是在会话中存储客户数据是错误的吗?我看到请求中传递了wp\u woocommerce\u session\u xxx=yyyy
cookie。。。是否有一种内置的方法来临时存储此客户数据?您的假设基本正确;但是,会话数据(会话标识符除外;例如购物车内容)存储在{prefix}woocommerce\u会话
表中-例如wp\u woocommerce\u会话
。这与WordPress身份验证的工作原理相同,即用户ID保存在cookie中,但会话的其余部分保存在数据库中。您可以使用WC()->session->set()
临时保存数据,这些数据可以跨页面保存-但当然,必须在用户的浏览器中启用cookie。@SallyCJ我看到了同样的问题,使用WC()->session
,设置一个变量,然后注释出集合并刷新页面。我使用WC()->session->set()
和WC()->session->get()
保存并成功返回的值在导航后完全不存在。请检查我的答案并让我知道它是如何运行的。希望它能起作用……你今天是我的英雄。我会认真付钱给你回答我关于WP的问题。在我的知识中有如此多的差距…嗯,我总是从人们的代码中学习,最终变得更好。我相信你也可以。:)但是,嘿,我的知识还是有差距的,因为没有人是完美的。。。xD,您可以随时询问有关堆栈溢出的问题,或者对于特定于WordPress的问题,如创建自定义WordPress REST API端点,那么您应该询问它。(不过请注意,WooCommerce的问题已经离题了……)这一问题已经讨论了好几天了,你似乎比我更了解骨骼。对不起,兰迪,我忘了那个问题,在我想回答的时候,你已经发布了答案,所以我+1它,我确信现在一切都好了。:)同样
<?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)
add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );
$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}
echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can\'t be empty' );