设置wp_title来改变插件的标题标签


Set wp_title to change title tag from plugin?

我创建了一个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类问题。

我可以全球化一个返回的变量,例如,我想返回'title'列从查询在另一个函数,如$query->title

函数运行时从数据库返回数据

public function view_content()
{
  $query = $this->db->get_row('SELECT title FROM ...');
  $query->title; 
}

我现在需要$query->title设置为页面标题。

public function custom_title()
{
  if($query->title)
  {
    $new_title = $query->title;
  }
}

看起来您可能误解了过滤器机制的工作原理。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;
}

Action和filter hooks允许您在程序执行的某个点更改Wordpress生成的内容。这些自定义更改是在附加到特定钩子的函数中进行的。

传递给附加函数的参数最初是由Wordpress生成的,第一个参数是一个要更改和返回的值,在the_title钩子的情况下是页面的标题。

由于相同的过滤器可以多次使用,该值可以在附加的其他函数中修改,因此您的函数何时轮到取决于定义的优先级以及将它们添加到过滤器的顺序。

过滤器和操作之间的区别在于,在第一种情况下,您需要返回一个值(修改的或原始的),而操作是某种类型的触发事件,例如,您可以在其中打印一些东西。当然,你也可以定义和触发你自己的自定义动作和过滤器。

Filter可以在应用之前随时添加,函数挂钩可以采用匿名函数的形式,如下例所示。

    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;
    }

WP Plugin API
PHP匿名函数

Wordpress抱怨第二个参数,因为我假设这个函数是在几个地方使用的,函数只是用一个参数调用,就像现在一样。

public function custom_title($title, $new_title='') {
return $new_title;
}

我假设你为函数添加了更多的逻辑,但是用这种方式,第二个参数是"定义的"。顺便说一句,这不是真正的"整洁"代码。

对于第二个问题;是的,你显然可以在对象中存储一些东西。重要的是你在哪里做这个,看看它是否可以被你代码的其他部分访问。