Sé que esta pregunta se ha hecho miles de veces antes, pero he intentado muchas de estas soluciones sin éxito.
Intentos de solución, entre otros (añadidos a la página de plantilla)
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' );
El escenario es que tengo una plantilla personalizada para una página de listado de trabajos. Esta página tiene una reescritura de URL que reescribe domain.com/about/careers/search/job?slug=whatever
a domain.com/about/careers/search/job/whatever
– el slug se usa para recuperar una entrada de Redis que contiene toda la información para la lista de trabajos, incluido el título que me gustaría usar.
Así es como estoy reescribiendo la URL (desde 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);
kapsonfuego
Investigué un poco con mi plantilla. Mi plantilla llama a get_header() para imprimir las etiquetas HTML con encabezado, etc., y supongo que la tuya hace lo mismo.
Para reemplazar el título, empiezo un almacenamiento en búfer de salida justo antes de llamar a esa función y lo obtengo después.
Después de eso, puedo reemplazar el título fácilmente con preg_replace():
ob_start();
get_header();
$header = ob_get_clean();
$header = preg_replace('#<title>(.*?)<\/title>#', '<title>TEST</title>', $header);
echo $header;
-
Hermoso. Funciona perfectamente si se usa una página externa por razones específicas.
– Codificador de medianoche
3 de diciembre de 2018 a las 22:57
-
¿Dónde exactamente haces eco de esto entonces? ¿Dónde colocaste exactamente este fragmento?
– Leymannx
11 de marzo de 2019 a las 12:53
-
donde la plantilla llama a get_header();
– Kapsonfire
11 de marzo de 2019 a las 13:40
cameron hurd
Sospecho que la lógica para alterar wp_title en la plantilla se dispara demasiado tarde.
En la mayoría de los casos, wp_title
se invoca en el archivo de encabezado, que se habrá procesado antes de llegar a la plantilla con su lógica.
Si agrega lo siguiente a su functions.php
archivo, WordPress establecerá el título de la manera que desee.
<?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');
Esto solo agregará la función al filtro cuando el principal WP_Query
tiene un conjunto de variables llamado “slug
“, que debería coincidir con la lógica que expuso anteriormente.
-
Intenté el código anterior. Obtuvo
PHP Fatal error: Uncaught Error: Call to a member function get() on array
en$slug = $query->query->get('slug');
– Mulli
16 de julio de 2020 a las 19:33
-
Puede agregar verificación de tipos asegurándose de
$query->query instanceof WP_Query
o algo similar. /encogimiento de hombros. Tal vez WP ha cambiado en los últimos 4 años.– Cameron Hurd
3 de febrero de 2021 a las 14:32
Shaikh Faham
Entiendo que ya ha intentado usar el wp_title
filtro, pero inténtelo de la siguiente manera.
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 );
-
No estoy seguro de por qué está buscando la plantilla de la página, el código que probé debe estar EN la plantilla porque ahí es donde estoy recuperando los datos para completar el contenido en la plantilla de Redis
– usuario147215
16/07/2018 a las 19:45
-
En otras palabras, necesito configurar el título de la página desde la plantilla de la página porque ahí es donde tengo acceso a los datos que quiero usar para el título de la página (el título del trabajo obtenido de Redis)
– usuario147215
16 de julio de 2018 a las 19:47
-
@Neil El mayor problema aquí es que la mayoría de los ganchos no funcionarán desde la plantilla de la página, ya que WordPress ya está cargado en ese momento y los ganchos ya se activaron. Pensé en un truco para establecer el título usando jQuery pero, como dije, es un truco, no una solución.
– Faham Shaikh
16 de julio de 2018 a las 23:16
escítalo
De la pregunta y los comentarios, asumo que está utilizando una plantilla de página personalizada (probablemente en un tema secundario y basado en page.php) y no un tipo de publicación personalizada.
De manera similar, uso una página personalizada con una base de datos que no es de WordPress para mostrar el contenido solicitado (generando Título, más metaetiquetas únicas para Google sobre la marcha), por ejemplo, http://travelchimps.com/country/francia (?cc=france Título “Francia: consejos de viaje”) y travelchimps.com/country/cuba/health (?cc=cuba&spg=health “Cuba travel info: Health”.)
Es posible que me falte algo en su pregunta, pero con una plantilla de página personalizada no necesita la funcionalidad de filtros/WordPress para el título de la página. Puede utilizar su propia variable directa. Si necesita una página de índice significativa de títulos de listas de trabajos, también puede generarla directamente desde Redis.
Archivo 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');
Plantilla de página personalizada:
<?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 -->
La desventaja de la plantilla de página personalizada es que es “específica del tema”; sin embargo, es una cuestión simple crear una nueva (plantilla con el mismo nombre) utilizando la página del nuevo tema.php como base y copiar el código de su plantilla anterior.
También prefiero usar nombres para las identificaciones. Así que utilicé el editor de páginas para guardar una página vacía (título y slug del país) con “CountryQryPage” seleccionado como plantilla; y en el complemento de funciones de mi sitio:
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');
Estoy teniendo el mismo problema.
Después de depurar el código fuente de wp. Encontré una mejor solución.
wp_get_document_title()
Según los comentarios, podemos usar estos filtros en wp 4.4.0 o superior.
/** 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' );
vadim h
add_filter( 'document_title', 'mod_browser_tab_title');
function mod_browser_tab_title( $title )
{
$title="Custom title";
return $title;
}
Para aclarar, dado que estoy recuperando el título de Redis, esta función de enlace y devolución de llamada es parte de la plantilla de página desde donde se llama a Redis.
– usuario147215
15 de julio de 2018 a las 12:50
¿Podría compartir la función de devolución de llamada que probó para el filtro?
the_title
es decir.callback_to_set_the_title
?– dafoxuk
15 de julio de 2018 a las 14:15