You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

报错原因

  1. PHP 8.2严格类型检查强化:PHP 8.0+版本对非对象属性访问的警告机制更严格,之前版本可能静默忽略的错误,现在会抛出明确警告。
  2. $terms数组元素类型不统一:get_terms过滤器返回的$terms并非总是纯WP_Term对象数组,在查询无结果、权限不足等场景下,会混入整数错误码或其他非对象元素,直接访问$term->slug会触发报错。
  3. 原代码缺少场景限制:未限定只处理产品分类(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:46:11