如何在WordPress中截断后循环内容?

时间:2016-11-27 19:48:12

标签: php wordpress

我正在本地开发一个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; ?>

1 个答案:

答案 0 :(得分:2)

我们需要查看template-parts/content.php文件中的代码。我怀疑它正在使用the_content()将内容呈现给浏览器。你可以打开它并检查出来。

默认情况下,WordPress函数the_content将呈现所有内容。要限制显示的内容,您可以选择:

  1. 使用the_excerpt()代替the_content()
  2. 或者您需要编写截断函数。
  3. 使用摘录

    第一个选项是使用摘录而不是抓取所有内容。在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 = '&hellip;' ) {
    
        $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 );
    }
    

    这应该让你开始朝着正确的方向前进。

    声明

    有很多限制器/截断技术。上述策略只是其中之一。