wp_trim_words() не обрезает the_content() в WordPress
На моем 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);
, найденные в интернете, но безуспешно. Даже использовал ту же строку кода на другом пользовательском шаблоне, и там она работает нормально. Однако с этим шаблоном она не работает.
Допускаю ли я какую-то ошибку в моём коде?

Проблема в этой строке:
<?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);
?>

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

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

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