bugmagnet
Contexto: WordPress 5.4.5, Yoast 3.7.1
Soy un desarrollador de complementos que tiene acceso al sitio del cliente. El sitio tiene Yoast 3.7.1 instalado y me pregunto si eso es significativo porque no importa lo que haga, no puedo cambiar la página 404. title
.
Ahora, en otras páginas de StackOverflow donde se han planteado preguntas similares (aquí, aquí y aquí, por ejemplo), quienes respondieron preguntaron si el header.php
está incrustando correctamente una llamada a wp_title()
. Esto es lo que hay en el tema actual header.php
en ese punto:
<title><?php wp_title( '|', true, 'right' ); ?></title>
Curiosamente, en mi 404.php
página, wp_get_document_title()
me dice que el titulo del documento es Page not found - XXXX
a pesar de wp_title
la llamada anterior especifica el separador como |
. La reescritura de títulos de Yoast se ha desactivado, por lo que no estoy seguro de dónde proviene ese guión.
Mi complemento realiza una llamada REST y extrae contenido de fuera del sitio para incluirlo en la página. Parte de ese contenido es el texto que se utilizará en el title
.
En sitios de clientes anteriores, he podido hacer lo siguiente:
add_filter('wp_title', 'change_404_title');
function change_404_title($title) {
if (is_404())
{
global $plugin_title;
if (!empty($plugin_title))
{
$title = $plugin_title;
}
}
return $title;
}
Sin embargo, en este sitio, eso no funciona.
He intentado, en función de la versión de WordPress que se utiliza, enganchar el pre_get_document_title
filtro, a saber
add_filter('pre_get_document_title', 'change_404_title');
pero de nuevo en vano. Actualmente estoy leyendo sobre Yoast…
Khorshed Alam
wp_title
en desuso desde la versión 4.4. Así que deberíamos usar el nuevo filtro. pre_get_document_title
. Su código se ve bien, pero estoy confundido acerca de global $plugin_title
. Prefiero pedirte que pruebes esto primero
add_filter('pre_get_document_title', 'change_404_title');
function change_404_title($title) {
if (is_404()) {
return 'My Custom Title';
}
return $title;
}
Si no funciona, intente cambiar la prioridad para ejecutar su función últimamente.
add_filter('pre_get_document_title', 'change_404_title', 50);
-
Me gusta el aspecto de la segunda sugerencia. La prioridad podría ser la solución.
– bugmagnet
4 de noviembre de 2016 a las 5:41
-
Sí, la prioridad ES la solución. Gracias. Puntos y felicitaciones a @KhorshedAlam
– bugmagnet
4 de noviembre de 2016 a las 6:52
snnsnn
La forma en que se genera el título del documento ha cambiado desde WordPress v4.4.0. Ahora wp_get_document_title
dicta cómo se genera el título:
/**
* Displays title tag with content.
*
* @ignore
* @since 4.1.0
* @since 4.4.0 Improved title output replaced `wp_title()`.
* @access private
*/
function _wp_render_title_tag() {
if ( ! current_theme_supports( 'title-tag' ) ) {
return;
}
echo '<title>' . wp_get_document_title() . '</title>' . "\n";
}
Aquí está el código de v5.4.2. Estos son los filtros que puede usar para manipular la etiqueta del título:
function wp_get_document_title() {
/**
* Filters the document title before it is generated.
*
* Passing a non-empty value will short-circuit wp_get_document_title(),
* returning that value instead.
*
* @since 4.4.0
*
* @param string $title The document title. Default empty string.
*/
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
return $title;
}
// --- snipped ---
/**
* Filters the separator for the document title.
*
* @since 4.4.0
*
* @param string $sep Document title separator. Default '-'.
*/
$sep = apply_filters( 'document_title_separator', '-' );
/**
* Filters the parts of the document title.
*
* @since 4.4.0
*
* @param array $title {
* The document title parts.
*
* @type string $title Title of the viewed page.
* @type string $page Optional. Page number if paginated.
* @type string $tagline Optional. Site description when on home page.
* @type string $site Optional. Site title when not on home page.
* }
*/
$title = apply_filters( 'document_title_parts', $title );
// --- snipped ---
return $title;
}
Así que aquí hay dos maneras en que puedes hacerlo.
El primero usa pre_get_document_title
filtro que cortocircuita la generación del título y, por lo tanto, tiene más rendimiento si no va a realizar cambios en el título actual:
function custom_document_title( $title ) {
return 'Here is the new title';
}
add_filter( 'pre_get_document_title', 'custom_document_title', 10 );
Usos de segunda vía document_title_separator
y document_title_parts
ganchos para el título y el separador de título que se ejecutan más tarde en la función, después de que el título se genera usando funciones como single_term_title
o post_type_archive_title
dependiendo de la página, y justo antes de que se emitan las etiquetas de título:
// Custom function should return a string
function custom_seperator( $sep ) {
return '>';
}
add_filter( 'document_title_separator', 'custom_seperator', 10 );
// Custom function should return an array
function custom_html_title( $title ) {
return array(
'title' => 'Custom Title',
'site' => 'Custom Site'
);
}
add_filter( 'document_title_parts', 'custom_html_title', 10 );
Agregue esto a sus funciones.php
function custom_wp_title($title) {
if ( is_404() ) {
$title="Custom 404 Title";
}
return $title;
}
add_filter( 'wp_title', 'custom_wp_title', 10, 2 );
10 – es un cambio de prioridad para sobrescribir otros complementos como SEO
-
wp_title() originalmente estaba en desuso en 4.4, pero se restableció
– tocas
4 de noviembre de 2016 a las 5:43
Estas seguro acerca de esto
global $plugin_title;
¿variable?– Khorshed Alam
4 de noviembre de 2016 a las 5:25
Totalmente. Se llama de otra manera, pero definitivamente está ahí.
– bugmagnet
4 de noviembre de 2016 a las 5:40