так же можно выводить с помощью 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 и, к сожалению, таблиц.
то есть подступает вопрос о том, чтобы перед тем, как использовать первое предложение — нужно отформатировать контент.
а в случае с таблицей, которая может быть длинной и не иметь предложений вообще — ограничить вывод данных не просто первой точкой, а, к примеру, пятьюдесятью словами.
ну, это в идеале функция, я думаю…
то есть подступает вопрос о том, чтобы перед тем, как использовать первое предложение — нужно отформатировать контент.
В фильтр the_excerpt
контент попадает уже без тегов, только текст.
Понятно..
а как же быть с максимальным количеством слов?
Представьте, там таблица.. По уму — поставить ограничение, неверное.
а в случае с таблицей, которая может быть длинной и не иметь предложений вообще — ограничить вывод данных не просто первой точкой, а, к примеру, пятьюдесятью словами.
В функцию, предложенную 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' );
Сейчас заметил, что строка прерывается не только на точках, но и на запятых — думаю, функцию стоит ещё немного доработать.