Seitentitel in WordPress mit PHP festlegen

Lesezeit: 7 Minuten

Ich weiß, dass diese Frage schon tausende Male gestellt wurde, aber ich habe viele dieser Lösungen ohne Erfolg versucht.

Lösungsversuche u.a. (zur Vorlagenseite hinzugefügt)

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

Das Szenario ist, dass ich eine benutzerdefinierte Vorlage für eine Seite mit Stellenangeboten habe. Diese Seite verfügt über eine URL-Umschreibung, die umschreibt domain.com/about/careers/search/job?slug=whatever zu domain.com/about/careers/search/job/whatever – Der Slug wird verwendet, um einen Eintrag aus Redis abzurufen, der alle Informationen für die Stellenanzeige enthält, einschließlich des Titels, den ich verwenden möchte.

So schreibe ich die URL um (von 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);

  • Zur Verdeutlichung: Da ich den Titel von Redis abrufe, ist diese Hook- und Callback-Funktion Teil der Seitenvorlage, von der aus Redis aufgerufen wird.

    Benutzer147215

    15. Juli 2018 um 12:50 Uhr

  • Bitte teilen Sie uns die Callback-Funktion mit, die Sie für den Filter ausprobiert haben the_titledh. callback_to_set_the_title?

    – dafoxuk

    15. Juli 2018 um 14:15 Uhr

Benutzeravatar von Kapsonfire
Kapsonfeuer

Ich habe mit meiner Vorlage etwas recherchiert. Meine Vorlage ruft get_header() auf, um die HTML-Tags mit Kopf und so weiter zu drucken, und ich denke, Ihre macht dasselbe.

Um den Titel zu ersetzen, starte ich direkt vor dem Aufruf dieser Funktion eine Ausgabepufferung und erhalte sie danach.

Danach kann ich den Titel einfach mit preg_replace() ersetzen:

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

  • Schön. Funktioniert perfekt, wenn Sie aus bestimmten Gründen eine externe Seite verwenden.

    – Mitternachtscoder

    3. Dezember 2018 um 22:57 Uhr

  • Wo genau spiegeln Sie das denn wieder? Wo genau hast du dieses Snippet platziert?

    – Leymannx

    11. März 2019 um 12:53 Uhr

  • wo die Vorlage get_header(); aufruft;

    – Kapsonfeuer

    11. März 2019 um 13:40 Uhr

Benutzeravatar von Cameron Hurd
Cameron Hurd

Ich vermute, dass die Logik zum Ändern von wp_title in Die Schablone feuert zu spät.

In den meisten Fällen, wp_title wird in der Header-Datei aufgerufen, die verarbeitet wurde, bevor Sie mit Ihrer Logik zur Vorlage gelangen.

Wenn Sie Folgendes zu Ihrer hinzufügen functions.php Datei, WordPress wird den Titel so setzen, wie Sie es beabsichtigen.

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

Dadurch wird die Funktion nur dann zum Filter hinzugefügt, wenn die Hauptfunktion aktiviert ist WP_Query hat eine Variable namens “slug“, was mit der oben dargelegten Logik übereinstimmen sollte.

  • Habe den obigen Code probiert. Habe PHP Fatal error: Uncaught Error: Call to a member function get() on array an $slug = $query->query->get('slug');

    – Mulli

    16. Juli 2020 um 19:33 Uhr

  • Sie könnten eine Typprüfung hinzufügen, indem Sie sicherstellen $query->query instanceof WP_Query oder etwas ähnliches. /zucken. Vielleicht hat sich WP in den letzten 4 Jahren geändert.

    – Cameron Hurd

    3. Februar 2021 um 14:32 Uhr

Benutzeravatar von Faham Shaikh
Faham Scheich

Ich verstehe, dass Sie bereits versucht haben, die zu verwenden wp_title filtern, aber versuchen Sie es bitte folgendermaßen.

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

  • Nicht sicher, warum Sie nach der Seitenvorlage suchen, der von mir getestete Code muss IN der Vorlage sein, da ich dort die Daten abrufe, um den Inhalt in der Vorlage von Redis zu füllen

    Benutzer147215

    16. Juli 2018 um 19:45 Uhr

  • Mit anderen Worten, ich muss den Seitentitel innerhalb der Seitenvorlage festlegen, da ich dort Zugriff auf die Daten habe, die ich für den Seitentitel verwenden möchte (die von Redis abgerufene Berufsbezeichnung).

    Benutzer147215

    16. Juli 2018 um 19:47 Uhr

  • @Neil Das größte Problem hier ist, dass die meisten Hooks nicht von der Seitenvorlage aus funktionieren, da WordPress zu diesem Zeitpunkt bereits geladen ist und Hooks bereits ausgelöst wurden. Ich dachte an einen Hack, um den Titel mit jQuery festzulegen, aber wie gesagt, es ist ein Hack, keine Lösung.

    – Faham Scheich

    16. Juli 2018 um 23:16 Uhr

Ich habe das gleiche Problem.

Nach dem Debuggen des wp-Quellcodes. Ich habe eine schönere Lösung gefunden.
wp_get_document_title()
Basierend auf Kommentaren können wir diese Filter in wp 4.4.0 oder höher verwenden.

/**  Replace document title **/
function product_page_replace_title( $empty ) {
    // New page title.
    return 'New Title';
}
add_filter( 'pre_get_document_title', 'product_page_replace_title' );

add_filter( 'document_title', 'mod_browser_tab_title');
function mod_browser_tab_title( $title )
{
    $title="Custom title";
    return $title;
}

Benutzeravatar der Community
Gemeinschaft

Aus der Frage und den Kommentaren gehe ich davon aus, dass Sie eine benutzerdefinierte Seitenvorlage (wahrscheinlich in einem untergeordneten Thema und basierend auf page.php) und keinen benutzerdefinierten Beitragstyp verwenden?

Ich verwende in ähnlicher Weise eine benutzerdefinierte Seite mit einer Nicht-WordPress-Datenbank, um angeforderte Inhalte anzuzeigen (Erzeugung von Titel, plus eindeutige Meta-Tags für Google im laufenden Betrieb), z. http://travelchimps.com/country/france (?cc=france Title „Frankreich: Reisehinweise“) und travelchimps.com/country/cuba/health (?cc=cuba&spg=health „Cuba travel info: Health“.)

Möglicherweise fehlt mir etwas in Ihrer Frage, aber mit einer benutzerdefinierten Seitenvorlage benötigen Sie keine Filter/WordPress-Funktionalität für den Seitentitel. Sie können Ihre eigene Variable direkt verwenden. Wenn Sie eine aussagekräftige Indexseite von Joblistentiteln benötigen, können Sie diese auch direkt aus Redis generieren.

Datei functions.php:

// Allow WordPress to store querystring attributes for use in our pages
function my_query_vars_filter($vars) {
  # Jobs
  $vars[] .= 'slug';
  # More variables
}
add_filter('query_vars', 'my_query_vars_filter');

Benutzerdefinierte Seitenvorlage:

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

Der Nachteil der benutzerdefinierten Seitenvorlage ist, dass sie „themaspezifisch“ ist – es ist jedoch eine einfache Sache, eine neue (gleichnamige Vorlage) zu erstellen, indem sie die page.php des neuen Themas als Basis verwendet und den Code aus Ihrer alten Vorlage kopiert.

Ich verwende auch lieber Namen als IDs. Also habe ich den Seiteneditor verwendet, um eine leere Seite (Titel und Slug des Landes) zu speichern, wobei “CountryQryPage” als Vorlage ausgewählt war; und in meinem Site-Functions-Plugin:

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

1394100cookie-checkSeitentitel in WordPress mit PHP festlegen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy