• Resolved sabrina87

    (@sabrina87)


    Здравствуйте, Flector!
    Нужно вывести оглавление вначале статьи в Турбо страницах, сформированное плагином Table of Contents Plus с помощью шорткода [toc] (или каким-либо другим способом).

    Вставляю сюда https://prnt.sc/luny3a и ничего не выводится. Подскажите, пожалуйста, как вывести оглавление.

Viewing 15 replies - 1 through 15 (of 21 total)
  • Plugin Author Flector

    (@flector)

    ну это сам плагин не хочет в rss выводить.
    можете поправить в файле toc.php:
    удалить строку 1421:

    
    if ( is_feed() ) return false;
    

    и изменить строку 299:

    
    if ( !is_search() && !is_archive() && !is_feed() )
    

    на

    
    if ( !is_search() && !is_archive() )
    
    Thread Starter sabrina87

    (@sabrina87)

    Спасибо большое, все получилось!

    Добрый день! Спасибо за функциональный плагин, в котором даже я разобраться смогла))
    Появился вопрос как раз по затронутой теме. Была та же проблема, что и у 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. Функция “отладить” не для меня, я там вообще ничего понять не могу)

    • This reply was modified 5 years, 11 months ago by evagrom79.
    • This reply was modified 5 years, 11 months ago by evagrom79.
    • This reply was modified 5 years, 11 months ago by evagrom79.
    • This reply was modified 5 years, 11 months ago by evagrom79.
    Plugin Author Flector

    (@flector)

    это потому, что яндекс.турбо пока что не умеет относительные ссылки парсить – обещали исправить, но уже несколько месяцев как ждем.

    Спасибо за быстрый ответ) То есть это их косяк? Тогда не буду заморачиваться по этому поводу, пусть сами разбираются.
    А можно еще спросить – сейчас у меня подключены по несколько лент на каждый сайт (в соответствии с полным количеством страниц). Но я уже видела здесь ваши советы на тему, что их вполне можно отключить.
    Но – в одном топике как раз обсуждалось, что если сайт периодически обновляется (вносятся правки и пр), то будут расхождения, правильно?
    А если я буду периодически удалять ленты, а потом, когда вебмастер начнет верещать на то, что контент разный, добавлять их, чтобы в турбо-версиях тоже все обновилось, а потом снова удалять, чтобы не грузить сайт – так можно? Будет работать?

    Plugin Author Flector

    (@flector)

    да, так можно.

    Спасибо большое за помощь!

    Доброго времени суток!
    Помогите, пожалуйста, с аналогичной проблемой – вебмастер ругается на отсутствие оглавлений в турбо версиях.
    Оглавление выводится с помощью такого кода. Где и что надо убрать-добавить, чтоб оглавление появилось в рсс.

    <?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;
    			    }
    									
    
    ?>
    Plugin Author Flector

    (@flector)

    замените строку:

    
    if( ! is_singular() ) return $content;
    

    на

    
    if( ! is_singular() ) {
     if( ! is_feed() ) return $content;
    }
    
    Thread Starter sabrina87

    (@sabrina87)

    Здравствуйте 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>
    Plugin Author Flector

    (@flector)

    поправьте код на:

    
    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> 
    Plugin Author Flector

    (@flector)

    блок содержания теперь может выводить сам плагин.
    правок плагина toc+ больше не требуется.

Viewing 15 replies - 1 through 15 (of 21 total)
  • The topic ‘Вывод оглавления’ is closed to new replies.