Поддержка → Проблемы и решения → Не отображать часть поста через the_excerpt
Не отображать часть поста через the_excerpt
-
Итак, есть сайт. Тема самописная, возможно не вполне универсальная. На главной странице посты выводятся в главном цикле через функцию
the_excerpt()
. В некоторых постах расположены эпиграфы к статьям. Они помечены как<p class="epigraph">...</p>
. Как устроить так, чтобы the_excerpt вырезала все подобные куски с главной страницы?
-
а разве она не вырезает?
вроде как the_excerpt вырезает все html-теги.есть вариант, что в теме стоит код аля:
<p class="epigraph"> <?php the_excerpt(); ?> </p>
тогда вам надо править шаблон темы.
Не.
<p class="epigraph">...</p>
— внутри поста, аthe_excerpt()
пользую в шаблоне. Всё вырезал, стронги там, емы, картинку в начале строки вырезал, а вот параграф с указанным классом — нет.повторить не удалось, у меня этот тег с классом вырезается.
вы никакие фильтры на get_the_excerpt не использовали?Вы правы, а я неточно объяснил. Тег-то как раз вырезается, а вот текст параграфа, который и был этим тегом и классом помечен — очень даже остаётся. А хочется, чтобы убиралось и содержимое абзаца, если уж я на главной.
хм. и что тогда должно оставаться на главной то?
Остальной текст поста без эпиграфа, конечно. Эпиграфы эти оформлены через css и отлично выводятся внутри постов. А на главной, из-за того, что the_excerpt съедает теги, а значит оформление, эти эпиграфы ужасно некрасивы. Вот потому и желаю их убрать. Фильтры и хуки к функции the_excerpt ничего пока не дали.
еще раз — а что у вас останется то?
какой остальной текст?
the_excerpt выводит короткую цитату (отрывок) записи, а не всю запись. вырежете кусок — показывать будет нечего.Пфффф. В посте написано так:
<p class=»epigraph»>короткий, красиво оформленный эпиграф</p>
Начало поста — тут небольшой текст<!—more—>
Собственно, продолжение поста.До тега more помещается не только эпиграф, но и часть текста самого поста. Вот тот кусок и должен остаться на главной странице, когда эпиграф будет вырезан.
function custom_wp_trim_excerpt($text) { $raw_excerpt = $text; if ( '' == $text ) { $text = get_the_content(''); $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = preg_replace('/<p class=\"epigraph\".*?\/p>/i','', $text); $allowed_tags = ''; $text = strip_tags($text, $allowed_tags); $excerpt_word_count = 55; $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); $excerpt_end = '[...]'; $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); } remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'custom_wp_trim_excerpt');
Спасибо, воткнул всю эту красоту в functions.php, результат прежний. Теги убраны, а текст эпиграфа никуда не делся. )) Собственно, то, до чего дошёл с этими фильтрами сам, тоже не работало.
вы убедитесь, что ваш код подпадает под это:
$text = preg_replace('/<p class=\"epigraph\".*?\/p>/i','', $text);
потому что у меня на тестовом сайте работает.
обратите внимание на кавычки и прочее.Вот так выглядит мой эпиграф:
<p class="epigraph">Белый танец, белый танец, Как же это, так нечестно? Где ты, русский мой афганец, Ждет тебя твоя невеста.<br /><span class="alignright"><em>Ю. Рогоза</em></span></p>
Похоже, спан и прочие теги не ловятся в регулярке/
да, с регулярками у меня беда.
понятия не имею, почему регулярка спотыкается при наличии вложенных тегов.
но не важно, такой код будет работать:function custom_wp_trim_excerpt($text) { $raw_excerpt = $text; if ( '' == $text ) { $text = get_the_content(''); $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = preg_replace("'<p class=\"epigraph\"[^>]*?>.*?</p>'si","",$text); $allowed_tags = ''; $text = strip_tags($text, $allowed_tags); $excerpt_word_count = 55; $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); $excerpt_end = '[...]'; $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); } remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'custom_wp_trim_excerpt');
Что бы я без вас делал. Спасибо. Пора курить регулярные выражения до полного просветления. )))
- Тема «Не отображать часть поста через the_excerpt» закрыта для новых ответов.