【问题标题】:Set wp_title to change title tag from plugin?设置 wp_title 以从插件更改标题标签?
【发布时间】:2015-10-05 03:59:58
【问题描述】:

我创建了一个 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-&gt;custom_title($title, 'new title); 的操作,但它看起来不像那样有可能吗?

我把它贴在这里是因为我认为这是一个普通的 PHP 类问题。

我可以全球化一个返回的变量吗?我想从另一个函数的查询中返回“标题”列,例如$query-&gt;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;
  }
}

【问题讨论】:

  • view_content() 实际上并没有 return 任何东西......
  • 在我在函数内工作的整个代码中,我需要做的就是找到一种方法将其传递给另一个函数。

标签: php wordpress class title


【解决方案1】:

Wordpress 抱怨第二个参数,因为我假设该函数在一些地方使用,其中该函数只是像现在一样使用 1 个参数调用。

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

我假设您为函数添加了更多逻辑,但这样第二个参数是“定义的”。顺便说一句,这不是真正“整洁”的代码。

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

【讨论】:

  • 对象部分是我正在努力解决的问题,我不知道如何将它传递给设置标题的函数。
【解决方案2】:

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

【讨论】:

    【解决方案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;
        }
    

    WP Plugin API
    PHP Anonymous functions
    PHP Class properties

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多