我正在开发一个带有 ReactJS SPA 主题的 Wordpress 网站,并且我试图在 WP API AJAX 调用期间从 Yoast SEO 插件收集必要的 SEO 头部标签。我使用 Yoast 的原因是因为它提供了 seo 值(即图像、描述、标题等),即使这些值没有在帖子上明确设置。
在非 SPA wordpress 主题中,Yoast 在 wpseo_head() 挂钩期间回显 seo 标签,该挂钩由 header.php 中的 wp_head() 调用触发。由于我正在实施 SPA 主题,因此每次 url 更改时我都需要更新 seo 标签,但不会重新加载页面。我试图在 WP API 调用中捕获这些标签,但由于某种原因,在 API 调用中 wpseo_head 挂钩不会回显相同的标签。我进行了以下测试以确认行为差异:
我在我的 header.php 文件中添加了对 wpseo_head() 的直接调用,就在开始的正文标记之后:
<?php wp_head(); ?>
</head>
<body>
<div id="wpseo_head">
<?php do_action('wpseo_head'); ?>
</div>
这是相应的输出:
<div id="wpseo_head" class="baby">
<!-- This site is optimized with the Yoast SEO plugin v7.7.2 - https://yoast.com/wordpress/plugins/seo/ -->
<title>CORRECT PAGE TITLE</title>
<!-- Admin only notice: this page does not show a meta description because it does not have one, either write it for this page specifically or go into the [SEO - Search Appearance] menu and set up a template. -->
<link rel="canonical" href="CORRECT POST URL">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="article">
<meta property="og:title" content="CORRECT POST TITLE">
<meta property="og:description" content="CORRECT DESCRIPTION">
<meta property="og:url" content="CORRECT URL">
<meta property="og:site_name" content="CORRECT SITE NAME">
<meta property="article:publisher" content="CORRECT FACEBOOK URL">
<meta property="og:image" content="CORRECT IMAGE URL">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<script type="application/ld+json">{/* CORRECT JSON LD */}</script>
</div>
在加载帖子的 api 回调中,我捕获 wpseo_head() 的输出并将其返回。
global $post, $wp_query;
$post = $_post;
$wp_query = new WP_Query(['p' => $_post->ID]);
setup_postdata($post);
ob_start();
do_action('wpseo_head');
$yoast_seo_tags = ob_get_contents();
ob_end_clean();
$yoastSeoTags = stripslashes($yoast_seo_tags);
这是来自 api 调用的响应:
<!-- This site is optimized with the Yoast SEO plugin v7.7.2 - https://yoast.com/wordpress/plugins/seo/ -->
<link rel="canonical" href="CORRECT POST URL" />
<script type='application/ld+json'>{/* CORRECT JSON LD */}</script>
请注意,header.php 中 wpseo_head() 调用的输出是完整的,但 api 回调中 wpseo_head() 调用的响应缺少许多字段,但确实包含正确的值。这让我相信,虽然我在 api 回调中正确设置了帖子,但 header.php 与 API 回调中的 wordpress 行为必须存在一些内在差异。
1) 谁能解释一下,以及我如何在 API 回调中成功获取 wpseo_head() 调用的输出?
2)我尝试了其他几种获取 yoast SEO 标签的方法,但都失败了,但我怀疑有更好的方法可以做到这一点,所以请随时提出替代方法。
3)基于目前网络爬虫的工作方式,我是否有必要担心每次用户导航到新页面时设置 SEO 标签?或者仅仅在初始页面加载时设置 SEO 标签就足够了吗?
我试图详尽地描述问题的上述描述,但如果您需要更多信息,请告诉我。提前感谢您的任何建议!我看到了一些类似的帖子,但没有一个答案让我找到解决方案。再次感谢