通过类名抓取Div文本并创建短代码用于搜索结果页展示
解决WordPress中抓取avia-textblock内容生成自定义摘要的问题
首先提个小细节:你给出的HTML里class写成了aria-textblock,应该是avia-textblock(这是Avada主题里常用的文本块类),先修正这个小笔误~
接下来我帮你完善functions.php里的代码,实现从目标div提取文本、生成短代码,并且把这个自定义摘要加到搜索结果页的功能:
1. 完整的短代码函数实现
这个函数会抓取当前页面/post中所有avia-textblock类的div文本,合并成自定义摘要,同时处理HTML解析的兼容性问题:
function get_new_excerpt() { // 获取当前文章/页面的内容 $post_content = get_post_field('post_content', get_the_ID()); if (empty($post_content)) return ''; // 初始化DOM文档,抑制HTML解析警告(避免WordPress内容里的不规范HTML报错) $dom = new DOMDocument(); @$dom->loadHTML(mb_convert_encoding($post_content, 'HTML-ENTITIES', 'UTF-8')); // 使用DOMXPath精准定位class为avia-textblock的div $xpath = new DOMXPath($dom); $text_blocks = $xpath->query("//div[contains(@class, 'avia-textblock')]"); $excerpt_text = ''; if ($text_blocks->length > 0) { foreach ($text_blocks as $block) { // 提取div内的纯文本,去掉多余的空格和换行 $excerpt_text .= trim($block->textContent) . ' '; } // 可以根据需要截断摘要长度,比如保留前40个词 $excerpt_text = wp_trim_words($excerpt_text, 40, '...'); } return $excerpt_text; } // 注册短代码,在页面/post里用[custom_excerpt]调用 add_shortcode('custom_excerpt', 'get_new_excerpt');
2. 将自定义摘要添加到搜索结果页
如果你想让搜索结果页显示这个自定义摘要(替代默认的文章摘要),可以添加下面的钩子函数:
function replace_search_excerpt_with_custom($excerpt) { // 只在搜索结果页生效 if (is_search()) { return get_new_excerpt(); } // 其他页面保持默认摘要 return $excerpt; } add_filter('the_excerpt', 'replace_search_excerpt_with_custom');
关键细节说明
- 为什么用
DOMXPath?比起用getElementsByTagName('div')再循环判断class,XPath可以直接定位目标元素,代码更简洁高效 @$dom->loadHTML(...)前面的@是为了抑制DOM解析时的警告,因为WordPress编辑器生成的内容可能有不规范的HTML标签mb_convert_encoding是为了处理中文等非ASCII字符的编码问题,避免乱码wp_trim_words是WordPress内置函数,用来安全地截断文本并添加省略号,比自己写截断逻辑更可靠
使用方法
- 在页面或文章编辑器里直接插入短代码
[custom_excerpt],就能显示提取的avia-textblock内容摘要 - 搜索结果页会自动替换成这个自定义摘要(如果添加了第二个钩子函数)
内容的提问来源于stack exchange,提问作者gdeleon101
相关产品推荐
相关产品推荐

