¿Cómo puedo cambiar el título en una página de WordPress?

5 minutos de lectura

avatar de usuario de bugmagnet
bugmagnet

Contexto: WordPress 5.4.5 y Yoast SEO 3.7.1

Soy un desarrollador de complementos que tiene acceso al sitio del cliente. El sitio tiene Yoast 3.7.1 instalado. ¿Es eso significativo, porque no importa lo que haga, no puedo cambiar la página 404? title?

Ahora, en otras páginas de Stack Overflow, 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 Página no encontrada – 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…

  • 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

Avatar de usuario de Khorshed Alam
Khorshed Alam

wp_title ha quedado 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 intentar 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 tarde.

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

avatar de usuario de snnsnn
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 utiliza el pre_get_document_title filtro que cortocircuita la generación del título y, por lo tanto, es más eficaz 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 );

La segunda forma utiliza el document_title_separator y document_title_parts ganchos para el título y el separador de título que se ejecutan más adelante 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

¿Ha sido útil esta solución?