使用PHP在WordPress中设置页面标题

时间:2018-07-12 15:12:09

标签: php wordpress

我知道这个问题已经问过数千遍了,但是我尝试了很多这样的解决方案,但是都没有成功。

尝试的解决方案,以及其他解决方案(已添加到模板页面)

add_filter('the_title','callback_to_set_the_title');

add_filter('wp_title', 'callback_to_set_the_title');

global $title;
$title = 'My Custom Title';

add_filter( 'pre_get_document_title', 'callback_to_set_the_title' );

add_filter( 'document_title_parts', 'callback_to_set_the_title' );

这种情况是我有一个工作清单页面的自定义模板。此页面具有适当的url重写功能,可将domain.com/about/careers/search/job?slug=whatever重写为domain.com/about/careers/search/job/whatever-slug用于从Redis检索条目,该条目包含工作清单的所有信息,包括我要使用的标题。

这是我重写URL的方法(来自functions.php):

function job_listing_url_rewrite() {
    global $wp_rewrite;
    add_rewrite_tag('%slug%', '([^&]+)');
    add_rewrite_rule('^about/careers/search/job/([a-zA-Z0-9-_]+)/?', 'index.php?page_id=6633&slug=$matches[1]', 'top');
    $wp_rewrite->flush_rules(true);
}
add_action('init', 'job_listing_url_rewrite', 10, 0);

4 个答案:

答案 0 :(得分:4)

我怀疑在模板中更改wp_title 的逻辑触发得太晚了。

大多数情况下,头文件中将调用wp_title,在使用您的逻辑进入模板之前,该头文件已被处理。

如果您能够在functions.php中添加以下内容,我敢打赌WP将按照您的意愿设置标题。

<?php 
// functions.php

function change_title_if_job_posting($query) {
    $slug = $query->query->get('slug');

    // The URL is a match, and your function above set the value of $slug on the query
    if ('' !== $slug) {
        /**
         * Use the value of $slug here and reimplement whatever logic is
         * currently in your template to get the data from redis.
         * 
         * For this example, we'll pretend it is set to var $data. :)
         */
        $data = 'whatever-the-result-of-the-redis-req-and-subsequent-processing-is';

        /** 
         * Changes the contents of the <title></title> tag.
         *
         * Break this out from a closure to it's own function
         * if you want to also alter the get_the_title() function
         * without duplicating logic!
         */
        add_filter('wp_title', function($title) use ($data) {
            return $data;
        });
    }
}

// This is the crux of it – we want to try hooking our function to the wp_title
// filter as soon as your `slug` variable is set to the WP_Query; not all the way down in the template.
add_action('parse_query', 'change_title_if_job_posting');

仅当主WP_Query上设置了一个名为“ slug”的变量时,该函数才会添加到过滤器中,该变量应与您上面列出的逻辑保持一致。

答案 1 :(得分:3)

我对模板做了一些研究。我的模板调用get_header来打印带有head的html标签,依此类推,我想您的标签也是如此。

要替换标题,我在调用该函数之前立即开始输出缓冲,然后再获取它。 之后,我可以轻松地用preg_replace替换标题

ob_start();
get_header();
$header = ob_get_clean();
$header = preg_replace('#<title>(.*?)<\/title>#', '<title>TEST</title>', $header);
echo $header;

答案 2 :(得分:2)

我了解您已经尝试使用wp_title过滤器,但请按以下方式尝试

function job_listing_title_override ($title, $sep){
    if (is_page_template('templates/job-listing.php')) {
        $title = 'Job Listing Page '.$sep.' '. get_bloginfo( 'name', 'display' );
    }
    return $title;
}
add_filter( 'wp_title', 'job_listing_title_override', 10, 2 );

答案 3 :(得分:0)

从qn和注释中,我假设您正在使用自定义页面模板(可能是在子主题中,并且基于page.php)而不是自定义帖子类型?

我类似地使用具有非WP数据库的自定义页面来显示请求的内容(生成标题,以及动态生成Google的唯一元标记),例如http://travelchimps.com/country/france(?cc = franc标题“法国:旅行建议”)和travelchimps.com/country/cuba/health(?cc = cuba&spg = health“古巴旅行信息:健康”。)

我可能在您的qn中缺少某些内容,但是使用自定义页面模板时,您不需要页面标题的过滤器/ WP功能,就可以直接使用自己的变量。如果您需要有意义的工作清单标题索引页,也可以直接从Redis生成此页面。

functions.php:

//  allow WP to store querystring attribs for use in our pages
function my_query_vars_filter($vars) {
  # jobs
  $vars[] .= 'slug';
  # more vars
}
add_filter( 'query_vars', 'my_query_vars_filter' );

自定义页面模板:

<?php /* Template Name: JobQryPage*/

// *** get data (i don't know redis)  ***
$redisKey = get_query_var('slug');  // validate as reqd
// use $redisKey to select $jobInfo from Redis
$PAGE_TITLE = $jobInfo['title']; // or whatever
// maybe some meta tag stuff

// code copied from page.php .... 
   // maybe replace "get_header();" with modified header.php code 
   ...
   // ** IN THE HTML FOR THE TITLE: CHANGE say "the_title();" to  "echo $PAGE_TITLE;" **
   // e.g. ?>
    <h2 class="post-title"><?php echo $PAGE_TITLE; ?></h2>
   ...  
  <div class="post-content">
    <?php // ** delete "< ?php the_content(); ? > or other code used to display page editor content
          // and replace with your code to render your Redis $jobInfo ** ?>
  </div>
  <!-- remainder of page.php code -->

自定义页面模板的缺点是它是“主题特定的”-但是,以新主题的page.php为基础创建一个新的(相同名称的模板)是简单的事情,然后从旧模板中复制代码。

我也更喜欢使用名称作为ID。因此,我使用页面编辑器以“ CountryQryPage”作为模板保存了一个空页面(国家的标题和子弹);并在我的站点功能插件中:

function tc_rewrite_rules($rules) {
  global $wp_rewrite;
  $tc_rule = array(
    'country/(.+)/?' => 'index.php?pagename=' . 'country' . '&cc=$matches[1]'
  );
  return array_merge($tc_rule, $rules);
}
add_filter('page_rewrite_rules', 'tc_rewrite_rules');