WooCommerce缺货产品后置排序代码触发PHP Notice报错如何解决
问题原因
- 原代码没有限制仅作用于前端主查询,当WordPress执行未初始化完成的辅助查询、后台查询、结账/购物车页面的订单查询时,都会触发钩子执行逻辑,触发PHP警告,同时导致非商品列表页面逻辑异常。
需要添加的判断条件
你需要在原有if判断中新增以下3类判断:
- 限制仅作用于前端:
!is_admin() - 限制仅作用于主查询:
is_main_query() - 排除非商品列表的WooCommerce页面:
!is_cart() && !is_checkout() && !is_account_page()
修复后完整代码
add_filter('posts_clauses', 'order_by_stock_status', 60); function order_by_stock_status($posts_clauses) { global $wpdb; // 仅在WooCommerce前端商品列表主查询中修改查询逻辑 if (!is_admin() && is_main_query() && is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy()) && !is_cart() && !is_checkout() && !is_account_page() ) { $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) "; $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby']; $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where']; } return $posts_clauses; }
额外优化说明
如果仍然存在边缘场景的警告,可以在判断最前面额外添加isset($wp_query) && $wp_query instanceof WP_Query 确保查询对象已完成初始化。
内容的提问来源于stack exchange,提问作者AdrianV
相关产品推荐
相关产品推荐

