代码之家  ›  专栏  ›  技术社区  ›  Randy Hall

WordPress/WC会话未转到下一页

  •  -1
  • Randy Hall  · 技术社区  · 6 年前

    只需尝试在自定义签出模板中逐页存储和检索未注册的客户数据。我已经把它剥去了,只为了找出问题所在。

    <?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)
    


    选中的

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

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

    3. 在两个不同的服务器(一个本地服务器,一个远程服务器)上尝试过这个方法,但遇到了相同的问题。

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

    2 回复  |  直到 6 年前
        1
  •  10
  •   Sally CJ    5 年前

    如果 $customer->save() $customer->set_billing_first_name('Test') $customer->get_id() 0 .

    因此,当用户未注册/登录时,WooCommerce不会启动其会话,直到用户登录,或者他/她将产品添加到购物车中。

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

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

    然后,对客户数据的更改将被转到其他页面,只要 曲奇 是在浏览器上启用的,因为就像WordPress一样,WooCommerce将其会话ID(用户ID或自动生成的ID/哈希)存储在Cookie中—会话ID用于设置/检索数据库中的会话数据—表名是 woocommerce_sessions 如果没有任何表前缀。

    在启动会话后尝试以下操作:

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