与您在 Etsy 等商店中看到的类似,我想显示购物车中有产品的人数。
通过显示有多少人在当前购物车中添加了产品,我能够实现它。
但是我的网站仍在建设中,当我启动它时,我想让它看起来像 2-4 个人已经在购物车中购买了该产品。
所以我对现有代码进行了调整,我添加了
$in_basket = rand(2, 4);
,它给出了完整的结果:
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 );
但问题是每次刷新时数字都会发生变化。我怎样才能保留这个随机数一段时间?有什么建议吗?
我会使用会话来存储购物车中拥有该产品的人数。
在下面的示例中,我将在会话中保留相同的数字 1 分钟(60 秒)。
首先,在 Wordpress 中启用会话 - 在
function.php
的开头放置以下代码:
if (!session_id()) {
session_start();
// create a session 'randinbasket' containing an empty array if it doesnt exist
if (!isset($_SESSION['randinbasket'])) $_SESSION['randinbasket'] = array();
}
然后,创建一个函数,从会话中获取数字或生成一个新数字:
/**
* 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()
函数:
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 天):
$in_basket = get_random_in_basket(2, 4, $product->get_id(), 86400);
更新
您的函数代码中似乎存在错误
show_no_of_people_added_in_cart()
,导致在您向购物篮添加/删除产品后,Wordpress 无法从随机生成的数字中添加/减去 1。
简而言之,这一行:
$cart_contents = maybe_unserialize( $session_contents['cart'] );
应该将购物篮中的内容存储到变量中,但它什么也没有存储。
要解决此问题,我们必须将上面的行替换为实际获取购物车内容的这两行:
global $woocommerce;
$cart_contents = $woocommerce->cart->get_cart();
我喜欢这个想法的概念。我是 WordPress 新手,从未使用过编码方面。我希望有一个视频教程展示如何将代码添加到网站。当你说创建一个函数时!这是否意味着您复制下面的所有部分创建了一个函数?遗憾的是没有插件可以自动完成此操作。但我很想知道如何应用此代码以及在 WordPress 文件中的位置。谢谢