WP笔记

wp-e-commerce重复产品(duplicated pruducts) bug

wp-e-commerce(Version 3.7.6.9)有个很奇怪的问题,使用[productsall]列出所有产品条目,会出现很多重复记录,有的重复两次,有的重复四五次。在论坛找解决方法,有人提出将重复产品复制一次,再删除原来的产品,就可以解决。但重复产品太多了,这样做很慢,而且这不是治本的方法。于是我决定找到问题的症结所在。

经过一番查找,我把问题锁定到了wp-e-commerce/wpsc-includes/wpsc_query.php这个文件,找到第1622行的sql语句, 问题就出在这里。这条sql语句用来查找所有产品,而它输出的结果竟然存在重复记录。问题出在哪?1622行的sql语句如下:

$sql = "SELECT DISTINCT `".WPSC_TABLE_PRODUCT_LIST."`.*, `".WPSC_TABLE_PRODUCT_ORDER."`.`order` FROM `".WPSC_TABLE_PRODUCT_LIST."`
     LEFT JOIN `".WPSC_TABLE_ITEM_CATEGORY_ASSOC."` ON `".WPSC_TABLE_PRODUCT_LIST."`.`id` = `".WPSC_TABLE_ITEM_CATEGORY_ASSOC."`.`product_id`
     LEFT JOIN `".WPSC_TABLE_PRODUCT_ORDER."` ON `".WPSC_TABLE_PRODUCT_LIST."`.`id` = `".WPSC_TABLE_PRODUCT_ORDER."`.`product_id`
     WHERE `".WPSC_TABLE_PRODUCT_LIST."`.`publish`='1' AND `".WPSC_TABLE_PRODUCT_LIST."`.`active`='1'  $no_donations_sql $group_sql ORDER BY `".WPSC_TABLE_PRODUCT_LIST."`.`special`, $order_by LIMIT $startnum, $products_per_page";

请注意我标出来的 `".WPSC_TABLE_PRODUCT_ORDER."`.`order`,在后面的条件里并没有用到order字段,并且sql语句明确写了DISTINCT来确保无重复记录,找到product_order表,会发现同一个product_id对应着很多order记录,这样,即使product_id相同,只要order不同,DISTINCT就会认为它们是不同的记录,于是重复产品记录产生了!

我删除了`".WPSC_TABLE_PRODUCT_ORDER."`.`order` 字段,重复记录没有了。看起来并没有对其它功能产生任何影响。不知道这个字段放在这里究竟有什么用。暂时也这样解决,相信新版本的wp-e-commerce一定会修复这个问题。