提问人:Cray 提问时间:3/10/2023 最后编辑:Cray 更新时间:3/11/2023 访问量:69
XPath:获取标题后的第一段
XPath: Get first paragraph after headlines
问:
我想将 FAQPage 架构添加到我的站点。
为此,我需要找到每个带有问号的 or 标签。这就是问题所在。<h2>
<h3>
在那之后,我需要标题后的第一个标签作为 anwser。<p>
最终结果应如下所示:
{
"@type": "Question",
"name": "How long does it take to process a refund?",
"acceptedAnswer": {
"@type": "Answer",
"text": "CONTENT FROM FIRST P-TAG",
"url": "https://www.example.com/answer#anchor_link"
}
}
- 问题是 or 标签。
"name"
<h2>
<h3>
- 答案是永久链接和锚链接来自或标签。
"url"
<h2>
<h3>
- 求解这两个参数
不幸的是,我无法弄清楚如何在标题标签之后获得第一段标签。
我需要以下行中第一段的内容:
"text": "CONTENT FROM FIRST P-TAG",
这是我目前为止的代码:
<?php
$content_postid = get_the_ID();
$content_post = get_post($content_postid);
$content = $content_post->post_content;
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
$xp = new DOMXPath($dom);
$query = "//h2[contains(., '?')] | //h3[contains(., '?')]";
$nodes = $xp->query($query);
$stack = [];
if ($nodes) {
$faq_count = count($nodes);
$faq_i = 1;
echo '
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [';
foreach($nodes as $node) {
echo '{
"@type": "Question",
"name": "'.$node->nodeValue.'",
"acceptedAnswer": {
"@type": "Answer",
"text": "CONTENT FROM FIRST P-TAG",
"url": "'.get_permalink().'#'.$node->getAttribute('id').'"
}
}';
if ($faq_i != $faq_count) : echo ','; endif; $faq_i++;
}
echo ']}</script>';
}
?>
正如你所看到的,我正在使用这一行来查找每个带有 a 的 or 标签:<h2>
<h3>
?
$query = "//h2[contains(., '?')] | //h3[contains(., '?')]";
我想我需要一秒钟才能找到标题后面的段落?但是,如何检查标题后的第一个标签呢?$query
我尝试了这个额外的查询:
$query2 = "//h2[contains(., '?')]/following-sibling::p[1] | //h3[contains(., '?')]/following-sibling::p[1]";
但既不适合我,也不适合我。
它始终显示最后一个标题之后的段落。following-sibling::
following::
我需要解决第一个查询吗?要知道我处于什么水平?
下面是一个示例(它总是不同的):$content_post
<h2>Lorem ipsum dolor sit amet?</h2>
<p>consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim</p>
<p>veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<h3>Duis autem vel eum?</h3>
<p>iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.</p>
<h2>Nam liber tempor cum soluta?</h2>
<h3>nobis eleifend option congue nihil</h3>
<p>imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</p>
<p>Et wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<h3>Duis autem vel?</h3>
<p>eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.</p>
<h4>Nam liber tempor cum soluta nobis</h4>
<p>eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</p>
答:
1赞
Jack Fleeting
3/11/2023
#1
试着改变你的样子,看看它是否有效。foreach
foreach($nodes as $node) {
$ans = $xp->query("./following-sibling::p[1]",$node)[0]->nodeValue;
echo "{
'@type': 'Question',
'name': '".$node->nodeValue."',
'acceptedAnswer': {
'@type': 'Answer',
'text': {$ans}
}
}";
评论
0赞
Cray
3/11/2023
作品,谢谢!我已更改为 并为 URL 添加了一些额外的代码,并且仅使用前 120 个字符。 谢谢!'
"
0赞
Cray
3/11/2023
我的代码:foreach($nodes as $node) { $ans = $xp->query(“./following-sibling::p[1]”,$node)[0]->nodeValue; $ans_out = mb_strlen($ans) > 120 ? mb_substr($ans,0,120)”。...<a href=“.get_permalink().”#“.$node->getAttribute('id')。>Mehr Informationen</a>“ : $ans;echo '{ “@type”: “Question”, “name”: “'.$node->nodeValue.'”, “acceptedAnswer”: { “@type”: “Answer”, “text”: “'.$ans_out.'”, “url”: “'.get_permalink().'#'.$node->getAttribute('id').'“ }}';
评论
$content_post
$content_post