web-dev-qa-db-fra.com

Définir le titre de la page dans WordPress avec PHP

Je sais que cette question a déjà été posée des milliers de fois, mais j’ai essayé nombre de ces solutions sans succès.

Tentatives de solutions, entre autres (ajoutées à la page de modèle)

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' );

Le scénario est que j'ai un modèle personnalisé pour une page de liste de travail. Cette page contient une réécriture d'URL qui réécrit domain.com/about/careers/search/job?slug=whatever en domain.com/about/careers/search/job/whatever - le slug est utilisé pour extraire une entrée de Redis contenant toutes les informations relatives à la liste de postes, y compris le titre que je souhaite utiliser.

Voici comment je réécris l'URL (à partir de 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);
8
user147215

J'ai fait des recherches avec mon modèle. Mon modèle appelle get_header pour imprimer les balises HTML avec head, etc., je suppose que le vôtre fait de même.

Pour remplacer le titre, je commence une mise en mémoire tampon de sortie juste avant d'appeler cette fonction et je l'obtiens après.

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

Je soupçonne que la logique pour modifier wp_title in le modèle se déclenche trop tard.

Dans la plupart des cas, wp_title est appelé dans le fichier d’en-tête, qui aura été traité avant d’arriver au modèle avec votre logique.

Si vous pouvez ajouter quelque chose comme ceci à votre functions.php, je parie que WP définira le titre comme vous le souhaitez.

<?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');

Cela n’ajoutera la fonction au filtre que lorsque le WP_Query principal a une variable appelée "slug", qui devrait coïncider avec la logique que vous avez décrite ci-dessus.

4
Cameron Hurd

Je comprends que vous avez déjà essayé d’utiliser le filtre wp_title, mais veuillez l’essayer de la manière suivante.

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 );
2
Faham Shaikh

D'après qn et les commentaires, je suppose que vous utilisez un modèle de page personnalisé (probablement dans un thème enfant et basé sur page.php) et non un type de publication personnalisé?

De même, j'utilise une page personnalisée avec une base de données non-WP pour afficher le contenu demandé (en générant un titre, plus des balises méta uniques pour Google à la volée), par exemple. http://travelchimps.com/country/france (? cc = france Titre "France: conseils de voyage") et travelchimps.com/country/cuba/health (? cc = cuba & spg = health "informations de voyage à Cuba: Santé".)

Il se peut que je manque quelque chose dans votre qn, mais avec un modèle de page personnalisé vous n’avez pas besoin de la fonctionnalité filtres/WP pour le titre de la page, vous pouvez utiliser votre propre variable directe. Si vous avez besoin d’une page d’index significative des titres de joblist, vous pouvez également générer ce fichier directement à partir de 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' );

Modèle de page personnalisé:

<?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 -->

L'inconvénient du modèle de page personnalisé est qu'il est "spécifique à un thème". Toutefois, il est simple de créer un nouveau (même nom de modèle) en utilisant la page.php du nouveau thème et de le copier dans le code de votre ancien modèle.

Je préfère aussi utiliser des noms pour les identifiants. J'ai donc utilisé l'éditeur de page pour enregistrer une page vide (titre et slug de pays) avec "CountryQryPage" sélectionné comme modèle; et dans mon plugin site-functions: 

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');
0
scytale