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
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:
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
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
Faham Scheich
Ich verstehe, dass Sie bereits versucht haben, die zu verwenden wp_title filtern, aber versuchen Sie es bitte folgendermaßen.
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' );
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:
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_title
dh.callback_to_set_the_title
?– dafoxuk
15. Juli 2018 um 14:15 Uhr