首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示有多少人在他们的WooCommerce购物车中有一个产品,但在结果中添加一个(临时)随机数。

显示有多少人在他们的WooCommerce购物车中有一个产品,但在结果中添加一个(临时)随机数。
EN

Stack Overflow用户
提问于 2022-02-22 14:02:59
回答 1查看 321关注 0票数 1

就像你在Etsy这样的商店看到的一样,我想显示购物车里有产品的人的数量。

通过显示有多少人在他们当前的购物车中添加了一个产品。,我能够做到这一点。

但我的网站还在建设中,当我开始的时候,我想让它看起来像2-4人已经在他们的购物车中的产品。

因此,我对现有的代码进行了调整,添加了$in_basket = rand(2, 4);,结果如下:

代码语言:javascript
复制
function show_no_of_people_added_in_cart() {
    global $wpdb, $product;
    
    $in_basket = rand(2, 4);
    
    $wc_session_data = $wpdb->get_results( "SELECT session_key FROM {$wpdb->prefix}woocommerce_sessions" );
    $wc_session_keys = wp_list_pluck( $wc_session_data, 'session_key' );
    
    if ( $wc_session_keys ) {
        foreach ( $wc_session_keys as $key => $_customer_id ) { 
            // if you want to skip current viewer cart item in counts or else can remove belows checking
            if( WC()->session->get_customer_id() == $_customer_id ) continue;
            
            $session_contents = WC()->session->get_session( $_customer_id, array() );
            $cart_contents = maybe_unserialize( $session_contents['cart'] );
            
            if ( $cart_contents ) {
                foreach ( $cart_contents as $cart_key => $item ) {
                    if( $item['product_id'] == $product->get_id() ) {
                        $in_basket += 1;
                    }
                }
            }
        }
    }

    if ( $in_basket ) 
        echo '<div class="in-basket">' . sprintf( __( 'Hurry! %d people have this in their cart!', 'text-domain' ), $in_basket ) . '</div>';

}
add_action( 'woocommerce_after_shop_loop_item_title', 'show_no_of_people_added_in_cart', 11 );
add_action( 'woocommerce_single_product_summary', 'show_no_of_people_added_in_cart', 21 );

,但问题是每次刷新时,数字都会发生变化。我怎么能把这个随机数保持一段时间?有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-22 15:15:19

我会用会话来存储购物车中有产品的人的数量。

在下面的示例中,我将在会话中保留相同的数字1分钟(60秒)。

首先,启用Wordpress中的会话--在function.php的开头放置以下代码:

代码语言:javascript
复制
if (!session_id()) {
    session_start();

    // create a session 'randinbasket' containing an empty array if it doesnt exist
    if (!isset($_SESSION['randinbasket'])) $_SESSION['randinbasket'] = array();
}

然后,创建一个函数,该函数要么从会话中获取一个数字,要么生成一个新的:

代码语言:javascript
复制
/**
 * Generates a random number, stores it in a session
 * @param integer $minCount - minimal number
 * @param integer $maxCount - maximal number 
 * @param integer $prodId - product ID
 * @param integer $expiresAfter - session expiry in seconds 
 */
function get_random_in_basket($minCount, $maxCount, $prodId, $expiresAfter) {
    $inBasketData = $_SESSION['randinbasket'];
    $prodKey = 'product_' . $prodId;
    $timeNow = time(); // current timestamp
    $randomCount = rand($minCount, $maxCount);

    if (isset($inBasketData[$prodKey])) { // If product data exists in the session
        $inBasketProductData = $inBasketData[$prodKey];

        // If current time is within expiration time
        if ($timeNow <= $inBasketProductData['time'] + $expiresAfter) {
            return $inBasketData[$prodKey]['count'];
        }
    }

    $inBasketData[$prodKey] = array(
        'time' => $timeNow,
        'count' => $randomCount
    );

    $_SESSION['randinbasket'] = $inBasketData;
    return $randomCount;
}

最后,稍微修改一下show_no_of_people_added_in_cart()函数:

代码语言:javascript
复制
function show_no_of_people_added_in_cart() {
    global $wpdb, $product;
    
    $in_basket = get_random_in_basket(2, 4, $product->get_id(), 60);

    $wc_session_data = $wpdb->get_results( "SELECT session_key FROM {$wpdb->prefix}woocommerce_sessions" );
    ...

如果上面的代码适用于您的WP,请考虑将会话结束时间从60秒增加到86400秒(等于1天):

代码语言:javascript
复制
$in_basket = get_random_in_basket(2, 4, $product->get_id(), 86400);

更新

函数show_no_of_people_added_in_cart()的代码中似乎出现了一个错误,这使得Wordpress在将产品添加/移除/从篮子中删除后,不会从随机生成的数字中添加/减1。

简言之,这一行:

代码语言:javascript
复制
$cart_contents = maybe_unserialize( $session_contents['cart'] );

应该将篮子的内容存储在变量中,但是IT根本不存储任何内容。

要解决这个问题,我们必须用以下两行替换上面的行,这两行实际上得到了您的购物车的内容:

代码语言:javascript
复制
global $woocommerce;
$cart_contents = $woocommerce->cart->get_cart();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71222684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档