我正在使用翻译插件,为the_title,the_content和其他东西创建一个钩子。 除了一段没有显示标题的代码外,一切正常。 它使用此代码:
$page_title = apply_filters('the_title',get_the_title());
如果我尝试使用get_the_title()或the_title(),则会中断。
应用过滤器做了什么,以及如何使其不会跳过翻译插件?
答案 0 :(得分:2)
the_title
和the_content
。它们被用于许多事情。如果您知道什么是钩子,为什么这样的线是有用的。
过滤钩和动作钩基本上是洗衣清单。你可以将函数一个接一个地放在钩子上,这样它们就形成了一个队列,当这个钩子被调用时(分别由do_action
和apply_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
的结论。但我希望这也可以成为关于过滤器/动作挂钩的好资源。
欢迎任何问题。