Содержание для WordPress
Структуризация информации, которую вы размещаете на своем сайте, существенно упрощает восприятие читателем той мысли, которую вы собирались до него донести, и сильно облегчает жизнь в этом — грамотно составленное содержание статьи. Особенно если это объемная статья, разбитая на множество заголовков/подзаголовков.
Функция представленная порталом WP-KAMA позволяет по шорткоду [сoдержание] создать и вывести содержание статьи в том месте, где размещен шоткод.
Описание работы:
Содержание создается по тегу заголовка <h2>
Если необходимо изменить тег, по которому будет создаваться содержание, то используем шоткод [сoдержание h3]. Вместо h3 можно использовать любой HTML тег, например, содержание по strong’ам: [сoдержание strong]
Можно создавать двухуровневое содержание [сoдержание h3 h4].
<ul>
<li>Подзаголовок 1</li>
<ul>
<li>Пункт 1 подзаголовка</li>
<li>Пункт 2 подзаголовка</li>
</ul>
<li>Подзаголовок 2</li>
</ul>
Для работы функции необходимо вставить следующий код в function.php Вашей темы:
/* Содержание --------------------------------------------------------------------------- */
add_filter('the_content', 'make_contents');
function make_contents($content){
if( strpos($content, '[содержание')===false )
return $content;
$patt = '\[содержание\s*([^\]]*)\]';
preg_match("@{$patt}(.*)@s", $content, $m);
$hds = $m[1] ? trim($m[1]) : 'h2';
$hds = explode(' ', $hds);
$hds = array_map('trim', $hds);
$h = implode('|', $hds);
@preg_match_all('@<(?:'.$h.')[^>]*>(.*?)</('.$h.')>@is', $m[2], $match);
if(!$match)
return $content;
// заменяем заголовки и строим содержание
$g=0;
foreach( $match[0] as $ch ){
$t = &$match[2];
$anchor = $t[$g].'_'.$g;
$new_ch = preg_replace("@>(.+?)<@", " id='$anchor'><a href='#a_menu' title='вернуться к содержанию'>\\1 ↑</a><", $ch, 1);
$content = str_replace($ch, $new_ch, $content);
$out .= '<li><a href="#'. $anchor .'">'. strip_tags($match[1][$g]) ."</a></li>\n";
if( $hds[1] && $t[$g]!=$t[$g+1] && isset($t[$g+1]) ){
if( !$on ){
$on=true;
$out .= "<ul>\n";
} else {
$on=false;
$out .= "</ul>\n";
}
}
$g++;
}
$out = '<'.$hds[0].' id="a_menu">Содержание</'.$hds[0].'><ul>'. $out .'</ul>';
$content = preg_replace("@{$patt}@", $out, $content, 1);
return $content;
}
спасибо WP-KAMA за отличную функцию

Добрый день. А как можно сделать, чтобы вставив кодв в function.php содержание статьи выводилось только лишь в статьях в которых вставлен шоткод. А то у меня после установки выводит на всех страницах в месте вставки кода ошибку… Спасибо.