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());
?>
即使我仍然应该在同一个会话中,因此应该在注释之前存储数据。我所做的只是在注释掉这两行之后刷新页面

我对这些方法完全错了吗


已选中

  • 环境配置完全正确。甚至有人帮我检查过。URL、缓存等

  • 登录时它看起来确实可以工作,但绝大多数用户从未这样做过,这不是很有帮助

  • 已经在两个不同的服务器(一个本地,一个远程)上尝试过此方法,但都存在相同的问题

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


  • 您是否正在使用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' );