如何在任意位置调出Yoast SEO的标题和元描述

本站所有文章均为博主人工写作,绝无AI辅助成分,请放心参阅。

Yoast SEO是一个有很长历史的SEO插件,我自己都用了十几年了,一直顺着最新版本更新使用。对于SEO工作来说,我实际上需要知道自己设置的这些标题、元描述都存在数据库的哪几张表里,有哪些方法可以快速调用出来。其实调用SEO的标题和元描述并不是一个常规需求,因为通常只有在当前页面用得着它们,那么Yoast或者任何其他SEO插件都能满足需要。但有时候我也会碰到超纲的需求,比如:

  • 自定义了一些endpoint,读取了某个页面或者某个分类的数据,同时也需要引用这个页面或者分类的SEO设置;
  • 无头的WP网站,所有页面都在别处重写了,那么就需要在重写的页面自己读取SEO设置。

如果是以前,Yoast SEO 14之前的版本,我们只需要知道_yoast_wpseo_title_yoast_wpseo_metadesc这两个字段名就好了,无论是文章还是分类,字段名都是这两个。和常规变量一样就存在于postmeta和termmeta这两张表里。但是2020年Yoast做过一次重大更新,不再把插件数据保存在WordPress常规表里了,而是另外起了几张新表。这样做的好处自然是为了性能和后续扩展需要,但调用方法就不再是常规的get_post_metaget_term_meta了。

目前Yoast文档里也没有提供可用的方法,并且Yoast插件的源文件中的方法在v20左右的时候又有过更新,所以暂时我建议从数据库中直接取数据。Yoast存放数据的这张表是wp_yoast_indexable,读取方式如下。

如果你读取的是一个分类的SEO数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//获取当前分类或者页面的对象
$current_object = get_queried_object();
 
//数据库直接查询
if ($current_object instanceof WP_Term) {
	//对于term类型
	$result = $wpdb->get_row(
		$wpdb->prepare(
			"SELECT title, description 
			 FROM wp_yoast_indexable 
			 WHERE object_type = 'term' AND object_id = %d",
			$current_object->term_id
		)
	);
}elseif ($current_object instanceof WP_Post) {
	//对于post类型
	$result = $wpdb->get_row(
		$wpdb->prepare(
			"SELECT title, description 
			 FROM wp_yoast_indexable 
			 WHERE object_type = 'post' AND object_id = %d",
			$current_object->ID
		)
	);
}
if ($result) {
	//同时还需要可以转意%%blogname%%这样的变量字符
	$replace_vars = new WPSEO_Replace_Vars();
 
	$yoast_title = $result->title;
	$yoast_title = $replace_vars->replace($yoast_title, $current_object);
 
	$yoast_desc = $result->description;
	$yoast_desc = $replace_vars->replace($yoast_desc, $current_object);
}

最后,如果是要在endpoint生成的页面调用,我们需要通过wpseo_titlewpseo_opengraph_titlewpseo_metadescwpseo_opengraph_desc这4个钩子重写当前页面的SEO标题和元描述:

1
2
3
4
add_filter('wpseo_title', function(){ global $yoast_title; return $yoast_title; });
add_filter('wpseo_opengraph_title', function(){ global $yoast_title; return $yoast_title; });
add_filter('wpseo_metadesc', function(){ global $yoast_desc; return $yoast_desc; });
add_filter('wpseo_opengraph_desc', function(){ global $yoast_desc; return $yoast_desc; });

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/3375.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注