我有2个WordPress短代码正在使用:
一章。[章名=“开头”]。。。所容纳之物目录[目录]。toc需要显示章节的简单列表规格:
一篇文章可以有很多章节帖子中可以有一个、两个或没有toc短代码
以下post html将不显示toc:
[toc][/toc]
Here is some content
[chapter name="hello"]xxx[/chapter]
In between content may come here
[chapter name="world"]yyy[/chapter]
Some more stuff
这是我的起始代码(嵌入到类中):
public static function register_chapter_shortcode($atts, $content=null){
$atts = shortcode_atts (
array (
\'name\' => \'\',
), $atts );
$name = $atts["name"];
if (self::$toc == null){
self::$toc = array ($name);
} else {
array_push(self::$toc, $name);
}
return \'
<h2>\'.$atts["name"].\'</h2>
<div>\'.do_shortcode($content).\'</div>\'
;
}
public static function register_toc_shortcode($atts, $content=null){
$items = "";
foreach (self::$toc as $item){
$items = $items. \'<li><a href="#">\'.$item.\'</a></li>\';
}
return \'
<ul>\'.$items.\'</ul>
\';
}
SO网友:kero
由于这些短代码(大部分)将在循环内进行计算,因此可以使用循环函数。最重要的是get_the_content()
. 拥有一篇文章的完整内容后,您只需对其进行解析即可获得所有章节及其名称。
正则表达式可能不是最好的,但我发现以下代码可以工作
add_shortcode(\'toc\', function($atts, $content=null){
$content = get_the_content();
if ( preg_match_all(\'/\\[chapter.*?name="(.*?)".*?\\]/i\', $content, $matches) ) {
$chapters = $matches[1];
}
// $chapters has all the "name"s
});
请参见
regular expression explained here.