Ограничение количества слов в контенте записи и добавление ссылки "Читать далее"

15 окт. 2012 г., 01:27:08
Просмотры: 18K
Голосов: 4

Как видно в коде, задача состоит в выводе записи с 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>";    
?>
1
Комментарии

Есть ли какие-то успехи по этому вопросу? Вам уже предоставили три (высокоуровневых) ответа.

kaiser kaiser
26 нояб. 2012 г. 04:59:40
Все ответы на вопрос 2
3

У меня всегда одна и та же проблема с отрывками постов и их содержимым. Существуют различные хуки и функции для этого, как отметил @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;
}
15 окт. 2012 г. 04:26:04
Комментарии

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

kaiser kaiser
15 окт. 2012 г. 04:30:21

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

Juliver Galleto Juliver Galleto
16 окт. 2012 г. 01:03:51

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

Anh Tran Anh Tran
16 окт. 2012 г. 04:01:40
2

Существует три фильтра, которые управляют ссылкой »подробнее« в зависимости от используемой функции/шаблонного тега. Плохо то, что они могут перехватывать друг друга. Хорошая новость — вы можете легко изменить вывод фильтра, используя функцию 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">&nbsp;';
    $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' );

Примечания

  1. Оба плагина работают »без настройки«. Просто загрузите, активируйте, готово.
  2. Для использования этих плагинов вам нужно применять the_content() или the_excerpt() в вашей теме.
15 окт. 2012 г. 04:17:15
Комментарии

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

Juliver Galleto Juliver Galleto
16 окт. 2012 г. 01:02:21

Нет, the_excerpt не содержит HTML-тегов. Совет: всегда пробуйте это перед тем, как сообщать о проблеме. Метод проб и ошибок проще, чем обсуждения и догадки :) Спасибо.

kaiser kaiser
16 окт. 2012 г. 01:04:27