使用apply_filters的Wordpress跳过功能?

时间:2012-12-31 09:50:11

标签: wordpress translation

我正在使用翻译插件,为the_title,the_content和其他东西创建一个钩子。 除了一段没有显示标题的代码外,一切正常。 它使用此代码:

$page_title = apply_filters('the_title',get_the_title());

如果我尝试使用get_the_title()the_title(),则会中断。

应用过滤器做了什么,以及如何使其不会跳过翻译插件?

1 个答案:

答案 0 :(得分:2)

WordPress核心中也存在

the_titlethe_content。它们被用于许多事情。如果您知道什么是钩子,为什么这样的线是有用的。

过滤钩和动作钩基本上是洗衣清单。你可以将函数一个接一个地放在钩子上,这样它们就形成了一个队列,当这个钩子被调用时(分别由do_actionapply_filters),Wordpress会将一个接一个的函数入队。就像它一样,它将执行它们。

add_action( 'test', 'func1' );
add_action( 'test', 'func2' );
do_action( 'test' ); // Executes func1 and then func2

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

add_filter( 'the_title', function( $title ) {
    return strtoupper( $title );
});

因为我们知道挂钩在the_title上的所有函数 - 钩子而不是函数 - 只能由apply_filters执行,我们希望在函数the_title中找到它。实际上这个函数基本上是echo get_the_title,这里是get_the_title的样子:

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给出的值,您可以通过将过滤器附加到钩子get_the_title来修改甚至替换the_title返回的值!

现在,我希望你不要认为我到目前为止写的所有内容都是无偿的。事实上,现在我们可以轻松回答您的主要问题,即“为什么它不起作用?”

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

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

$page_title = apply_filters('the_title',get_the_title());

但正如我们所见,get_the_title已将the_title应用于其返回值。您只是第二次应用所有这些功能。如果您将某些自定义过滤器附加到the_title或者它无能为力,则可能会导致异常。所以它要么弄糊涂了结果,要么是无偿的。这就是为什么你应该这样做:

$page_title = get_the_title();

现在,你也说过

  

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

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

$page_title = get_the_title();
echo $page_title;

但是正如我们所知道的那样,这确实(看一下细微差别的源代码)同样如下:

the_title();

所以我写了很多,只是为了得出你可能想要自己使用the_title的结论。但我希望这也可以成为关于过滤器/动作挂钩的好资源。

欢迎任何问题。