使用Script与Div在Index.php的Head标签中加载Ver.php的OG Meta数据失败问题求助
问题分析与解决方案
看起来你遇到的核心问题有两个:一是目标元素不存在导致load()方法无法插入内容,二是用<div>包裹meta/link标签的方式不符合HTML规范,而且就算插入成功,也可能影响爬虫抓取OG标签(很多爬虫不执行JS)。
先给你快速修复前端的方案,再说说更稳妥的PHP层面实现方式:
方案1:修正前端脚本,直接插入head
第一步:修改ver.php,去掉多余的div包裹
因为我们需要的是meta和link标签本身,不需要用div包裹(div放在head里是无效的HTML结构):
<!-- ver.php 直接输出标签,不要div --> <link rel="canonical" href="<?= URL . $dados['post']-> url?>"> <meta property="og:url" content="<?= URL . $dados['post']-> url?>" /> <meta property="og:image" content="<?= URL.'/uploads/imagens/'.$dados['post']->capa ?>" /> <link rel="image_src" type="image/gif" href="<?= URL.'/uploads/imagens/'.$dados['post']->capa ?>">
第二步:修改index.php的脚本,直接获取内容并插入head
原来的$("#header").load(...)找不到目标元素(你的index.php的head里没有id为header的元素),所以改成用$.get获取内容后追加到head:
<head> <script> $(function() { // 用get请求获取ver.php的内容,然后插入到head中 $.get("../app/Views/posts/ver.php", function(content) { $("head").append(content); }); }); </script> </head>
方案2:PHP直接include(更推荐,利于SEO)
上面的JS方案有个致命问题:大部分社交媒体爬虫和搜索引擎爬虫不会执行JavaScript,所以通过JS插入的OG标签会被忽略,导致分享时无法正确显示预览图和信息。
更好的方式是直接在PHP层面引入ver.php的内容,这样服务器渲染时就把OG标签放到head里了:
修改index.php的head部分:
<head> <?php // 直接include ver.php的内容,确保ver.php里的变量$dados、URL等在当前作用域可用 include '../app/Views/posts/ver.php'; ?> </head>
同时保持ver.php的内容(去掉div包裹,和方案1的第一步一样)
这样页面加载时,OG标签就直接出现在head里,爬虫能正常抓取,效果更可靠。
为什么原来的方法不行?
- 目标元素不存在:你的index.php的head里没有
<div id="header">,所以$("#header")选择器找不到元素,load()方法自然无法插入内容。 - HTML结构无效:就算你在head里加了
<div id="header">,把div放在head里也是不符合HTML规范的,浏览器可能会自动把div移到body里,导致meta/link标签不在正确的位置。
内容的提问来源于stack exchange,提问作者Davi
相关产品推荐
相关产品推荐

