为什么向‘the_title’添加筛选器会破坏服务器?

时间:2018-02-11 作者:Jonathan Guerin

我有这个功能可以帮助我很好地修剪帖子标题:

namespace Helpers;
..
function _s_trim_post_title ( $length = null, $delimiter = null ) {
    $title          = get_the_title();
    $trimmed_title  = mb_strimwidth( $title, 
                                     0, 
                                     $length === null ? BIG_INT : $length, 
                                     \'\' // Won\'t use, bugs out.
                                    );
    $url            = esc_url( get_permalink() );

    if( strlen( $title ) == strlen( $trimmed_title ) ) {
        $delimiter = \'\';
    }

    $delimiter = $delimiter === null ? \'\' : (string)$delimiter;

    $output = \'<h2 class="post-title"><a href="\' . $url . \'" rel="bookmark">\' . $trimmed_title . $delimiter . \'</a></h2>\';

    return $output;
}
我叫它,开content.php 具体如下:

echo Helpers\\_s_trim_post_title(24, \'...\');
我在想,用过滤器做这些怎么样:

add_filter( \'the_title\', \'Helpers\\\\_s_trim_post_title\', 24, \'...\');
现在,在我的content.php, 我会用简单的:

the_title()

不幸的是,这会破坏整个服务器并将其发送到一个连续的循环中。

为什么?

2 个回复
最合适的回答,由SO网友:obiPlabon 整理而成

下面是正确的代码片段。希望对你有用。

Helper function

namespace Helpers;
..
function _s_trim_content( $content = \'\', $length = null, $delimiter = null ) {
    $trimmed_content = mb_strimwidth( $content, 
        0, 
        is_null( $length ) ? BIG_INT : $length, 
        \'\' // Won\'t use, bugs out.
    );

    if ( mb_strlen( $content ) === mb_strlen( $trimmed_content ) || is_null( $delimiter ) ) {
        $delimiter = \'\';
    }

    return $trimmed_content . $delimiter;
}

the_title filter

add_filter( \'the_title\', function( $title, $post_id ) {
    if ( \'post\' === get_post_type( $post_id ) ) {
        return \\Helpers\\_s_trim_content( $title, 24, \'...\' );
    }
    return $title;
}, 10, 2 );

SO网友:obiPlabon

首先,请尝试了解WordPress中过滤器挂钩的工作原理。在这种情况下,这两个函数将对您有所帮助apply_fitlers()add_filter()

那么请检查如何the_title 过滤器挂钩的工作原理及其作用方式。

the_title 过滤器挂钩在很多地方都有使用。它在前端和后端都使用过,并且只适用于标题。但你添加了标题h2 标记和锚定a 贴上标签。您可以使用is_admin() 仅在前端应用筛选器的条件函数。因此,请确保the_title 筛选器回调仅适用于标题,不返回任何标记。

你的the_title 筛选器挂钩回调Helpers\\_s_trim_post_title() 不处理从筛选器挂钩获取的参数。你打电话来了get_the_title() 内部模板标记the_title 这就变成了递归调用,一个无限循环!这就是为什么您的系统没有按预期工作的原因。

结束

相关推荐

当返回值为空时,Apply_Filters为什么要返回非空字符串?

因为这个把我的键盘弄坏了。进行了正确的安装,将数据库上载到新的MySQL,并一直在正确使用子主题。但有件事困扰着我,我想不出来。在我的新安装上(ver2.whowhatwhy.com) 我故意将一些小部件留空。我想,当阅读default-widgets.php wp中的文件包括在该小部件上不会显示标题元素。相反,显示标题小部件是因为,出于某种原因,传递的值apply_filters 是一个空格,而不是空白值$instance[\'title\'] 为空。$title = apply_filters( \'