Содержание для 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 содержание статьи выводилось только лишь в статьях в которых вставлен шоткод. А то у меня после установки выводит на всех страницах в месте вставки кода ошибку… Спасибо.