WooCommerce产品排序异常:投票调价后排序不更新求助
解决WooCommerce插件价格更新后排序不自动更新的问题
问题根源
你通过直接操作wpdb更新产品价格元数据,跳过了WooCommerce内部用于更新产品查找表(Lookup Table)和缓存的核心钩子。手动更新产品或重新生成查找表能修复排序,是因为这些操作触发了WooCommerce的完整数据同步流程。
解决方案
修改adjust_product_prices方法,改用WooCommerce官方的产品对象API更新价格,而非直接操作数据库。这样会自动触发必要的钩子,同步查找表和缓存。同时优化缓存清理逻辑,确保排序数据完全刷新。
修改后的核心代码
private function adjust_product_prices() { global $wpdb; // 获取所有产品及其投票数 $products = $wpdb->get_results(" SELECT p.ID, COALESCE(v.meta_value, 0) AS votes FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} v ON p.ID = v.post_id AND v.meta_key = '_wc_vote_price_votes' WHERE p.post_type = 'product' AND p.post_status = 'publish' ORDER BY votes DESC, p.ID ASC "); $max_price = 10000; $min_price = 1; $price_range = $max_price - $min_price; $num_products = count($products); if ($num_products == 0) { return; // 无产品需调整 } $rank = 0; foreach ($products as $product_data) { $product_id = $product_data->ID; $sale_price = $max_price - ($rank * $price_range / ($num_products - 1)); $sale_price = round($sale_price); $regular_price = $sale_price + 1; // 使用WooCommerce产品对象更新价格 $product = wc_get_product($product_id); if ($product) { $product->set_regular_price($regular_price); $product->set_sale_price($sale_price); $product->set_price($sale_price); $product->update_meta_data('_wc_vote_price_adjusted_price', $sale_price); $product->save(); // 保存时自动触发钩子更新查找表 error_log("更新产品ID {$product_id} 促销价 {$sale_price},常规价 {$regular_price}"); } $rank++; } // 清理所有产品相关缓存 wc_delete_product_transients(); // 清除查询缓存和对象缓存 wp_cache_flush(); // 强制更新产品查找表(确保排序数据同步) if (function_exists('wc_update_product_lookup_tables')) { wc_update_product_lookup_tables(); } elseif (class_exists('Automattic\WooCommerce\Internal\Product\Lookup\LookupDataStore')) { try { wc_get_container()->get(\Automattic\WooCommerce\Internal\Product\Lookup\LookupDataStore::class)->regenerate(); } catch (Exception $e) { error_log('重新生成查找表失败: ' . $e->getMessage()); } } }
额外优化
- 移除不必要的钩子:删除
save_post_product下的handle_product_price_update方法,因为现在产品保存时已自动处理查找表更新。 - 简化缓存清理:使用
wp_cache_flush()确保所有对象缓存被清除,避免旧排序数据残留。 - 兼容性处理:同时兼容新旧版本WooCommerce的查找表更新方法,提升插件稳定性。
这样修改后,每次投票触发价格更新时,都会通过WooCommerce官方流程同步数据,排序会自动更新,无需手动操作。
内容的提问来源于stack exchange,提问作者muhammad ahmad
相关产品推荐
相关产品推荐

