WordPress Twenty Twenty-Two主题:如何在查询循环中仅展示帖子Speaker内容?
解决方案
方案1:使用WordPress原生自定义字段(无需插件)
这是最轻量化的方案,直接利用WordPress自带功能单独存储Speaker信息,避免从帖子内容里提取的麻烦:
- 编辑议程帖子时,点击右上角「选项」→「偏好设置」,勾选「面板」里的「自定义字段」,开启自定义字段面板。
- 在帖子编辑页的「自定义字段」区域,添加新字段:
- 键(Key):
agenda_speakers(命名保持统一即可) - 值(Value):每行输入一个Speaker,比如:
Somebody Somebody Somebody
- 键(Key):
- 在查询循环里,替换原「帖子内容」块,添加「自定义字段」块,选择你创建的
agenda_speakers键,即可用列表格式展示。如果需要更灵活的格式,可插入「代码」块用PHP输出:<?php $speakers = get_post_meta(get_the_ID(), 'agenda_speakers', true); if ($speakers) { $speaker_list = explode("\n", trim($speakers)); echo '<ul>'; foreach ($speaker_list as $speaker) { echo '<li>Speaker: ' . esc_html($speaker) . '</li>'; } echo '</ul>'; } ?>
方案2:用ACF插件创建重复字段(适合复杂议程)
如果议程经常有多个Speaker,且需要更友好的编辑体验,推荐用Advanced Custom Fields(ACF)的「重复字段」功能:
- 安装并激活ACF插件,后台进入「自定义字段」→「添加字段组」:
- 字段组名称:「议程信息」
- 规则:设置为「显示在帖子→分类等于A」(只在分类A的帖子里显示)
- 添加「重复字段」,字段名称设为「Speakers」,子字段选「文本」,标签设为「Speaker姓名」。
- 编辑分类A的帖子时,就能看到可重复添加的Speaker输入框,逐个填写即可。
- 在查询循环里用「代码」块输出:
<?php if (have_rows('speakers')) { echo '<ul>'; while (have_rows('speakers')) { the_row(); echo '<li>Speaker: ' . esc_html(get_sub_field('speaker_name')) . '</li>'; } echo '</ul>'; } ?>
方案3:过滤现有帖子内容(不修改现有数据)
如果不想改动现有帖子的编辑方式,只想在前端过滤出Speaker的li标签,可在主题的functions.php文件里添加过滤函数:
function filter_agenda_speakers($content) { // 仅在分类A的帖子查询循环中生效 if (is_page() && has_term('分类A', 'category', get_the_ID())) { $dom = new DOMDocument(); // 处理HTML编码问题 @$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8')); $lis = $dom->getElementsByTagName('li'); $speaker_html = '<ul>'; foreach ($lis as $li) { $text = $li->nodeValue; if (strpos($text, 'Speaker:') !== false) { $speaker_html .= $dom->saveHTML($li); } } $speaker_html .= '</ul>'; return $speaker_html; } return $content; } add_filter('the_content', 'filter_agenda_speakers');
添加后,查询循环里的「帖子内容」块就只会显示包含Speaker的条目了。
内容的提问来源于stack exchange,提问作者MeNeedHelp
相关产品推荐
相关产品推荐

