add_filter(‘wp_title’) no reemplaza mi etiqueta de título (complemento de WordPress)

5 minutos de lectura

Estoy intentando cambiar el título de mi página de detalles por el nombre del coche. Creé un complemento que llena la página de detalles con la información del automóvil. Pero ahora no puedo hacer que add_filter(‘wp_title’) funcione en mi complemento.

Aquí está el código que probé:

function init() {
    hooks();
}
add_action('wp', 'init');

function hooks() {
    if(get_query_var('car_id') != "") {
        add_filter('wp_title', 'addTitle', 100);
        add_action('wp_head', 'fillHead');
    }
    add_shortcode('showCar', 'showCar');
}

function addTitle() {
    $api_url_klant = API_URL . '/gettitle/' . get_option("ac") . "https://stackoverflow.com/" . get_query_var('car_id');
    $title = getJSON($api_url_klant);
    return $title['merk'] . " " . $title['model'] . " - " . $title['bedrijf'];
}

La función addTitle() funciona bien. Devuelve el nombre correcto. También funciona add_action(‘wp_head’). Solo no puedo hacer que el filtro wp_title no funcione.

¿Estoy ejecutando este filtro en el momento equivocado o qué estoy haciendo mal?

Si alguien más tiene problemas con esto, puede deberse al complemento Yoast. Usar:

add_filter( 'pre_get_document_title', function( $title ){
    // Make any changes here
    return $title;
}, 999, 1 );

  • Para sortear los filtros de título de Yoast pero mantener los beneficios de document_title_partstambién podemos devolver una cadena vacía en el wpseo_title filtrar: add_filter('wpseo_title', '__return_empty_string'); Eso parece hacer que Yoast recurra al título nativo de WordPress.

    – joemaller

    14/02/2017 a las 20:39

avatar de usuario
daniel c

No puedo decirlo por el código que ha proporcionado, pero está usando:

<title><?php wp_title(); ?></title>

en tus <head>en header.php?

ACTUALIZAR

Aparentemente, se realizó un cambio en la forma en que se manejan los títulos a partir de 4.4. Aquí hay un enlace que explica cómo usar el nuevo código:

https://www.developersq.com/cambiar-página-post-título-wordpress-4-4/

/*
 * Override default post/page title - example
 * @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.
 * }
 *     @since WordPress 4.4
 *     @website: www.developersq.com
 *     @author: Aakash Dodiya
*/
add_filter('document_title_parts', 'dq_override_post_title', 10);
function dq_override_post_title($title){
   // change title for singular blog post
    if( is_singular( 'post' ) ){ 
        // change title parts here
        $title['title'] = 'EXAMPLE'; 
    $title['page'] = '2'; // optional
    $title['tagline'] = 'Home Of Genesis Themes'; // optional
        $title['site'] = 'DevelopersQ'; //optional
    }

    return $title; 
}

  • Creo que sí. Eso es lo que en el tema estándar de wordpress, ¿verdad? Está en un complemento, por lo que se debe reemplazar cada tipo de título

    – Wouter den Ouden

    18 de marzo de 2016 a las 15:28


  • Parece ser en veinticuatro, pero no lo veo en veintiquince o veintiséis. Nunca uso temas predeterminados de WP, así que no estoy seguro… pero he usado un código similar al que tienes tú docenas de veces. Siempre me aseguro de que wp_title() se llame manualmente… Agréguelo y vea si las cosas cambian.

    – Daniel C.

    18/03/2016 a las 15:31

  • Debería funcionar desde el complemento porque se usará en muchos sitios. Así que no quiero cambiar nada en el tema.

    – Wouter den Ouden

    18/03/2016 a las 15:32

  • Actualicé mi respuesta para reflejar el nuevo método de título de WordPress.

    – Daniel C.

    18 de marzo de 2016 a las 15:47

  • Para cualquier otra persona que llegue aquí después de intentar cambiar esto, tenga en cuenta que el eslogan (descripción del sitio) es no poner en el título por defecto. Lo entendí fácilmente usando esta respuesta y configurando $title['tagline'] = get_bloginfo('description');.

    – Stephan Samuel

    10 mayo 2019 a las 17:21

avatar de usuario
snnsnn

Publiqué esta respuesta a otra pregunta, pero dado que es relevante y más actualizada, pensé que podría ser útil.

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 a punto de salir:

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

He rastreado todas y cada una de las soluciones en la web probando cientos de ejemplos.

Al final… Bien hecho joemaller ¡Como poner esto primero resolvió todo!

add_filter('wpseo_title', '__return_empty_string');

¿Ha sido útil esta solución?