Показывать только начало поста
Я знаю, что это довольно очевидный вопрос с множеством ответов (например, здесь), но я хочу показывать только начало постов с кнопкой "читать далее". Я не использую анонсы, поэтому хочу, чтобы WordPress автоматически брал первые 55 слов или первую фразу для отображения.
Я использую тему Toivo Lite. Файл index.php выглядит так:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Хук действия перед циклом. ?>
<?php /* Начало цикла */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Подключение шаблона для контента в зависимости от формата.
* Если вы хотите переопределить это в дочерней теме, включите файл
* content-___.php (где ___ - имя формата поста), который будет использован вместо стандартного.
*/
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
?>
<?php endwhile; ?>
<?php
the_posts_pagination( array(
'prev_text' => __( 'Предыдущая страница', 'toivo-lite' ),
'next_text' => __( 'Следующая страница', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Хук действия после цикла. ?>
<?php get_footer(); ?>
Я пробовал заменить два content
на excerpt
, но тогда страница становится пустой (только шапка и подвал).
Попробуйте заменить это:
<?php
/* Включить шаблон для определенного формата записи.
* Если вы хотите переопределить это в дочерней теме, включите файл
* с названием content-___.php (где ___ - это название формата записи), который будет использоваться вместо стандартного.
*/
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
?>
На это:
<?php echo my_excerpt(get_the_ID(), 300, 'Читать далее'); ?>
И затем добавьте это в файл functions.php:
function my_excerpt($postid, $len = 500, $more = false) {
$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $postid));
if(empty($excerpt)) $excerpt = strip_shortcodes(strip_tags(apply_filters('the_excerpt', get_post_field('post_content', $postid))));
if(strlen($excerpt) > $len) $excerpt = substr($excerpt, 0, $len-3) . '…';
if($more) $excerpt .= '<a class="read-more" href="' . get_the_permalink($postid) . '">' . $more . '</a>';
return $excerpt;
}
По умолчанию это будет возвращать первые 300 символов содержимого записи. Измените значение "300" в вызове функции my_excerpt на нужное вам количество символов (обратите внимание, что это не количество слов, а количество символов).

Это не работает. Первые 300 символов отображаются, но нет никакого форматирования или заголовков... Весь текст представлен одним блоком.

Да, этот код удаляет все это. Если вы не хотите, чтобы это удалялось, измените эту строку: if(empty($excerpt)) $excerpt = strip_shortcodes(strip_tags(apply_filters('the_excerpt', get_post_field('post_content', $postid)))); на это: if(empty($excerpt)) $excerpt = apply_filters('the_excerpt', get_post_field('post_content', $postid));

Так лучше, но заголовки и форматирование все еще отсутствуют (текст занимает всю ширину вместо колонки).

В таком случае, попробуйте вместо этого использовать для этой строки: if(empty($excerpt)) $excerpt = get_post_field('post_content', $postid); это выведет содержимое дословно, но может быть опасным, потому что если в начале поста есть какой-либо HTML-код, он будет учитываться в подсчёте символов, что потенциально может привести к возвращению контента разной длины от поста к посту.

Вы можете попробовать следующий вариант:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Хук перед циклом. ?>
<?php /* Начало цикла */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Подключение шаблона контента в зависимости от формата записи.
* Если вы хотите переопределить это в дочерней теме, включите файл
* с именем content-___.php (где ___ - это название формата записи), и он будет использован вместо стандартного.
*/
echo wp_trim_words( get_the_content(), $num_words = 50, $more = '...' );
echo '<a href="'.get_the_permalink().'">Читать далее</a>';
?>
<?php endwhile; ?>
<?php
the_posts_pagination( array(
'prev_text' => __( 'Предыдущая страница', 'toivo-lite' ),
'next_text' => __( 'Следующая страница', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Хук после цикла. ?>
<?php get_footer(); ?>
Я заменил:
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
На:
wp_trim_words( the_content(), $num_words = 50, $more = '...' );
Кто-то может сказать, что это неправильный подход, но он может вам помочь. Это отобразит первые 50 слов контента с многоточием "..." в конце.

Пожалуйста, нажмите на ссылку edit
под вашим ответом, чтобы добавить больше информации о том, куда это можно поместить, а также любые необходимые форматирования кода.
