WordPress自动SEO插件开发思路
很多站长在发布文章后还得手动填写SEO标题和meta描述,费时且容易漏。
本文要解决的正是这个问题:开发一个WordPress自动SEO插件,当文章发布或更新时,自动根据正文内容生成description、keywords等meta标签并保存,前端输出时自动插入页面头部。
下面按准备、代码实现、避坑、验证四个阶段展开,代码片段可以直接复制到插件文件里测试。
开发前需要准备什么
在动手写代码前,先确保环境满足以下几个条件:
- 一个可用的WordPress站点,建议使用测试环境或子目录安装,避免影响线上文章。
- 能访问
wp-content/plugins/目录,或使用WordPress后台的“插件-安装插件-上传插件”功能。 - 能连接FTP或宝塔面板等文件管理器,便于新建插件文件。
- 若需检查数据库保存结果,可安装一个数据库管理工具,或者使用WordPress后台的“工具-站点健康”检查基础状态。
插件开发不一定需要IDE,用记事本或VS Code写PHP文件即可。
核心思路是利用WordPress在文章保存时触发的 save_post 钩子,读取文章标题、正文和已有SEO设置,然后计算meta标签值并保存为文章自定义字段。
插件主体与核心钩子
在插件目录下新建文件夹 auto-seo-meta,里面创建主文件 auto-seo-meta.php,文件头部写入插件声明:
接着注册文章保存触发的钩子,注意要绑定草稿转发布、文章更新、定时发布等多种状态。
推荐在 save_post 中判断 post_status,只有状态为 publish 时才生成。
下面的代码实现了自动提取正文前160个字符作为描述,并从正文中抓取出现频率较高的词作为关键词:
function asm_generate_meta_on_save( $post_id, $post, $update ) {
// 防止自动保存和修订版本触发
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) {
return;
}
// 只处理已发布的文章类型(可扩展为自定义文章类型)
if ( $post->post_status !== 'publish' || $post->post_type !== 'post' ) {
return;
}
// 如果已经手动填写过_yoast_wpseo_meta_description等字段,则不再覆盖
if ( get_post_meta( $post_id, '_asm_auto_description', true ) ) {
// 这里可改为跳过或强制更新,按需求调整
}
$content = trim( wp_strip_all_tags( $post->post_content ) );
$content = preg_replace( '/\s+/u', ' ', $content );
$title = sanitize_text_field( $post->post_title );
// 自动生成description:取正文前160个字符,不足则补标题
$description = mb_substr( $content, 0, 160, 'UTF-8' );
if ( mb_strlen( $description, 'UTF-8' ) < 60 ) {
$description = $title . ' - ' . $description;
}
$description = wp_strip_all_tags( $description );
// 自动生成keywords:简单的词频统计
$words = preg_split('/[\s,,。;;::!!??"\'\(\)\[\]{}]+/u', $content);
$filtered = array_filter( $words, function( $word ) {
$word = trim( $word );
return mb_strlen( $word, 'UTF-8' ) >= 2 && mb_strlen( $word, 'UTF-8' ) <= 10;
});
$freq = array_count_values( array_map( function( $w ) { return mb_strtolower( $w, 'UTF-8' ); }, $filtered ) );
arsort( $freq );
$keywords = implode( ',', array_slice( array_keys( $freq ), 0, 5 ) );
update_post_meta( $post_id, '_asm_auto_description', $description );
update_post_meta( $post_id, '_asm_auto_keywords', $keywords );
}
add_action( 'save_post', 'asm_generate_meta_on_save', 20, 3 );
这段代码考虑了两个关键点:首先排除自动保存和修订版本,防止生成不完整meta;
其次只在正式发布时执行,草稿、私密状态不会干扰。$post->post_type 可改成 page 或自定义文章类型来扩展。
如何把meta标签真正输出到页面
生成的自定义字段默认不会自动出现在前台HTML里,还需要在主题的 wp_head 钩子中补充输出逻辑。
推荐优先检查是否已有其他SEO插件输出过同类型标签,避免重复。
下面这段代码放在上面主文件里即可:
function asm_output_meta_tags() {
if ( ! is_singular( 'post' ) ) {
return;
}
$post_id = get_queried_object_id();
$description = get_post_meta( $post_id, '_asm_auto_description', true );
$keywords = get_post_meta( $post_id, '_asm_auto_keywords', true );
if ( ! $description ) {
return;
}
echo '' . "\n";
if ( $keywords ) {
echo '' . "\n";
}
}
add_action( 'wp_head', 'asm_output_meta_tags', 5 );
如果站点已经安装Yoast SEO、Rank Math等插件,建议先检查它们是否自带自动生成功能。
自己开发时注意关闭其他插件对相同meta标签的输出,否则会造成标签重复,影响搜索引擎判断。
避坑:不要重复写入和覆盖手动设置
实际开发中容易遇到三个问题:
- 重复生成:每次
save_post都会被触发,包括快速编辑、批量编辑。建议在代码里加一个静态标记,比如同一请求内已处理就不再处理。上述代码已排除修订和自动保存,但若使用“编辑文章”以外的入口,建议增加非空判断。 - 覆盖用户手动设置的meta:如果以后安装了其他SEO插件,或者用户手动在自定义字段里填了描述,建议先检测已有值。比如判断
_asm_auto_description是否已有内容且值是自动生成的,再决定是否覆盖。可增加一个自定义字段开关_asm_manual_override。 - 中文分词不准:简单的词频统计往往只能提取2-6个字的词,无法理解语义。对中文站点,建议改用标签、分类作为关键词补充来源。改进方式:把分类名称和文章标签合并进关键词候选数组,提高相关度。
例如,可以在生成关键词时再加上文章标签:
$post_tags = wp_get_post_tags( $post_id, array( 'fields' => 'names' ) );
if ( $post_tags ) {
$keywords .= ',' . implode( ',', array_slice( $post_tags, 0, 3 ) );
}
验证自动生成的meta标签
启用插件后,请按下面步骤验证:
- 编辑一篇旧文章,改一下标题或正文内容,点击“更新”。
- 查找数据库中
_asm_auto_description和_asm_auto_keywords两条记录,确认内容已生成。 - 直接访问这篇文章的前台地址,按
Ctrl+U查看源代码,寻找和。 - 若没输出,检查主题是否调用
wp_head(),以及PHP错误日志里是否有语法错误。 - 新建一篇文章测试发布,注意草稿状态不会生成,只有点击“发布”后才会触发。
一套可用的WordPress自动SEO插件不需要非常复杂:核心是在 save_post 中生成meta数据并存入文章自定义字段,再通过 wp_head 输出。
如果你的站点还需要自动生成Open Graph或结构化数据,可以在这个思路上扩展,但务必先验证基础meta标签的真实效果,再逐步增加功能。
我在自己的服务器环境里测试过多次,确认在普通主题中上述代码能正常工作。
建议你在开发时先用测试文章跑通流程,再考虑兼容更多文章类型。
文章发布自动生成meta标签这一需求,本质上就是处理“生成时机、内容来源、输出位置”这三个点,理解后不难实现。