WordPress子主题修改Accordion短码遇重声明错误求助
解决Accordion短码函数重声明错误并添加h标签支持
首先,你遇到的函数重声明错误,是因为PHP不允许同一个作用域内存在两个同名函数——父主题已经定义了ux_accordion,你直接在子主题里复制这段代码重写,就会触发这个报错。咱们可以通过先移除父主题的短码注册,再用自定义函数重新注册短码的方式来解决,同时加入h标签支持的功能。
具体解决方案(子主题functions.php中添加)
// 等待父主题完成短码注册后,替换成自定义函数 add_action('wp_loaded', 'replace_ux_accordion_shortcode'); function replace_ux_accordion_shortcode() { // 移除父主题的accordion短码 remove_shortcode('accordion'); // 注册我们自定义的短码 add_shortcode('accordion', 'custom_ux_accordion'); } // 自定义的Accordion短码函数,支持指定h标签 function custom_ux_accordion($atts, $content=null, $code) { extract(shortcode_atts(array( 'auto_open' => '', 'open' => '', 'title' => '', // 新增参数:允许指定标题的h标签,默认h3 'heading_tag' => 'h3' ), $atts)); // 验证heading_tag是否为合法的h标签(h1-h6) $allowed_tags = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); if (!in_array($heading_tag, $allowed_tags)) { $heading_tag = 'h3'; // 不合法则 fallback 到h3 } if($auto_open) $open = 1; // 根据指定的标签生成标题 if($title) { $title = sprintf('<%s class="accordion_title">%s</%s>', $heading_tag, $title, $heading_tag); } // 这里保留父主题原有的div输出逻辑,你可以根据需要调整后面的代码 return $title.'<div class="accordion_content '.($open ? 'open' : '').'">'.do_shortcode($content).'</div>'; }
代码说明
- 钩子时机:用
wp_loaded钩子确保在父主题完成短码注册后再执行替换,避免移除失败。 - 新增参数:添加了
heading_tag参数,用户可以在短码里指定用h1-h6任意标签,比如[accordion title="我的标题" heading_tag="h2"]内容[/accordion]。 - 合法性验证:加入了标签白名单,防止用户传入非法标签导致HTML结构错误。
- 保留原有逻辑:除了标题部分的修改,其余逻辑和父主题保持一致,不会破坏原有功能。
注意事项
如果父主题是通过add_action注册短码的(比如在某个钩子内注册),你可能需要调整replace_ux_accordion_shortcode的优先级,确保执行时机晚于父主题的注册动作(比如把钩子优先级设为999:add_action('wp_loaded', 'replace_ux_accordion_shortcode', 999);)。
内容的提问来源于stack exchange,提问作者JustFoxeh
相关产品推荐
相关产品推荐

