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_meta
和get_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_title
、wpseo_opengraph_title
、wpseo_metadesc
和wpseo_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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。