Aşağıdaki fonksiyon benim, DOMDocument'i içeriğin çıktısından önce XML, HTML, gövde ve p etiket sarmalayıcılarını eklemeden çıktı almakta zorlanıyorum . Önerilen düzeltme:
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
Yalnızca içeriğin içinde blok seviyesi öğeleri bulunmadığında çalışır. Ancak, aşağıdaki örnekte olduğu gibi h1 öğesi ile yaptığı gibi, saveXML'den elde edilen çıktı ... şeklinde kesilir.
<p> İsterseniz </p>
Bu gönderiye olası bir geçici çözüm olarak işaret edildim, ancak bunu bu çözüme nasıl uygulayacağımı anlayamıyorum (aşağıda açıklanan girişimlere bakın).
Baska öneri?
function rseo_decorate_keyword($postarray) {
global $post;
$keyword = "Jasmine Tea"
$content = "If you like <h1>jasmine tea</h1> you will really like it with Jasmine Tea flavors. This is the last ocurrence of the phrase jasmine tea within the content. If there are other instances of the keyword jasmine tea within the text what happens to jasmine tea."
$d = new DOMDocument();
@$d->loadHTML($content);
$x = new DOMXpath($d);
$count = $x->evaluate("count(//text()[contains(translate(., 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '$keyword') and (ancestor::b or ancestor::strong)])");
if ($count > 0) return $postarray;
$nodes = $x->query("//text()[contains(translate(., 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '$keyword') and not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::h6) and not(ancestor::b) and not(ancestor::strong)]");
if ($nodes && $nodes->length) {
$node = $nodes->item(0);
// Split just before the keyword
$keynode = $node->splitText(strpos($node->textContent, $keyword));
// Split after the keyword
$node->nextSibling->splitText(strlen($keyword));
// Replace keyword with <b>keyword</b>
$replacement = $d->createElement('strong', $keynode->textContent);
$keynode->parentNode->replaceChild($replacement, $keynode);
}
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
// $postarray['post_content'] = $d->saveXML($d->getElementsByTagName('body')->item(1));
// $postarray['post_content'] = $d->saveXML($d->getElementsByTagName('body')->childNodes);
return $postarray;
}