Heim  >  Fragen und Antworten  >  Hauptteil

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>
P粉447002127P粉447002127448 Tage vor635

Antworte allen(1)Ich werde antworten

  • P粉957661544

    P粉9576615442023-08-21 18:20:03

    尝试将您的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}
                    }
                }";

    Antwort
    0
  • StornierenAntwort