PHP 8.2升级后WooCommerce隐藏分类代码报错的解决咨询
PHP 8.2升级后WooCommerce隐藏分类代码报错问题
问题描述
之前使用以下代码在WooCommerce中隐藏指定产品分类:
add_filter( 'get_terms', 'filter_get_terms', 10, 3 ); function filter_get_terms( $terms, $taxonomies, $args ) { $new_terms = []; // if a product category and on the shop page if ( ! is_admin() ) { foreach ( $terms as $term ) { if ( ! in_array( $term-> slug, [ 'seinakellad', 'nastennye-chasy', 'wall-clock', 'juuksekammid', 'grebni-dlja-volos', 'hair-combs' ] ) ) { $new_terms[] = $term; } } $terms = $new_terms; } return $terms; }
升级至PHP 8.2后出现报错:
Warning: Attempt to read property "slug" on int in /data01/virt81820/domeenid/www.enjoythewoodestonia.ee/test/wp-content/plugins/code-snippets/php/snippet-ops.php(505) : eval()'d code on line 8
报错原因
- PHP 8.2严格类型检查强化:PHP 8.0+版本对非对象属性访问的警告机制更严格,之前版本可能静默忽略的错误,现在会抛出明确警告。
- $terms数组元素类型不统一:
get_terms过滤器返回的$terms并非总是纯WP_Term对象数组,在查询无结果、权限不足等场景下,会混入整数错误码或其他非对象元素,直接访问$term->slug会触发报错。 - 原代码缺少场景限制:未限定只处理产品分类(
product_cat),可能干扰其他分类法的查询结果,导致非预期元素进入循环。
修复方案
修改代码,增加对象类型判断和分类场景限制,确保只处理合法的产品分类对象:
add_filter( 'get_terms', 'filter_get_terms', 10, 3 ); function filter_get_terms( $terms, $taxonomies, $args ) { $new_terms = []; // 仅处理前台的产品分类查询 if ( ! is_admin() && in_array( 'product_cat', $taxonomies ) ) { $hidden_slugs = [ 'seinakellad', 'nastennye-chasy', 'wall-clock', 'juuksekammid', 'grebni-dlja-volos', 'hair-combs' ]; foreach ( $terms as $term ) { // 仅处理WP_Term对象,跳过非对象元素 if ( $term instanceof WP_Term && ! in_array( $term->slug, $hidden_slugs ) ) { $new_terms[] = $term; } } $terms = $new_terms; } return $terms; }
关键修复点:
- 增加
in_array( 'product_cat', $taxonomies )判断,确保只修改产品分类的查询结果,避免影响标签等其他分类法。 - 增加
$term instanceof WP_Term判断,过滤数组中的非对象元素,防止访问不存在的属性。 - 将隐藏的slug列表抽为变量,提升代码可维护性。
- 修正原代码中
$term-> slug的多余空格,统一为规范的$term->slug写法。
内容的提问来源于stack exchange,提问作者MrLoco
相关产品推荐
相关产品推荐

