如何在WordPress中程序化实现传记数据库的嵌套JSON-LD Schema
解决WordPress名人传记站嵌套JSON-LD Schema构建问题
一、正确嵌套Person、净资产与职业里程碑的PHP实现
直接通过wp_head钩子结合ACF字段构建嵌套数组,再用json_encode生成符合Schema.org标准的JSON-LD,是最直接的方案。以下是完整代码示例:
add_action('wp_head', function() { // 仅在名人传记自定义文章类型单页输出(替换为你的自定义文章类型slug) if (!is_singular('biography')) return; // 初始化Person Schema基础数据 $schema = [ '@context' => 'https://schema.org', '@type' => 'Person', 'name' => get_the_title(), 'description' => wp_strip_all_tags(get_the_excerpt()), 'birthDate' => get_field('birth_date'), // 对应ACF日期字段 'image' => get_the_post_thumbnail_url(get_the_ID(), 'full') ]; // 嵌套净资产(MonetaryAmount类型) $net_worth = get_field('net_worth'); if ($net_worth) { $schema['netWorth'] = [ '@type' => 'MonetaryAmount', 'currency' => 'USD', // 根据站点需求调整货币代码 'value' => (float)$net_worth ]; } // 嵌套职业里程碑(Event数组) $milestones = get_field('career_milestones'); // ACF重复字段 if ($milestones && is_array($milestones)) { $schema['event'] = []; foreach ($milestones as $item) { $schema['event'][] = [ '@type' => 'Event', 'name' => $item['milestone_title'], 'startDate' => $item['milestone_date'], 'description' => wp_strip_all_tags($item['milestone_desc']) ]; } } // 输出JSON-LD脚本 echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . '</script>'; });
二、性能保障的核心要点
- 精准条件触发:通过
is_singular限制仅在目标文章类型单页执行,避免全局加载浪费资源 - 原生函数优先:用
json_encode生成JSON,比手动拼接字符串效率高,且能自动处理格式规范 - 减少冗余查询:直接调用
get_field获取ACF数据,避免重复执行WP数据库查询 - 轻量输出:仅保留必要的Schema字段,避免添加无关属性增加输出体积
三、手动实现vs插件选择
- 单个数组+json_encode是最优解:完全可控,无插件依赖,性能开销最小,适合定制化需求强的场景
- 插件方案仅适合非技术场景:如果需要非开发人员编辑Schema,可以选择轻量的Schema插件,但需警惕功能冗余的插件(会额外增加钩子、查询逻辑,拖慢站点)
- WordPress无原生钩子专门处理复杂嵌套Schema,
wp_head是标准的输出位置,符合SEO规范
内容的提问来源于stack exchange,提问作者Before Buzz
相关产品推荐
相关产品推荐

