首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wordpress跳过apply_filters的功能?

Wordpress跳过apply_filters的功能?
EN

Stack Overflow用户
提问于 2012-12-31 17:50:11
回答 1查看 874关注 0票数 0

我使用的是一个翻译插件,它为the_title、the_content和其他东西创建了一个钩子。除了有一段代码不显示标题之外,所有的代码都工作得很好。它使用以下代码:

代码语言:javascript
复制
$page_title = apply_filters('the_title',get_the_title());

如果我尝试使用get_the_title()the_title(),它就会崩溃。

应用过滤器的作用是什么?如何使其不跳过翻译插件中的钩子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-31 23:30:14

the_titlethe_content也存在于Wordpress核心中。它们被用来做很多事情。如果您知道钩子是什么,那么为什么像这样的行很有用是显而易见的。

过滤器钩子和操作钩子本质上是洗衣清单。您可以将函数一个接一个地放在钩子上,这样它们就形成了一个队列,当这个钩子被调用(分别由do_actionapply_filters调用)时,Wordpress将一个接一个地从队列中退出。当它这样做时,它将执行它们。

代码语言:javascript
复制
add_action( 'test', 'func1' );
add_action( 'test', 'func2' );
do_action( 'test' ); // Executes func1 and then func2

操作和筛选器之间的区别在于,虽然它们都可以接受值,但只有筛选器会返回修改后的值。操作做了一些本身很重要的事情;过滤器接受一个值,并返回一个修改后的版本,可以在以后使用。例如,要大写使用the_title打印的每个标题,我们可以使用以下代码:

代码语言:javascript
复制
add_filter( 'the_title', function( $title ) {
    return strtoupper( $title );
});

因为我们知道挂在the_title上的所有函数-钩子而不是函数-将只由apply_filters执行,所以我们希望在函数the_title中的某个地方找到它。实际上,该函数基本上就是echo get_the_title,下面是get_the_title的外观:

代码语言:javascript
复制
function get_the_title( $id = 0 ) {
        $post = &get_post($id);

        $title = isset($post->post_title) ? $post->post_title : '';
        $id = isset($post->ID) ? $post->ID : (int) $id;

        if ( !is_admin() ) {
                if ( !empty($post->post_password) ) {
                        $protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
                        $title = sprintf($protected_title_format, $title);
                } else if ( isset($post->post_status) && 'private' == $post->post_status ) {
                        $private_title_format = apply_filters('private_title_format', __('Private: %s'));
                        $title = sprintf($private_title_format, $title);
                }
        }
        return apply_filters( 'the_title', $title, $id );
}

我之所以发布完整的函数,是因为学习如何在源代码中查找钩子对于初学Wordpress的开发人员来说非常重要。源代码中到处都是钩子,因此它们可以用来修改Wordpress内置函数的许多方面。既然您已经在源代码中找到了apply_filters( 'the_title', ... ),您就可以体会到它的重要性了!

the_title只是回显get_the_title给它的值,你可以通过在钩子the_title上附加一个过滤器来修改甚至替换get_the_title返回的值!

现在,我希望您不要认为我到目前为止所写的一切都是无用的。事实上,现在我们可以很容易地回答您的主要问题是“为什么它不工作?”

首先,您永远不能将the_title传递给函数!这就像编写somefunction( $var1, echo $var2, $var3 )一样。我们不能使用echo将值传递给函数,因为echo会将其输出发送到浏览器。

更好的尝试是你发布的那个

代码语言:javascript
复制
$page_title = apply_filters('the_title',get_the_title());

但正如我们所看到的,get_the_title已经对其返回值应用了the_title。您只需再次应用所有这些函数。如果你在the_title上附加了一些自定义过滤器,或者它什么也做不了,它可能会导致奇怪。因此,这要么使结果变得混乱,要么是无端的。这就是为什么你应该简单地这样做:

代码语言:javascript
复制
$page_title = get_the_title();

现在,你还说

一切正常,除了有一小段代码不显示标题

这是令人困惑的,因为我们不期望变量赋值会输出任何东西!要输出标题,您可以这样做

代码语言:javascript
复制
$page_title = get_the_title();
echo $page_title;

但正如我们所了解到的,这实际上(查看源代码中的细微差别)与:

代码语言:javascript
复制
the_title();

所以我写了相当多的东西,只是为了得出一个结论,那就是你可能想要单独使用the_title。但我希望这也是一个很好的过滤器/动作钩子的资源。

欢迎提出任何问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14100050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档