如何解决WooCommerce添加售罄商品后置排序功能后的属性读取警告
问题原因
你当前使用的售罄商品排序代码未限制仅作用于商品列表主查询,会修改所有前台WordPress查询(包括导航菜单、侧边栏小工具、页面查询等非商品查询),错误的JOIN和WHERE条件会导致这些非商品查询返回空结果,get_queried_object()拿到空值就会触发读取属性的警告。
解决方案
直接替换你现有的排序代码为以下修正版即可,保留排序功能的同时消除警告:
/** * Sorting out of stock WooCommerce products - Order product collections by stock status, in-stock products first. */ class iWC_Orderby_Stock_Status { public function __construct() { // Check if WooCommerce is active if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000, 2); } } public function order_by_stock_status($posts_clauses, $query) { global $wpdb; // 仅修改WooCommerce商品列表主查询 if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag()) && $query->is_main_query()) { $posts_clauses['join'] .= " LEFT JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id AND istockstatus.meta_key = '_stock_status') "; $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby']; $posts_clauses['where'] .= " AND (istockstatus.meta_value <> '' OR istockstatus.meta_value IS NULL) "; } return $posts_clauses; } } new iWC_Orderby_Stock_Status; /** * END - Order product collections by stock status, instock products first. */
修正说明
- 新增
is_main_query()判断,仅修改商品列表的主查询,不会影响其他辅助查询 - 将INNER JOIN改为LEFT JOIN,避免个别无
_stock_status字段的商品被意外过滤 - 调整条件拼接逻辑,避免和原有查询规则冲突
替换代码后清空WordPress缓存和浏览器缓存即可生效。
内容的提问来源于stack exchange,提问作者user16572932
相关产品推荐
相关产品推荐

