WordPress问题:get_customizer_fonts_options过滤器钩子失效如何解决?
问题分析与解决思路
两种修改方式的对比
- 直接复制函数到子主题:可行,但不推荐。父主题的函数用
if ( ! function_exists('get_customizer_fonts_options') )包裹,子主题先加载,定义该函数后会覆盖父主题版本。但缺点是父主题后续更新函数逻辑时,子主题的复制版本无法同步,容易引发兼容性问题。 - 使用
add_filter修改:这是WordPress钩子机制的标准用法,更灵活且能兼容父主题更新,是推荐方案。你的代码未生效是因为存在几个关键错误。
你的过滤器代码错误点
- 无返回值:过滤器函数必须返回修改后的参数,否则WordPress会用
null替代,导致字体列表不生效。 - 未定义变量
$default:子主题函数的参数里没有$default,直接使用会触发PHP警告,中断逻辑。 - 未指定过滤器参数数量:原过滤器传递了
$fonts和$context两个参数,add_filter默认只传递1个参数,需显式指定第四个参数为2才能让函数拿到$context。
修正后的过滤器代码
function hwp_control_font_list($fonts, $context) { // 根据上下文重新定义字体列表 if ( $context == 'header' ) { $fonts = array( 'inherit' => esc_html__( 'Default font', 'cpschool' ), 'quicksand' => 'Quicksand', 'raleway' => 'Raleway', 'russolo' => 'Russolo', 'roboto' => 'Roboto', ); } else { $fonts = array( 'inherit' => esc_html__( 'Default font', 'cpschool' ), 'quicksand' => 'Quicksand', 'raleway' => 'Raleway', 'roboto' => 'Roboto', ); } // 必须返回修改后的数组 return $fonts; } // 第四个参数2表示接受两个参数,与原过滤器的参数数量匹配 add_filter('get_customizer_fonts_options','hwp_control_font_list', 10, 2);
额外说明
如果需要保留父主题的部分字体,而不是完全替换,可以基于传入的$fonts数组修改,比如:
function hwp_control_font_list($fonts, $context) { // 清空原有字体,添加新字体 $fonts = array(); $fonts['inherit'] = esc_html__( 'Default font', 'cpschool' ); if ( $context == 'header' ) { $fonts['quicksand'] = 'Quicksand'; $fonts['raleway'] = 'Raleway'; $fonts['russolo'] = 'Russolo'; $fonts['roboto'] = 'Roboto'; } else { $fonts['quicksand'] = 'Quicksand'; $fonts['raleway'] = 'Raleway'; $fonts['roboto'] = 'Roboto'; } return $fonts; } add_filter('get_customizer_fonts_options','hwp_control_font_list', 10, 2);
内容的提问来源于stack exchange,提问作者cabraller
相关产品推荐
相关产品推荐

