Tôi là hàm bên dưới, tôi đang vật lộn để xuất DOMDocument mà không nối thêm các trình bao bọc thẻ XML, HTML, body và p trước khi xuất nội dung. Các sửa chữa được đề xuất:
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
Chỉ hoạt động khi nội dung không có thành phần cấp khối bên trong nó. Tuy nhiên, khi thực hiện, như trong ví dụ dưới đây với phần tử h1, kết quả đầu ra từ saveXML bị cắt cụt thành ...
<p> Nếu bạn thích </ p>
Tôi đã được chỉ ra bài đăng này như một cách giải quyết có thể, nhưng tôi không thể hiểu làm thế nào để triển khai nó vào giải pháp này (xem các nỗ lực bình luận bên dưới).
Bất kỳ đề xuất?
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;
}