问题描述

当我在”the loop”(存档页面等) 中,如何强制所有文章的 teasers /摘录,不管它们是否包含<!--more--> 标签?

细节:

我从_s 模板开始,它使用 content.php 模板显示博客文章内容,该模板称为 the_content()函数。此功能检查该帖子,并尝试找到<!--more--> 标签。如果找到该标签,则返回一个预告片和一个更多的链接,如果不是只输出整个帖子。

我想保留第一部分,如果内容作者使用<!--more--> 标签,但是如果他/她忘记了它,我想自动显示前导/摘录 (类似于第一段或第二段) 。

这样做最好的方法是什么?有一个 the_content 滤波器,阅读更多的自定义文本不会出现。你会推荐什么

最佳解决思路

编辑

好的,有一个非常隐藏的本机功能,get_extended(),我从来不知道,并由 @kaiser 在 his answer 中大大解释。我的答案只能是 @kaiser 的答案的扩展

原始答案

没有本机功能来做到这一点。这里最好的办法是使用像 strpos 这样的 PHP 函数来搜索更多的标签,然后根据结果做一些事情。

你可以尝试这样的东西

if( strpos( $post->post_content, '<!--more-->' ) ) {
    the_content( __( '&hellip; Read more about this article <span class="meta-nav">&rarr;</span>' ) );
}
else {
    the_excerpt();
}

次佳解决思路

当然,在内核的<!--more--> 标签之前和之后都有一个 API 函数 (隐藏在内核的深度) 。由于完全为零的命名约定,WP 中的便捷部件通常被监视:get_extended()

// In the loop, after `the_post()` filled the global `$post`:
$info = get_extended( $post );

// The resulting data is an Array:
[Array] $info
    'main'      => the text before the `<!--more-->`
    'extended'  => the content after the `<!--more-->` comment
    'more_text' => the custom "Read More" text

结果将如下所示:

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post();

        $info = get_extended( $GLOBALS['post'] );

        if ( ! empty( $info['extended'] ) )
        {
            the_content( ! empty( $info['more_text'] ) ? $info['more_text'] : 'Read more' );
        }
        else
        {
            the_excerpt();
        }
    }
}

并根据<!--more--> 的存在切换摘录和内容。请记住,默认情况下,WP 只接受没有空格的<!--more--> 。因此,如果您的作者手工输入并添加空格,<!-- more --> 将无法正常工作 (无论如何) 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。