wp_trim_words() не обрезает the_content() в WordPress

8 мар. 2019 г., 10:01:17
Просмотры: 20.4K
Голосов: 4

На моем WordPress сайте я хочу показывать короткий текст каждого blog_post на пользовательском шаблоне блога. Я хочу показывать кнопку Читать далее со ссылкой на запись в конце, чтобы пользователь мог нажать на эту ссылку и просмотреть полную запись.

Но я всегда получаю всю запись целиком вместо её краткого содержания.

Вот мой код:

$moreLink = '<a href="' . the_permalink() . '"> Читать далее...</a>';
$wp_query = new WP_Query();
while ($wp_query->have_posts()) : $wp_query->the_post(); ?>

<h2><a href="<?php the_permalink(); ?>" title="Читать далее"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<?php echo wp_trim_words( the_content(), 55, $moreLink); ?>
<?php endwhile; ?>

Я пробовал разные варианты кода вместо wp_trim_words(the_content(), 55, $moreLink);, найденные в интернете, но безуспешно. Даже использовал ту же строку кода на другом пользовательском шаблоне, и там она работает нормально. Однако с этим шаблоном она не работает.

Допускаю ли я какую-то ошибку в моём коде?

0
Все ответы на вопрос 1
3
11

Проблема в этой строке:

<?php echo wp_trim_words( the_content(), 55, $moreLink); ?>

Вы вызываете функцию the_content внутри. Эта функция выводит весь контент и ничего не возвращает. Это означает, что вы сначала выводите контент, а затем передаете пустую строку в wp_trim_words.

Правильно будет так:

<?php echo wp_trim_words( get_the_content(), 55, $moreLink); ?>

Будьте внимательны, потому что, как описано в кодексе, get_the_content() не пропускает контент через фильтр 'the_content'. Это значит, что шорткоды не будут выполнены. Если вам нужно получить именно то, что выводит the_content(), используйте:

<?php
$my_content = apply_filters( 'the_content', get_the_content() );
echo wp_trim_words( $my_content, 55, $moreLink);
?>

Также рекомендую использовать wp_strip_all_tags(), иначе могут возникнуть проблемы с незакрытыми тегами, которые были обрезаны.

Полный пример:

<?php
$my_content = apply_filters( 'the_content', get_the_content() );
$my_content = wp_strip_all_tags($my_content);
echo wp_trim_words( $my_content, 55, $moreLink);
?>
8 мар. 2019 г. 10:11:34
Комментарии

Оно работает, но вместо реального содержимого показывает мне шорткод записи, как здесь.

teccraft teccraft
8 мар. 2019 г. 10:45:12

@Mr. Cariol Спасибо за ваш ответ. Предложенное вами решение работает отлично.

teccraft teccraft
8 мар. 2019 г. 12:38:05

Спасибо, Krysiek, за это объяснение! Хотя в моём случае я использовал get_the_content(), это всё равно не работало, пока я не применил ваш "полный пример". Похоже, требуется apply_filters() и/или wp_strip_all_tags(). Выглядит немного запутанно, но это единственное, что сработало.

Eric Hepperle - CodeSlayer2010 Eric Hepperle - CodeSlayer2010
19 мар. 2025 г. 21:28:06