Показывать только начало поста
Я знаю, что это довольно очевидный вопрос с множеством ответов (например, здесь), но я хочу показывать только начало постов с кнопкой "читать далее". Я не использую анонсы, поэтому хочу, чтобы 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 символов отображаются, но нет никакого форматирования или заголовков... Весь текст представлен одним блоком.
Shan-x
Да, этот код удаляет все это. Если вы не хотите, чтобы это удалялось, измените эту строку: 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));
Industrial Themes
Так лучше, но заголовки и форматирование все еще отсутствуют (текст занимает всю ширину вместо колонки).
Shan-x
В таком случае, попробуйте вместо этого использовать для этой строки: if(empty($excerpt)) $excerpt = get_post_field('post_content', $postid); это выведет содержимое дословно, но может быть опасным, потому что если в начале поста есть какой-либо HTML-код, он будет учитываться в подсчёте символов, что потенциально может привести к возвращению контента разной длины от поста к посту.
Industrial Themes
Вы можете попробовать следующий вариант:
<?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 под вашим ответом, чтобы добавить больше информации о том, куда это можно поместить, а также любые необходимые форматирования кода.
Howdy_McGee