我想在h3标签的子页面上自动生成magellan。 为此我尝试了jameswlane脚本(https://gist.github.com/jameswlane/f1eabeedf430ef67318d),我只将h2标签更改为h3。我似乎不太了解这段代码。
我认为我只需要在wordpress主题的header.php文件中粘贴此代码,它会自动扫描h3标签的DOM内容,但它没有。
没有任何东西出现,甚至是空的div。
将以下行用作init:
<?php $tag = 'h3'; $html = get_the_content(); $items = getTextBetweenTags( $tag, $html ); ?>
我可以请你就此事提出建议吗?
<?php
function getTextBetweenTags($tag, $html, $strict=0) {
$dom = new domDocument;
if($strict==1) {
$dom->loadXML($html);
} else {
$dom->loadHTML($html);
}
$dom->preserveWhiteSpace = false;
$content = $dom->getElementsByTagname($tag);
$out = array();
foreach ($content as $item) {
$out[] = $item->nodeValue;
}
return $out;
}
function create_slug($string){
$slug=preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
return $slug;
}
function create_magellan($items){
$output .= '<div data-magellan-expedition="fixed">' . PHP_EOL;
$output .= '<dl class="sub-nav">' . PHP_EOL;
foreach( $items as $item ) {
$output .= '<dd data-magellan-arrival="' . create_slug( $item ) . '"><a href="#' . create_slug( $item ) . '">' . $item . '</a></dd>';
}
$output .= '</dl>' . PHP_EOL;
$output .= '</div>' . PHP_EOL;
add_filter('the_content', 'my_formatter', 99);
echo $output;
}
function my_formatter($content) {
$new_content = '';
$tag = 'h3';
$pattern_full = '{(<' . $tag . '>.*?</' . $tag . '>)}is';
$pattern_contents = '{<' . $tag . '>(.*?)</' . $tag . '>}is';
$pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($pieces as $piece) {
if (preg_match($pattern_contents, $piece, $matches)) {
$test = $matches[1];
$new_content .= '<a name="'.create_slug($test).'"></a>'.PHP_EOL.'<'.$tag.' data-magellan-destination="'.create_slug($test).'">'.$test.'</'.$tag.'>'.PHP_EOL;
} else {
$new_content .= wptexturize(wpautop($piece));
}
}
return $new_content;
}
?>
修改
有些工作并返回错误:
Warning: DOMDocument::loadHTML(): Empty string supplied as input in /www/ilee_www/www/2.goldbaltic/dev.goldbaltic.pl/wp-content/themes/dermiclab_fs/partials/2.Nav/mainNav.php on line 47
我文件中的第47行是
$dom->loadHTML($html);
这
function getTextBetweenTags($tag, $html, $strict=0) {
$dom = new domDocument;
if($strict==1) {
$dom->loadXML($html);
} else {
$dom->loadHTML($html);
}
$dom->preserveWhiteSpace = false;
$content = $dom->getElementsByTagname($tag);
$out = array();
foreach ($content as $item) {
$out[] = $item->nodeValue;
}
return $out;
}