recherche

Maison  >  Questions et réponses  >  le corps du texte

Obtenez le titre après le premier paragraphe : XPath

<p>Je souhaite ajouter un schéma FAQPage à mon site Web. </p> <p>Pour ce faire, je dois trouver chaque balise <code><h2></code> ou <code><h3></code> C'est le problème. </p> <p>Après cela, j'ai besoin de la première balise <code><p></code> après le titre comme réponse. </p> <p>Le résultat final devrait ressembler à ceci :</p> <pre class="brush:php;toolbar:false;">{ "@type": "Question", "name": "Combien de temps faut-il pour traiter un remboursement ?", "réponseacceptée": { "@type": "Réponse", "text": "Contenu obtenu à partir de la première balise P", "url": "https://www.example.com/answer#anchor_link" } }</pré> <ul> <li>Le <code>"name"</code> en question est la balise <code></code> ≪/li> <li>Le <code>"url"</code> de la réponse est obtenu à partir du <code><h2></code> ; balise Permaliens et liens d'ancrage. ≪/li> <li><strong>Ces deux paramètres ont été résolus</strong></li> </ul> <p>Malheureusement, je ne parviens pas à trouver comment obtenir la première balise de paragraphe après la balise de titre.</p> <p>J'ai besoin d'obtenir le contenu du premier paragraphe de la ligne suivante : </p> <pre class="brush:php;toolbar:false;">"text": "Contenu obtenu à partir de la première balise P",</pre> <p>Voici mon code actuel : </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 = nouveau DOMDocument ; $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content); $xp = nouveau DOMXPath($dom); $query = "//h2[contient(., '?')] | //h3[contient(., '?')]"; $nodes = $xp->query($query); $pile = []; si ($nœuds) { $faq_count = count($nodes); $faq_i = 1 ; écho ' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Page FAQ", "Entité principale": ['; foreach($nodes comme $node) { écho '{ "@type": "Question", "name": "'.$node->nodeValue.'", "réponseacceptée": { "@type": "Réponse", "text": "Contenu obtenu à partir de la première balise P", "url": "'.get_permalink().'#'.$node->getAttribute('id').'" } }'; if ($faq_i != $faq_count) : echo ','; } echo ']}</script>'; } ?>≪/pré> <p>Comme vous pouvez le voir, j'utilise cette ligne de code pour trouver tous les <code><h2></code> ou <code> <h3></code>Tag :</p> <pre class="brush:php;toolbar:false;">$query = "//h2[contient(., '?')] | //h3[contient(., '?')]"; ≪/pré> <p>Je suppose que j'ai besoin d'un deuxième <code>$query</code> pour trouver le paragraphe après le titre ? Mais comment vérifier la première balise après le titre ?</p> <p>J'ai essayé cette requête supplémentaire : </p> <pre class="brush:php;toolbar:false;">$query2 = "//h2[contient(., '?')]/following-sibling::p[1] | //h3[contient (., '?')]/frère-suivant::p[1]";</pre> <p>Mais ni <code>following-sibling::</code> ni <code>following::</code> Il affiche toujours le paragraphe après le dernier titre. </p> <p>Dois-je résoudre la première requête ? Pour savoir à quel niveau je suis ? </p> <p>Voici un exemple de <code>$content_post</code> (c'est toujours différent) : </p> <pre class="brush:php;toolbar:false;"><h2>Lorem ipsum dolor sit amet?</h2> <p>consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. <p>Veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p> <h3>Duis autem vel eum?</h3> <p>Iris dolor in hendrerit in vulputate velit Esse molestie consequent, 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. <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 essse 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>option eleifend congue nihil imperdiet doming id quod mazim placerat facer possim assum.</p></pre> <p><br /></p>
P粉447002127P粉447002127496 Il y a quelques jours693

répondre à tous(1)je répondrai

  • P粉957661544

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

    Essayez de changer votre foreach comme suit et voyez si cela fonctionne.

    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}
                    }
                }";

    répondre
    0
  • Annulerrépondre