解决ECSHOP的购物车自动清空问题,改善会员体验

说起ecshop的不合理设计,接触ecshop的开发者对其购物车的清空设计估计都想暴走,几乎可以说,不管是不是会员、不管有没有登陆,购物车的数据是不保留的,甚至管理员登陆后台都会把购物车清空一次,似乎ECSHOP对购物车有刻骨之仇,分分钟要把购物车的数据清理掉。

首先我们来看看购物车的自动清空设置,多个清空设置防不胜防:

1. 当用户的IP变化后,购物车自动清空;

2. 当浏览器关闭后,购物车自动清空;

3. 当用户退出登陆后,购物车自动清空;

4. 管理员在后台登陆后,购物车自动清空。

网上给出了很多种修改方案,但都不全面,购物车依然会被清空。只有把程序中所有清空代码都修改掉才起作用。

修改如下:

1. 限制购物车仅登陆后使用,以免未登陆使用购物车后数据被清空

flow.php 找到

if($_REQUEST['step'] == 'add_to_cart')

{

include_once('includes/cls_json.php');

在下面添加

if(empty($_SESSION['user_name']))

{

$json = new JSON;

  $result['error']  = "999";

  $result['message'] = "请先登录";

  die($json->encode($result));

}

2. 不自动清空会员的购物车

关闭浏览器时,用户信息会更新,购物车被清空。退出登陆更是清空。我们修改为只清空游客的购物车,会员的不清空。

includes/cls_session.php找到destroy_session()函数,把其中

/* ECSHOP 自定义执行部分*/

if(!empty($GLOBALS['ecs']))

 {

  $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id' ");

 }

替换为

/* ECSHOP 自定义执行部分(不清空会员的购物车) */

 if(!empty($GLOBALS['ecs']))

 {

 $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id' AND user_id = '' ");

 }

includes\lib_main.php找到function update_user_info()函数,在该函数内部末尾添加如下代码

/* 更新用户购物车,退出不清空购物车*/

$sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET".

  " session_id = '" .SESS_ID . "'".

  " WHERE user_id = '" .$_SESSION['user_id'] . "'";

$GLOBALS['db']->query($sql);

注:includes\lib_main.php的function update_user_info()函数内更改用户退出不清空购物车逻辑根据网店的需求修改,如果一个商品有多个颜色属性上述的修改方案不适用。

3. 换IP时不影响购物车

将用户的IP存入Cookie,或者在生成SESSION时,不取IP。这步修改对动态IP用户无法使用购物车也同时解决。这里IP存入Cookie的有效期是10天,也就是10后购物车依然被清空了。如果想保留更久或更短,可以把864000改为其它数字。一般来说购物车数据留10天已足够了,10天了还未下单,基本上就不会下单了。而10后购物车清空,不会造成数据库压力。

includes/cls_session.php把$this->_ip = real_ip();

替换为

if(isset($_COOKIE['real_ipd']) && !empty($_COOKIE['real_ipd']))

 {

  $this->_ip = $_COOKIE['real_ipd'];

 }

 else

 {

  $this->_ip = real_ip();

  setcookie("real_ipd", $this->_ip, time()+864000, $this->session_cookie_path);

}

4. 管理员登陆时不清空购物车

特别不能理解管理员登陆后台,居然把全站的购物车都清空。难道管理员成了清洁工?若干会员在前台选购,选着选着你管理员要进后台看一下,你一进去,前台会员的购物车全空了、全下不成单了,这都什么事儿啊!

找admin/privilege.php,以下代码注解掉

// 清除购物车中过期的数据

 clear_cart();

再找

// 删除cart中无效的数据

 $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') .

   " WHERE session_id NOT " . db_create_in($valid_sess);

 $GLOBALS['db']->query($sql);

也注解掉。

猜你喜欢

转载自blog.csdn.net/qq_35095295/article/details/81540189