0

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

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

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

应用过滤器有什么作用,我如何让它不跳过翻译插件的钩子?

4

1 回答 1

2

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

过滤钩子和动作钩子本质上是洗衣清单。您可以将函数一个接一个地放在一个钩子上,这样它们就形成了一个队列,当这个钩子被(分别)调用时,do_actionWordpressapply_filters将一个接一个地取消队列。正如它所做的那样,它将执行它们。

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

动作和过滤器之间的区别在于,虽然它们都可以接受值,但只有过滤器会返回修改后的值。行动做一些本身很重要的事情;过滤器接受一个值并返回它的修改版本,以后可以使用。例如,要将打印的每个标题大写,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_titlethe_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。但我希望这也能成为过滤器/动作挂钩的一个很好的资源。

欢迎提出任何问题。

于 2012-12-31T15:30:14.287 回答