我正在本地开发一个WordPress(v4.6.1)网站,其首页也是我用作显示最新新闻的页面。
它循环播出每个帖子,我想知道如何截断每个循环中的内容,因为它目前只显示每个帖子的所有内容。
模板循环输出内容的代码:
<?php
if ( have_posts() ) :
if ( is_home() && ! is_front_page() ) : ?>
<header>
<h1 class="page-title screen-reader-text"><?php single_post_title(); ?></h1>
</header>
<?php
endif;
/* Start the Loop */
while ( have_posts() ) : the_post();
/*
* Include the Post-Format-specific template for the content.
* If you want to override this in a child theme, then include a file
* called content-___.php (where ___ is the Post Format name) and that will be used instead.
*/
get_template_part( 'template-parts/content', get_post_format() );
endwhile;
the_posts_navigation();
else :
get_template_part( 'template-parts/content', 'none' );
endif; ?>
答案 0 :(得分:2)
我们需要查看template-parts/content.php
文件中的代码。我怀疑它正在使用the_content()
将内容呈现给浏览器。你可以打开它并检查出来。
默认情况下,WordPress函数the_content
将呈现所有内容。要限制显示的内容,您可以选择:
the_excerpt()
代替the_content()
。第一个选项是使用摘录而不是抓取所有内容。在WordPress中,摘录是内容的片段,其中HTML标记被删除。默认情况下,它会为您提供55个字的内容。
何时使用此选项
这个选项最简单,因为你让WordPress处理截断过程。如果您不关心在编辑器中保留HTML标记,则可以使用此选项。
如何更改字数
要更改单词数,请注册过滤器事件,然后返回所需的单词数。在这个例子中,你说你想要200个单词。
add_filter( 'excerpt_length', 'change_excerpt_number_words_length' );
/**
* Change the number of words for the excerpts.
*
* @since 1.0.0
*
* @return int
*/
function change_excerpt_number_words_length() {
return 200;
}
第二个选项要求您编写一个函数,将“text”截断为一定数量的单词或字符。
何时使用此选项
如果要保留HTML标记,可以使用此选项。摘录去掉换行符,段落等。使用此选项,您使用get_the_content()
,然后通过截断它来过滤返回。保留编辑器中编写的短代码和HTML标记。
如何强>
在这里,您将需要一些PHP和WordPress核心知识和印章。基本上,您希望将回调注册到the_content
过滤器以获取所有内容。然后你将删除短代码。最后,您将把它传递给截断函数。
此截断功能改编自WordPress Core:
/**
* Truncate the incoming string of text to a set number of words.
* It preserves the HTML markup.
*
* @since 1.0.0
*
* NOTE: This function is adapted from WordPress Core's `wp_trim_words()`
* function. It does the same functionality, except it does not strip out
* the HTML tag elements.
*
* @param string $text
* @param int $words_limit
* @param string $more_text
*
* @return string
*/
function truncate_text( $text, $words_limit = 55, $more_text = '…' ) {
$separator = ' ';
/*
* translators: If your word count is based on single characters (e.g. East Asian characters),
* enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
* Do not translate into your own language.
*/
if ( strpos( _x( 'words', 'Word count type. Do not translate!' ), 'characters' ) === 0 && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) ) {
$text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
preg_match_all( '/./u', $text, $words_array );
$words_array = array_slice( $words_array[0], 0, $words_limit + 1 );
$separator = '';
} else {
$words_array = preg_split( "/[\n\r\t ]+/", $text, $words_limit + 1, PREG_SPLIT_NO_EMPTY );
}
if ( ! count( $words_array ) > $words_limit ) {
return implode( $separator, $words_array );
}
array_pop( $words_array );
$text = implode( $separator, $words_array );
return $text . $more_text;
}
然后您需要注册the_content
事件:
add_filter('the_content', 'truncate_the_content', 99);
/**
* Truncate the content to a set number of words.
*
* @since 1.0.0
*
* @param string $text
*
* @return string
*/
function truncate_the_content( $text ) {
$text = strip_shortcodes( $text );
return truncate_text( $text );
}
最后,确保您正在运行截断,以避免限制页面和单个帖子。或者您可以使用is_singular()
添加条件检查。如果是,则只返回文本而不截断。
add_filter('the_content', 'truncate_the_content', 99);
/**
* Truncate the content to a set number of words.
*
* @since 1.0.0
*
* @param string $text
*
* @return string
*/
function truncate_the_content( $text ) {
if ( is_singular() ) {
return $text;
}
$text = strip_shortcodes( $text );
return truncate_text( $text );
}
这应该让你开始朝着正确的方向前进。
有很多限制器/截断技术。上述策略只是其中之一。