Вывод оглавления
-
Здравствуйте, Flector!
Нужно вывести оглавление вначале статьи в Турбо страницах, сформированное плагином Table of Contents Plus с помощью шорткода [toc] (или каким-либо другим способом).Вставляю сюда https://prnt.sc/luny3a и ничего не выводится. Подскажите, пожалуйста, как вывести оглавление.
-
ну это сам плагин не хочет в rss выводить.
можете поправить в файле toc.php:
удалить строку 1421:if ( is_feed() ) return false;
и изменить строку 299:
if ( !is_search() && !is_archive() && !is_feed() )
на
if ( !is_search() && !is_archive() )
Спасибо большое, все получилось!
Добрый день! Спасибо за функциональный плагин, в котором даже я разобраться смогла))
Появился вопрос как раз по затронутой теме. Была та же проблема, что и у sabrina87 с плагином Table of Contents Plus. Удачно нашла этот пост, выполнила ваши рекомендации, вроде все заработало, но теперь есть еще две проблемы)
В вебмастере матюкается на все ленты всех сайтов на тему:Фрагмент, на который ссылается ссылка, на странице отсутствует или указан у неподдерживаемого элемента (10 предупреждений)
="toc_list"> <li><a href="#i"><span class="toc_number toc_depth_1">1</span> Приз... сла</a> <ul> <li><a href="#i-2"><span class="toc_number toc_depth_2">1.1</span>... ара</a></li> <li><a href="#i-3"><span class="toc_number toc_depth_2">1.2</span>... и тд
А в турбо страницах при попытке подвигаться по оглавлению перекидывает на соотвествующий блок, но не на турбо-странице, а на сайте. То есть ссылки из оглавления турбо-страницы ведут непосредственно на сайт. Как со всем этим бороться?
PS. Функция “отладить” не для меня, я там вообще ничего понять не могу)
это потому, что яндекс.турбо пока что не умеет относительные ссылки парсить – обещали исправить, но уже несколько месяцев как ждем.
Спасибо за быстрый ответ) То есть это их косяк? Тогда не буду заморачиваться по этому поводу, пусть сами разбираются.
А можно еще спросить – сейчас у меня подключены по несколько лент на каждый сайт (в соответствии с полным количеством страниц). Но я уже видела здесь ваши советы на тему, что их вполне можно отключить.
Но – в одном топике как раз обсуждалось, что если сайт периодически обновляется (вносятся правки и пр), то будут расхождения, правильно?
А если я буду периодически удалять ленты, а потом, когда вебмастер начнет верещать на то, что контент разный, добавлять их, чтобы в турбо-версиях тоже все обновилось, а потом снова удалять, чтобы не грузить сайт – так можно? Будет работать?да, так можно.
Спасибо большое за помощь!
Доброго времени суток!
Помогите, пожалуйста, с аналогичной проблемой – вебмастер ругается на отсутствие оглавлений в турбо версиях.
Оглавление выводится с помощью такого кода. Где и что надо убрать-добавить, чтоб оглавление появилось в рсс.<?php /* Plugin Name: Oglavlenie Description: Содержание/оглавление для больших постов. * Автор: Тимур Камаев * Версия: 2.9.5 * */ class Kama_Contents{ // defaults options public $opt = array( // Отступ слева у подразделов в px. 'margin' => 40, // Теги по умолчанию по котором будет строиться оглавление. Порядок имеет значение. // Кроме тегов, можно указать атрибут classа: array('h2','.class_name'). Можно указать строкой: 'h2 h3 .class_name' 'selectors' => array('h2'), // Ссылка на возврат к оглавлению. '' - убрать ссылку // 'to_menu' => 'к содержанию ↑', // Заголовок. '' - убрать заголовок 'title' => 'Содержание:', // Css стили. '' - убрать стили // 'css' => '.kc__gotop{ display:block; text-align:right; } .kc__title{ font-style:italic; padding:1em 0; }', // Минимальное количество найденных тегов, чтобы оглавление выводилось. 'min_found' => 2, // Минимальная длина (символов) текста, чтобы оглавление выводилось. 'min_length' => 2000, // Ссылка на страницу для которой собирается оглавление. Если оглавление выводиться на другой странице... 'page_url' => '', // Название шоткода 'shortcode' => 'contents', // Оставлять символы в анкорах 'spec' => '\'.+$*~=', // Какой тип анкора использовать: 'a' - <a name="anchor"></a> или 'id' - 'anchor_type' => 'id', ); public $contents; // collect html contents private $temp; static $inst; function __construct( $args = array() ){ $this->set_opt( $args ); return $this; } ## экземпляр static function init( $args = array() ){ is_null( self::$inst ) && self::$inst = new self( $args ); if( $args ) self::$inst->set_opt( $args ); return self::$inst; } function set_opt( $args = array() ){ $this->opt = (object) array_merge( (array) $this->opt, (array) $args ); } /** * Обрабатывает текст, превращает шоткод в нем в оглавление. * @param (string) $content текст, в котором есть шоткод. * @param (string) $contents_cb колбек фунция, которая обработает список оглавления. * @return Обработанный текст с оглавлением, если в нем есть шоткод. */ function shortcode( $content, $contents_cb = '' ){ if( false === strpos( $content, '['. $this->opt->shortcode ) ) return $content; // get contents data if( ! preg_match('~^(.*)\['. $this->opt->shortcode .'([^\]]*)\](.*)$~s', $content, $m ) ) return $content; $contents = $this->make_contents( $m[3], $m[2] ); if( $contents && $contents_cb && is_callable($contents_cb) ) $contents = $contents_cb( $contents ); return $m[1] . $contents . $m[3]; } /** * Заменяет заголовки в переданном тексте (по ссылке), создает и возвращает оглавление. * @param (string) $content текст на основе которого нужно создать оглавление. * @param (array/string) $tags массив тегов, которые искать в переданном тексте. * Можно указать: имена тегов "h2 h3" или классы элементов ".foo .foo2". * Если в теги добавить маркер "embed" то вернется только тег <ul> * без заголовка и оборачивающего блока. Нужно для использвоания внутри текста, как список. * @return html код оглавления. */ function make_contents( & $content, $tags = '' ){ // выходим если текст короткий if( mb_strlen( strip_tags($content) ) < $this->opt->min_length ) return; $this->temp = $this->opt; $this->temp->i = 0; $this->contents = ''; if( is_string($tags) && $tags = trim($tags) ) $tags = array_map('trim', preg_split('~\s+~', $tags ) ); if( ! $tags ) $tags = $this->opt->selectors; // check tags foreach( $tags as $k => $tag ){ // remove special marker tags and set $args if( in_array( $tag, array('embed','no_to_menu') ) ){ if( $tag == 'embed' ) $this->temp->embed = true; if( $tag == 'no_to_menu' ) $this->opt->to_menu = false; unset( $tags[ $k ] ); continue; } // remove tag if it's not exists in content $patt = ( ($tag[0] == '.') ? 'class=[\'"][^\'"]*'. substr($tag, 1) : "<$tag" ); if( ! preg_match("/$patt/i", $content ) ){ unset( $tags[ $k ] ); continue; } } if( ! $tags ) return; // set patterns from given $tags // separate classes & tags & set $class_patt = $tag_patt = $level_tags = array(); foreach( $tags as $tag ){ // class if( $tag{0} == '.' ){ $tag = substr( $tag, 1 ); $link = & $class_patt; } // html tag else $link = & $tag_patt; $link[] = $tag; $level_tags[] = $tag; } $this->temp->level_tags = array_flip( $level_tags ); // заменяем все заголовки и собираем оглавление в $this->contents $patt_in = array(); if( $tag_patt ) $patt_in[] = '(?:<('. implode('|', $tag_patt) .')([^>]*)>(.*?)<\/\1>)'; if( $class_patt ) $patt_in[] = '(?:<([^ >]+) ([^>]*class=["\'][^>]*('. implode('|', $class_patt) .')[^>]*["\'][^>]*)>(.*?)<\/'. ($patt_in?'\4':'\1') .'>)'; $patt_in = implode('|', $patt_in ); // collect and replace $_content = preg_replace_callback("/$patt_in/is", array( &$this, '__make_contents_callback'), $content, -1, $count ); if( ! $count || $count < $this->opt->min_found ) return; $content = $_content; // опять работаем с важной $content // html static $css; $embed = !! isset($this->temp->embed); $this->contents = ( ( !$embed && $this->opt->title ) ? '<div class="oglav">' : '' ) . ( ( ! $css && $this->opt->css ) ? '<style>'. $this->opt->css .'</style>' : '' ) . ( ( !$embed && $this->opt->title ) ? '<div class="oglav-titl">'. $this->opt->title .'</div>'. "\n" : '' ) . '<ul class="oglav-cont"'. ((!$this->opt->title || $embed) ? ' id="kcmenu"' : '') .'>'. "\n". implode('', $this->contents ) . '</ul>'."\n" . ( ( !$embed && $this->opt->title ) ? '</div>' : '' ); return $this->contents; } ## callback функция для замены и сбора оглавления private function __make_contents_callback( $match ){ // it's only class selector in pattern if( count($match) == 5 ){ $tag = $match[1]; $attrs = $match[2]; $title = $match[4]; $level_tag = $match[3]; // class_name } // it's found tag selector elseif( count($match) == 4 ){ $tag = $match[1]; $attrs = $match[2]; $title = $match[3]; $level_tag = $tag; } // it's found class selector else{ $tag = $match[4]; $attrs = $match[5]; $title = $match[7]; $level_tag = $match[6]; // class_name } $anchor = $this->__sanitaze_anchor( $title ); $opt = & $this->opt; $level = @ $this->temp->level_tags[ $level_tag ]; if( $level > 0 ) $sub = ( $opt->margin ? ' style="margin-left:'. ($level*$opt->margin) .'px;"' : '') . ' class="oglav-sub'. $level .'"'; else $sub = ' class="oglav-top"'; // собираем оглавление $this->contents[] = "\t". '<li'. $sub .'><a href="'. $opt->page_url .'#'. $anchor .'">'. $title .'</a></li>'. "\n"; // заменяем $to_menu = $new_el = ''; if( $opt->to_menu ) $to_menu = (++$this->temp->i == 1) ? '' : '<a class="kc-gotop kc__gotop" href="'. $opt->page_url .'#kcmenu">'. $opt->to_menu .'</a>'; $new_el = "\n<$tag id=\"$anchor\" $attrs>$title</$tag>"; if( $opt->anchor_type == 'a' ) $new_el = '<a class="kc-anchor kc__anchor" name="'. $anchor .'"></a>'."\n<$tag $attrs>$title</$tag>"; return $to_menu . $new_el; } ## Транслитерация УРЛ private function __sanitaze_anchor( $str ){ $str = strip_tags( $str ); $iso9 = array( 'А'=>'A', 'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ё'=>'YO', 'Ж'=>'ZH', 'З'=>'Z', 'И'=>'I', 'Й'=>'J', 'К'=>'K', 'Л'=>'L', 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R', 'С'=>'S', 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Х'=>'H', 'Ц'=>'TS', 'Ч'=>'CH', 'Ш'=>'SH', 'Щ'=>'SHH', 'Ъ'=>'', 'Ы'=>'Y', 'Ь'=>'', 'Э'=>'E', 'Ю'=>'YU', 'Я'=>'YA', // small 'а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 'д'=>'d', 'е'=>'e', 'ё'=>'yo', 'ж'=>'zh', 'з'=>'z', 'и'=>'i', 'й'=>'j', 'к'=>'k', 'л'=>'l', 'м'=>'m', 'н'=>'n', 'о'=>'o', 'п'=>'p', 'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 'ф'=>'f', 'х'=>'h', 'ц'=>'ts', 'ч'=>'ch', 'ш'=>'sh', 'щ'=>'shh', 'ъ'=>'', 'ы'=>'y', 'ь'=>'', 'э'=>'e', 'ю'=>'yu', 'я'=>'ya', // other '?'=>'G', '?'=>'G', '?'=>'YE', '?'=>'Z', '?'=>'J', '?'=>'I', '?'=>'YI', '?'=>'K', '?'=>'L', '?'=>'N', '?'=>'U', '?'=>'DH', '?'=>'g', '?'=>'g', '?'=>'ye', '?'=>'z', '?'=>'j', '?'=>'i', '?'=>'yi', '?'=>'k', '?'=>'l', '?'=>'n', '?'=>'u', '?'=>'dh' ); $str = strtr( $str, $iso9 ); $spec = preg_quote( $this->opt->spec ); $str = preg_replace("/[^a-zA-Z0-9\-_$spec]+/", '-', $str ); // все ненужное на '-' $str = preg_replace('/^-+|-+$/', '', $str ); // кил конечные --- return strtolower( $str ); } ## Вырезает шоткод из контента function strip_shortcode( $text ){ return preg_replace('~\['. $this->opt->shortcode .'[^\]]*\]~', '', $text ); } } ## Обработка шоткода [contents] в тексте //add_filter('the_content', 'kama_contents_shortcode'); //function kama_contents_shortcode( $content ){ // $args = array(); // //$args['shortcode'] = 'list'; // [list] вместо [contents] // // if( is_singular() ){ // //$args['margin'] = 30; // $args['to_menu'] = 'к оглавлению ↑'; // $args['title'] = 'Оглавление:'; // $args['page_url'] = get_permalink(); // // return Kama_Contents::init( $args )->shortcode( $content ); // } // else{ // return Kama_Contents::init( $args )->strip_shortcode( $content ); // } // // } ## Вывод содержания вверху, автоматом для всех постов add_filter('the_content', 'contents_on_post_top' ); function contents_on_post_top( $content ){ if( ! is_singular() ) return $content; //$args['margin'] = 50; //$args['to_menu'] = false; //$args['title'] = false; $tags = array('h2'); $contents = Kama_Contents::init( $args )->make_contents( $content, $tags ); return $contents . $content; } ?>
замените строку:
if( ! is_singular() ) return $content;
на
if( ! is_singular() ) { if( ! is_feed() ) return $content; }
Здравствуйте Flector! Извините, что пишу сюда. Писала вам на почту [email protected] по поводу плагина, но ответа не получила. Моя почта [email protected].
Спасибо большое, в турбо появилось содержание, причем переход по ссылкам не на сайт, а на соответствующий заголовок в турбо. Так что с относительными ссылками у них вопрос уже решен.
Но возникла другая проблема – Дзен также стал брать содержание. И теперь в ленте вообще нехорошо выходит – вместо начала статьи в 55 символов выводятся отрывки содержания. При этом стоит в настройках плагина галочка брать описание с сео-плагина и в рсс это описание есть, но Дзен все равно берет первые знаки статьи. Подскажите, пожалуйста, как запретить содержание для рсс дзена? Так же для него используется ваш плагин. Вот кусок кода из рсс дзена.<content:encoded><![CDATA[ <figure><img src="/wp-content/uploads/2018/12/kogo-zhdyot-uspex-v-karere-v-novom-godu.jpg" width="600" height="416" /><figcaption>Кого ждёт успех в работе и карьере в новом году</figcaption></figure> <p>Содержание:</p> <ul class="oglav-cont"> <li class="oglav-top"><a href="#obshhij-prognoz-dlya-vseh-znakov">Общий прогноз для всех знаков</a></li> <li class="oglav-top"><a href="#oven">Овен</a></li> <li class="oglav-top"><a href="#telets">Телец</a></li> <li class="oglav-top"><a href="#bliznetsy">Близнецы</a></li> <li class="oglav-top"><a href="#rak">Рак</a></li> <li class="oglav-top"><a href="#lev">Лев</a></li> <li class="oglav-top"><a href="#deva">Дева</a></li> <li class="oglav-top"><a href="#vesy">Весы</a></li> <li class="oglav-top"><a href="#skorpion">Скорпион</a></li> <li class="oglav-top"><a href="#strelets">Стрелец</a></li> <li class="oglav-top"><a href="#kozerog">Козерог</a></li> <li class="oglav-top"><a href="#vodolej">Водолей</a></li> <li class="oglav-top"><a href="#ryby">Рыбы</a></li> </ul> <p>Хозяйкой нового 2019 года станет Желтая Земляная Свинья.</p>
поправьте код на:
if( ! is_singular() ) { if( ! is_feed('turbo') ) return $content; }
где
turbo
это название турбо-ленты.Спасибо огромное, все работает!
А у меня все так же ругается, перекидывает на сайт и выдает ошибки:
3982 8 ="toc_list"> <li><a href="#__Lexus"><span class="toc_number toc_depth_1">1</span 3983 8 xus</a></li> <li><a href="#i"><span class="toc_number toc_depth_1">2</span> Разм 3985 8 сус</a> <ul> <li><a href="#_Lexus_GS300"><span class="toc_number toc_depth_2">2. 3986 8 300</a></li> <li><a href="#_Lexus_RX"><span class="toc_number toc_depth_2">2.2</ 3987 8 RX</a></li> <li><a href="#__470"><span class="toc_number toc_depth_2">2.3</span 3988 8 470</a></li> <li><a href="#_Lexus_IS"><span class="toc_number toc_depth_2">2.4</ 3989 8 IS</a></li> <li><a href="#__570"><span class="toc_number toc_depth_2">2.5</span 4106 8 ="toc_list"> <li><a href="#_Alcasta"><span class="toc_number toc_depth_1">1</spa 4108 8 sta</a> <ul> <li><a href="#01"><span class="toc_number toc_depth_2">1.1</span> М 4109 8 М01</a></li> <li><a href="#M31"><span class="toc_number toc_depth_2">1.2</span>
блок содержания теперь может выводить сам плагин.
правок плагина toc+ больше не требуется.
- The topic ‘Вывод оглавления’ is closed to new replies.