Поддержка Проблемы и решения Не отображать часть поста через the_excerpt

  • Итак, есть сайт. Тема самописная, возможно не вполне универсальная. На главной странице посты выводятся в главном цикле через функцию the_excerpt(). В некоторых постах расположены эпиграфы к статьям. Они помечены как <p class="epigraph">...</p>. Как устроить так, чтобы the_excerpt вырезала все подобные куски с главной страницы?

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • а разве она не вырезает?
    вроде как 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'); 
    

    Что бы я без вас делал. Спасибо. Пора курить регулярные выражения до полного просветления. )))

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Тема «Не отображать часть поста через the_excerpt» закрыта для новых ответов.