You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress Yoast SEO:基于GET参数动态设置/charts页面标题与描述

问题:基于GET参数动态修改Yoast SEO的页面标题与元描述(仅针对/charts页面)

我有一个安装了Yoast SEO的WordPress站点,其中/charts页面接收GET参数id。我希望根据id的值,从服务器上的JSON文件加载标题和描述,并将其设置为链接分享到Twitter、Facebook、Slack等平台时显示的片段信息。

目前Yoast会覆盖为编辑页面面板中设置的内容,我尝试通过方案绕过该页面的Yoast,但导致分享时无片段显示。我仅需修改/charts页面的Yoast行为,不影响站点其他页面,当前使用的代码如下:

add_action( 'template_redirect', 'remove_wpseo' );
function remove_wpseo() {
    if ( is_page('301') ) {
        $front_end = YoastSEO()->classes->get( Yoast\WP\SEO\Integrations\Front_End_Integration::class );
        remove_action( 'wpseo_head', [ $front_end, 'present_head' ], -9999 );
    }
}

add_filter('wpseo_title', 'filter_product_wpseo_title');
function filter_product_wpseo_title($title) {
    if((is_page('301')) && (isset($_GET['sf']))){
        return 'custom title for ' . $_GET['sf'];
    }
} 

请问是否有可行方案实现基于GET参数id动态修改页面及分享片段的标题和元描述?


解决方案

不需要移除Yoast的整个wpseo_head动作,直接利用Yoast官方提供的过滤器动态修改内容即可——既能保留Yoast的分享片段生成逻辑,又能实现自定义需求。

核心思路

通过Yoast开放的过滤器,针对目标页面(/charts,对应页面ID 301)做条件判断,读取JSON文件中的对应数据后,替换默认的标题和元描述。同时可以针对不同分享平台(如Facebook、Twitter)单独设置内容。

完整代码示例

// 统一修改页面标题与各平台分享标题
add_filter('wpseo_title', 'dynamic_chart_seo_title', 10, 1);
add_filter('wpseo_opengraph_title', 'dynamic_chart_seo_title', 10, 1);
add_filter('wpseo_twitter_title', 'dynamic_chart_seo_title', 10, 1);

// 统一修改页面元描述与各平台分享描述
add_filter('wpseo_metadesc', 'dynamic_chart_seo_description', 10, 1);
add_filter('wpseo_opengraph_description', 'dynamic_chart_seo_description', 10, 1);
add_filter('wpseo_twitter_description', 'dynamic_chart_seo_description', 10, 1);

function dynamic_chart_seo_title($default_title) {
    // 仅针对目标页面且存在id参数时生效
    if (!is_page(301) || !isset($_GET['id'])) {
        return $default_title;
    }

    $chart_id = sanitize_text_field($_GET['id']);
    // 替换为你的JSON文件路径,建议放在主题目录下
    $json_file_path = get_stylesheet_directory() . '/charts-data.json';

    // 检查文件是否存在,避免报错
    if (!file_exists($json_file_path)) {
        return $default_title;
    }

    $json_data = file_get_contents($json_file_path);
    $charts = json_decode($json_data, true);

    // 检查对应id的数据是否存在
    if (!isset($charts[$chart_id]['title'])) {
        return $default_title;
    }

    // 返回自定义标题,可追加站点名称等后缀
    return $charts[$chart_id]['title'] . ' | ' . get_bloginfo('name');
}

function dynamic_chart_seo_description($default_desc) {
    if (!is_page(301) || !isset($_GET['id'])) {
        return $default_desc;
    }

    $chart_id = sanitize_text_field($_GET['id']);
    $json_file_path = get_stylesheet_directory() . '/charts-data.json';

    if (!file_exists($json_file_path)) {
        return $default_desc;
    }

    $json_data = file_get_contents($json_file_path);
    $charts = json_decode($json_data, true);

    if (!isset($charts[$chart_id]['description'])) {
        return $default_desc;
    }

    return $charts[$chart_id]['description'];
}

代码说明

  1. 安全处理:用sanitize_text_field()过滤GET参数id,避免注入风险;增加文件存在性检查,防止程序报错。
  2. 兼容性:使用Yoast官方过滤器,不会破坏Yoast的其他SEO功能,确保分享片段正常生成。
  3. 路径设置:JSON文件建议放在主题目录下,用get_stylesheet_directory()获取子主题路径,get_template_directory()获取父主题路径,保证路径正确。
  4. 扩展性:如果需要给不同平台设置差异化内容,可以拆分单独的过滤器函数,比如专门写dynamic_chart_twitter_title。

配套JSON文件示例

确保JSON文件格式正确,结构参考如下:

{
    "sales-2024": {
        "title": "2024年度销售数据图表",
        "description": "展示全年各产品线销售趋势,包含季度同比增长率与区域占比分析"
    },
    "user-distribution": {
        "title": "用户地域分布图表",
        "description": "统计平台用户的地域分布情况,为营销策略制定提供数据支撑"
    }
}

注意事项

  • 修改代码后,需清除WordPress缓存和Yoast的SEO缓存,确保新元标签生效。
  • 可以用Facebook Debugger、Twitter Card Validator等工具测试分享片段的显示效果。

内容的提问来源于stack exchange,提问作者Mayukh Nair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:44:57