Ограничение количества слов в контенте записи и добавление ссылки "Читать далее"
Как видно в коде, задача состоит в выводе записи с id
равным 266
. Теперь мне нужно ограничить количество слов в контенте этой записи. Например, я хочу ограничить вывод до 300 слов и затем добавить ссылку "Читать далее".
Вот код, который у меня есть на данный момент:
$post_id = 266;
echo "<div id='widgets-wrapper3'><div id='marginwidgets' style='overflow: auto; max-width: 100%; margin: 0 auto; border: none !important;'>";
$queried_post = get_post($post_id);
echo "<div class='thewidgets'>";
echo $queried_post->post_content;
echo '</div>';
echo "</div></div>";
?>

У меня всегда одна и та же проблема с отрывками постов и их содержимым. Существуют различные хуки и функции для этого, как отметил @kaiser. Но иногда они не делают именно то, что мне нужно.
Вот мое решение: я написал собственную функцию, которая берет содержимое поста и обрезает его до указанного количества слов:
function wpse69204_excerpt( $num_words = 20, $ending = '...', $post_id = null )
{
global $post;
// Обрезаем содержимое поста
$current_post = $post_id ? get_post( $post_id ) : $post;
$excerpt = strip_shortcodes( $current_post->post_content );
$excerpt = wp_trim_words( $excerpt, $num_words, $ending );
// Ссылка "Читать далее"
$excerpt .= '<a href="' . get_permalink( $post ) . '" title="">Читать далее...</a>';
return $excerpt;
}

Только что обнаружил wp_trim_words/*_excerpt()
. Интересный момент: функция также корректно работает с языками, где 1 символ = слово, например с китайским.

А что если в содержимом поста есть HTML? Будет ли он учитываться в лимите слов? Я не хочу включать HTML-теги в подсчёт, чтобы функция ограничения количества слов учитывала только чистый текст.

Функция wp_trim_words
удаляет все HTML-теги. Смотрите исходный код здесь

Существует три фильтра, которые управляют ссылкой »подробнее« в зависимости от используемой функции/шаблонного тега. Плохо то, что они могут перехватывать друг друга. Хорошая новость — вы можете легко изменить вывод фильтра, используя функцию current_filter()
, чтобы получить имя текущего прикрепленного фильтра и модифицировать вывод.
Также у нас есть фильтр 'excerpt_length'
, который ограничивает длину цитаты. Он не позволяет добавить постоянную ссылку, но помогает в комбинации с другими фильтрами. Смотрите второй плагин.
Плагин permalink-more
Этот плагин добавляет постоянную ссылку к содержимому или цитате — в зависимости от того, что отображается. Он также сбрасывает фильтр excerpt_more
, чтобы выводить ничего, тем самым не мешая другим фильтрам.
<?php
/** Plugin Name: (#69204) »kaiser« Добавляет постоянную ссылку к цитате и содержимому */
/**
* Изменяет отображение ссылки "подробнее"
*
* @param string $permalink
* @param string $text
* @return string $html
*/
function wpse69204_more_link( $output )
{
$html .= '<span class="post-more"> ';
$html .= sprintf(
'<a href="%s#more-%s" class="more-link" title="читать далее" >'
,get_permalink()
,get_the_ID()
);
$html .= '</a></span>';
// Переопределение 'excerpt_more'
if ( 'excerpt_more' === current_filter() )
return;
// Обрезка содержимого для фильтра `get_the_excerpt`.
$output = wp_trim_words( $output, 300 );
// Добавление к цитате
if ( 'get_the_excerpt' === current_filter() )
return $output.$html;
// Постоянная ссылка для фильтра `the_content_more_link`.
return $html;
}
# Ссылка "Подробнее" для содержимого
add_filter( 'the_content_more_link', 'wpse69204_more_link' );
add_filter( 'get_the_excerpt', 'wpse69204_more_link' );
add_filter( 'excerpt_more', 'wpse69204_more_link' );
Плагин excerpt-more length
Если вам нужно просто изменить длину цитаты, можно использовать более простую настройку фильтров. Следующий плагин делает это очень изящно. Он сокращает содержимое (мы находимся в цикле и имеем доступ к данным записи) до 300 слов. Затем подсчитывает количество букв в каждом отдельном слове и возвращает это (динамически назначенное) число.
<?php
/** Plugin Name: (#69204) »kaiser« Ограничение длины цитаты по количеству слов */
function wpse69204_excerpt_length( $length )
{
$to_count = array_splice( get_the_content(), 300 );
$i = 0;
foreach ( $to_count as $word )
{
$i += strlen( $word );
}
return $i;
}
add_filter( 'excerpt_length', 'wpse69204_excerpt_length' );
Примечания
- Оба плагина работают »без настройки«. Просто загрузите, активируйте, готово.
- Для использования этих плагинов вам нужно применять
the_content()
илиthe_excerpt()
в вашей теме.

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