【问题标题】:WordPress/WC session not carried to next pageWordPress/WC 会话未进行到下一页
【发布时间】: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 之前获取存储的数据。我所做的只是在注释掉这两行之后刷新页面。

我对这些方法完全错了吗?


已检查

  1. 环境配置完全正确。甚至让其他人为我仔细检查。 URL、缓存等。

  2. 它在登录时似乎可以工作,但绝大多数用户从不这样做,这不是很有帮助。

  3. 已在两台不同的服务器(一台本地服务器,一台远程服务器)上尝试过此操作,但遇到了同样的问题。

  4. 从新安装 WP+WC 开始,创建了一个空白主题 functions.php,它在初始化代码上执行上述操作。完全相同的问题。

【问题讨论】:

  • 如果$customer-&gt;get_id()0,这是正常现象,这在您未登录时发生。 WooCommerce 将会话标识符(用户 ID 或自动生成的客户 ID)存储在浏览器的 cookie 中,而不是超全局 $_SESSION。尝试var_dump( $customer-&gt;get_billing(), $customer-&gt;get_id(), WC-&gt;session-&gt;get_customer_id() ) 并在您登录而不是登录时查看输出。
  • @SallyCJ 啊,好吧,所以我认为在会话中存储客户数据的根本假设是错误的?我看到在请求中传递了wp_woocommerce_session_xxx=yyyy cookie……它有一个内置的方法来临时存储这个客户数据吗?
  • 你的假设基本正确;但是,会话数据(会话标识符除外;例如购物车内容)存储在 {prefix}woocommerce_sessions 表中 - 例如wp_woocommerce_sessions。这与 WordPress 身份验证的工作方式相同,您的用户 ID 保存在 cookie 中,但会话的其余部分保存在数据库中。您可以使用WC()-&gt;session-&gt;set() 临时保存数据,这些数据可以跨页面持续存在 - 但当然必须在用户的浏览器中启用 cookie。
  • @SallyCJ 我看到了同样的问题,使用WC()-&gt;session,设置一个变量,然后注释掉集合并刷新页面。我使用WC()-&gt;session-&gt;set()WC()-&gt;session-&gt;get() 保存并成功返回的值在导航后完全不存在。
  • 检查我的答案,让我知道它是怎么回事。希望它有效..

标签: php wordpress session woocommerce


【解决方案1】:

如果$customer-&gt;save() 没有保留您对客户数据所做的更改(例如$customer-&gt;set_billing_first_name('Test')),那么很可能是因为客户未注册到站点或未登录,其中$customer-&gt;get_id() 是@ 987654326@.

这很正常,因为需要用户 ID 或会话 ID 才能正确保存更改并使其在不同页面中持久存在。

因此,当用户未注册/登录时,WooCommerce 在用户登录或他/她将产品添加到购物车之前不会开始其会话。

但您可以手动启动会话,如下所示:(将代码添加到活动主题的 functions.php 文件中)

add_action( 'woocommerce_init', function(){
    if ( ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
} );

然后,只要在浏览器上启用 cookies,对客户数据的更改就会继续到其他页面,因为就像 WordPress 一样,WooCommerce 存储其会话 ID(用户 ID或 cookie 中自动生成的 ID/哈希)——会话 ID 用于设置/检索数据库中的会话数据——如果没有任何表前缀,则表名为 woocommerce_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>';
}

还有这个——你应该在每个页面加载时看到一个新的日期:(嗯,你之前设置的那个)

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' );

【讨论】:

  • 今天你是我的英雄。我会认真付钱给你回答我关于 WP 的问题。我的知识有很多空白......
  • 嗯,我总是从人们的代码中学习,并最终及时变得更好。我相信你也可以。 :) 但是,嘿,我的知识仍然存在差距,因为没有人是完美的... xD 你可以随时在 Stack Overflow 上提问 - 或者对于 WordPress 特定,比如创建自定义 WordPress REST API端点,那么您应该在WordPress Stack Exchange 上询问它。 (但请注意,WooCommerce 的问题在那里是题外话..)
  • 卡在这个上面好几天了,你好像比我更懂骨头stackoverflow.com/questions/53362482/…
  • 抱歉,Randy,我忘记了那个问题,当我想回答的时候,你已经发布了答案,所以我 +1,我相信现在一切都很好。 :)
  • 在购物车为空(且未登录)时刷新会话时遇到了同样的问题。我在继续购物车之前询问了信息,所以解决方法有点烦人,这解决了问题。
【解决方案2】:

您是否使用在 Wordpress 中设置的 Url?它似乎是根据应用程序中配置的 url 而不是实际的 url 存储 cookie。

希望这会有所帮助。

来源:https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress

【讨论】:

  • 这实际上是我网站的本地副本。您是否有关于检查位置/哪些设置的快速参考?
  • 在 wp-config.php 中或者在 General Settings 下的界面中
  • 检查 wp-config.php 中的 WP_SITEURL
  • 有趣的是,该站点根目录下的 wp-config.php 中没有设置 WP_SITEURL。如在属性未列出。这是一个托管在 wpengine 上的网站,他们在这里确实有一些自定义设置,但我不确定这是否会产生任何影响。但我喜欢这种思路,现在工作更多
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 2014-04-16
  • 2013-05-01
  • 1970-01-01
  • 2016-07-28
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多