设置 wp_title 以更改插件的标题标签?

Set wp_title to change title tag from plugin?

我创建了一个 WP 插件,它使用查询字符串根据访问者选择的内容提取页面数据。显然,这 'simulates' 个额外的页面,但页面标题与 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 class 问题。

我可以全球化一个 returned 变量吗?我想 return 来自另一个函数查询的 'title' 列,例如 $query->title

函数运行时 returns 来自数据库的数据

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

Wordpress 抱怨第二个参数,因为我认为该函数用在一些地方,就像现在一样,只需使用 1 个参数调用该函数。

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

我假设你给函数添加了更多的逻辑,但是这样第二个参数是'defined'。这不是真正的 'neat' 代码 btw.

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

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

操作和过滤器挂钩允许您更改 Wordpress 在程序执行的特定点生成的内容。这些自定义更改是在附加到特定挂钩的函数内进行的。

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

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

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

过滤器可以在应用之前随时添加,函数hook可以是匿名函数的形式,如下例。

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

        add_filter( 'wp_title', function( $title ) use ( $query ) {
            return $query->title;
        }, 20 );
    }

或者您可以将该值保存为 object 属性 并在以后使用。

    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 Anonymous functions
PHP Class properties