Holen Sie sich den Titel nach dem ersten Absatz: XPath
<p>Ich möchte meiner Website ein FAQPage-Schema hinzufügen. </p>
<p>Dazu muss ich jedes <code><h2></code>- oder <code><h3></code>-Tag finden. Das ist das Problem. </p>
<p>Danach benötige ich das erste <code><p></code>-Tag nach dem Titel als Antwort. </p>
<p>Das Endergebnis sollte so aussehen:</p>
<pre class="brush:php;toolbar:false;">{
„@type“: „Frage“,
„name“: „Wie lange dauert die Bearbeitung einer Rückerstattung?“,
„acceptedAnswer“: {
"@Antwort eingeben",
„text“: „Inhalt vom ersten P-Tag erhalten“,
„url“: „https://www.example.com/answer#anchor_link“
}
}</pre>
<ul>
<li>Der betreffende <code>"name</code> ist das <code></code>-Tag. </li>
<li>Der <code>"url"</code> der Antwort wird aus dem <code><h2></code> oder <code></code> ermittelt ; Markieren Sie Permalinks und Ankerlinks. </li>
<li><strong>Diese beiden Parameter wurden aufgelöst</strong></li>
</ul>
<p>Leider kann ich nicht herausfinden, wie ich das erste Absatz-Tag nach dem Titel-Tag bekomme.</p>
<p>Ich benötige den Inhalt des ersten Absatzes in der folgenden Zeile: </p>
<pre class="brush:php;toolbar:false;">"text": „Inhalt vom ersten P-Tag erhalten“,</pre>
<p>Das ist mein aktueller Code: </p>
<pre class="brush:php;toolbar:false;"><?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 = neues DOMDocument;
$dom->loadHTML('<?xml binding="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“: „Frage“,
"name": "'.$node->nodeValue.'",
„acceptedAnswer“: {
"@Antwort eingeben",
„text“: „Inhalt vom ersten P-Tag erhalten“,
"url": "'.get_permalink().'#'.$node->getAttribute('id').'"
}
}';
if ($faq_i != $faq_count) : echo ',';
}
echo ']}</script>';
}
?></pre>
<p>Wie Sie sehen, verwende ich diese Codezeile, um jeden <code></code> mit <code></code> <h3></code>Tag:</p>
<pre class="brush:php;toolbar:false;">$query = "//h2[contains(., '?')] | //h3[contains(., '?')]"; </pre>
<p>Ich schätze, ich brauche einen zweiten <code>$query</code>, um den Absatz nach dem Titel zu finden? Aber wie überprüft man das erste Tag nach dem Titel?</p>
<p>Ich habe diese zusätzliche Abfrage ausprobiert: </p>
<pre class="brush:php;toolbar:false;">$query2 = "//h2[contains(., '?')]/following-sibling::p[1] | //h3[contains (., '?')]/following-sibling::p[1]";</pre>
<p>Aber weder <code>following-sibling::</code> noch <code>following::</code>
Der Absatz wird immer nach der letzten Überschrift angezeigt. </p>
<p>Muss ich die erste Abfrage lösen? Um zu wissen, auf welchem Niveau ich bin? </p>
<p>Hier ist ein Beispiel für <code>$content_post</code> (es ist immer anders): </p>
<pre class="brush:php;toolbar:false;"><h2>Lorem ipsum dolor sit amet?</h2>