Поддержка Плагины Вывод the_content до первой точки

  • Всем известно, что функция the_content в цикле выводит немного текста до тега <!—more—>

    Но мне тут достался живой проект с несколькими тысячами записей, и там нет ни в одной записи этого тега.

    так же можно выводить с помощью the_excerpt, но у постов нет цитат 🙁

    Отсюда вопрос — можно ли использовать какое либо решение, которое выводило бы первое предложение из поста (скажем, до первой точки).

    Спасибо.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    так же можно выводить с помощью the_excerpt, но у постов нет цитат 🙁

    the_excerpt() в любом случае выводит цитату — если поле post_excerpt не заполнено, просто берётся начало записи. Длину цитаты (по умолчанию 55 слов) можно настроить с помощью фильтра excerpt_length.

    Брать первое предложение тоже можно, но это будет чуть сложнее 🙂

    вот я и думаю, что обрывать предложение на полу слове, как это делают некоторые сайта — выглядит неистово пошло. Как минимум по отношению к посетителям сайта.

    а чуть сложнее — это намного сложнее?

    Я не особый специалист по регулярным выражениям, но решение может быть таким:

    function get_first_string( $excerpt ) {
        $excerpt = preg_split('#\.\s#', $excerpt, 2);
    
        return $excerpt[0] . '.';
    }
    add_filter('the_excerpt', 'get_first_string');

    Кратко — находит первое совпадение точки (.) и пробела за ней.
    Известная проблема — если после первого предложения многоточие (…), то сработает только следующее совпадение, видимо из-за того, что многоточие в WP преобразуется в непонятно что.. 🙂

    понял. спасибо большое, я попробую вот это применить.

    но, чтобы я до конца понял суть того, что Вы мне написали, давайте я Вам расскажу, а вы меня поправите?

    то есть, используя add_filter
    Вы заменяете стандартную, прописанную в жвижке функцию the_excerpt
    своей, в данном случае get_first_string
    которая делает нечто отличное от того, что делает стандартная.

    при этом вы туда в качестве параметра передаёте то, что возвращает the_excerpt()

    ну и всё это прописываете в functions.php
    а вызвать функцию можно в любом месте проекта.

    Я правильно понял? 🙂

    а вызвать функцию можно в любом месте проекта.

    Вызывать the_excerpt();, как обычно. Возможно потребуется изменить «ареал» применения этого фильтра. Я говорю об условных тегах —

    if ( !is_search() ) ...

    чтобы не «резать» на других шаблонах, если там тоже применяется the_excerpt();

    хорошо. я вроде понял.
    буду использовать, спасибо, что открыли глаза 🙂

    Вот вариант для многоточия и исправление для корректного добавления точки в конце предложения (если она была одна):

    function get_first_string($excerpt) {
        $excerpt = preg_split('#\pP\s#', $excerpt);
    
        if (preg_match('#\p{P}#', $excerpt[0])) {
    	return $excerpt[0];
        } else {
    	return $excerpt[0] . '.';
        }
    }
    add_filter('the_excerpt', 'get_first_string');

    Немного опасаюсь, что может не сработать на некоторых хостингах (может зря?) :)).

    UPD Забыл про восклицательный, вопросительный знаки, это уже сами 🙂

    И всё-таки, оптимальным вариантом вижу этот код

    function wikicms_split_by_punct( $excerpt ) {
        $excerpt = preg_split( '#(\pP)\s#', $excerpt, 2 , PREG_SPLIT_DELIM_CAPTURE );
    
        return $excerpt[0] . $excerpt[1];
    }
    add_filter( 'the_excerpt', 'wikicms_split_by_punct' );

    [offtop]
    Да простят меня боги Олимпа (ака форума) за столь долгий поиск решения и много топиков )) Особенно, когда нравится вопрос )

    Этот кусок кода, как я понимаю, будет выводить первое предложение из поста?

    пока не попробывал — вот такой вот момент…

    некоторые посты начинаются со списком li, цитат blockquote и, к сожалению, таблиц.

    то есть подступает вопрос о том, чтобы перед тем, как использовать первое предложение — нужно отформатировать контент.

    а в случае с таблицей, которая может быть длинной и не иметь предложений вообще — ограничить вывод данных не просто первой точкой, а, к примеру, пятьюдесятью словами.

    ну, это в идеале функция, я думаю…

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    то есть подступает вопрос о том, чтобы перед тем, как использовать первое предложение — нужно отформатировать контент.

    В фильтр the_excerpt контент попадает уже без тегов, только текст.

    Понятно..
    а как же быть с максимальным количеством слов?
    Представьте, там таблица.. По уму — поставить ограничение, неверное.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    а в случае с таблицей, которая может быть длинной и не иметь предложений вообще — ограничить вывод данных не просто первой точкой, а, к примеру, пятьюдесятью словами.

    В функцию, предложенную wikicms, можно добавить wp_trim_words():

    function wikicms_split_by_punct( $excerpt ) {
        $excerpt = preg_split( '#(\pP)\s#', $excerpt, 2, PREG_SPLIT_DELIM_CAPTURE );
    
        return wp_trim_words( $excerpt[0], 50, '' ) . $excerpt[1];
    }
    add_filter( 'the_excerpt', 'wikicms_split_by_punct' );

    Сейчас заметил, что строка прерывается не только на точках, но и на запятых — думаю, функцию стоит ещё немного доработать.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Тема «Вывод the_content до первой точки» закрыта для новых ответов.