Содержание для WordPress

Содержание для WordPress

09:28 18 Июнь in Оптимизация WordPress
1 Comment

Структуризация информации, которую вы размещаете на своем сайте, существенно упрощает восприятие читателем той мысли, которую вы собирались до него донести, и сильно облегчает жизнь в этом — грамотно составленное содержание статьи. Особенно если это объемная статья, разбитая на множество заголовков/подзаголовков.
Функция представленная порталом 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 за отличную функцию

Нашли ошибку в тексте? Выделите ее и нажмите Ctrl + Enter

WPBuild.Ru

www@artstorm.su
1Comment
  • Nikodim 23:13h, 16 октября Ответить

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

Post A Comment