我创建了一个WP插件,它使用查询字符串根据访问者选择的内容提取页面数据。显然,这模拟'其他页面但页面标题不会更改为WP Admin中的标题集。
我一直试图挂钩wp_title
以便在飞行中更改标题标签,但却无法使用此标签。
以下功能有效:
public function custom_title($title) {
return 'new title';
}
add_filter( 'wp_title', array($this, 'custom_title'), 20 );
// changes <title> to 'new title'
一旦我尝试将变量传递给它,就会失败。
public function custom_title($title, $new_title) {
return $new_title;
}
WordPress抱怨它错过了第二个参数,我想这是有道理的,因为函数是在页面加载时调用的...我希望我可以在我的插件中执行类似$this->custom_title($title, 'new title);
的操作但是它看起来不太可能吗?
我在这里发布了这个,因为我认为这是一个普通的PHP类问题。
我可以全局化返回的变量,例如我想要回复这个标题&#39;来自另一个函数(例如$query->title
当函数运行时,它返回数据库中的数据
public function view_content()
{
$query = $this->db->get_row('SELECT title FROM ...');
$query->title;
}
我现在需要将$ query-&gt;标题设置为页面标题。
public function custom_title()
{
if($query->title)
{
$new_title = $query->title;
}
}
答案 0 :(得分:6)
看起来您可能误解了过滤机制的工作原理。 filter
是WordPress在特定时间使用某些参数调用的函数,并检索结果。以下是对WordPress过滤器的一个不错的介绍:http://dev.themeblvd.com/tutorial/filters/
您可能还想特别查看wp_title
过滤器的文档页面,以便了解您的函数应该期望的参数:https://codex.wordpress.org/Plugin_API/Filter_Reference/wp_title
执行您想要的代码看起来像这样:
public function __construct() {
//...
add_filter( 'wp_title', array($this, 'custom_title'), 20);
}
public function view_content() {
$query = $this->db->get_row('SELECT title FROM ...');
$this->page_title = $query->title;
}
public function custom_title($title) {
if ($this->page_title) {
return $this->page_title;
}
return $title;
}
答案 1 :(得分:3)
动作和过滤器挂钩允许您在程序执行的某个时刻更改Wordpress生成的内容。这些自定义更改是在附加到特定挂钩的函数内部进行的。
传递给附加函数的参数最初是由Wordpress生成的,第一个参数是要更改和返回的值,在the_title
挂钩的情况下,它是页面的标题。
由于可以多次使用相同的过滤器,因此可以在附加的其他函数中修改该值,当您的函数完全转动时,取决于定义的优先级以及它们添加到过滤器的顺序。
过滤器和操作之间的区别在于,在第一种情况下,您需要返回一个值(已修改或原始),而操作是某种触发事件,您可以在其中打印某些内容。当然,您也可以定义和触发自己的自定义操作和过滤器。
可以在应用之前随时添加过滤器,并且挂钩的函数可以采用匿名函数的形式,如下例所示。
public function view_content()
{
$query = $this->db->get_row( 'SELECT title FROM ...' );
add_filter( 'wp_title', function( $title ) use ( $query ) {
return $query->title;
}, 20 );
}
或者您可以将值保存为对象属性并在以后使用它。
public function view_content()
{
$query = $this->db->get_row( 'SELECT title FROM ...' );
$this->title = $query->title;
add_filter( 'wp_title', array( $this, 'custom_title' ), 20 );
}
public function custom_title( $title )
{
return $this->title;
}
答案 2 :(得分:0)
Wordpress抱怨第二个参数,因为我假设该函数在一些地方使用,其中函数简单地用1参数调用,就像现在一样。
public function custom_title($title, $new_title='') {
return $new_title;
}
我假设您为函数添加了更多逻辑,但是通过这种方式,第二个参数是'已定义'。这不是真正的“整洁”代码btw。
关于你的第二个问题;是的,你显然可以在对象中存储一些东西。您只需要在其中执行此操作即可查看代码的其他部分是否可以访问它。