¿Hay alguna forma de sobrescribir la etiqueta <title> especificada en header.php?

26 feb 2015, 20:43:32
Vistas: 14.3K
Votos: 6

Primero, esto no es una pregunta sobre SEO ni sobre cambiar la etiqueta de título en todo el sitio. Si buscas en Google, verás que esas son todas las respuestas que aparecen.

Tenemos nuestro propio tema y tenemos control total sobre header.php. Sabemos cómo establecer el título. Actualmente se ve así:

<head>
    <title><?php wp_title(' | ', true, 'right'); bloginfo('name'); ?></title>
etc...

No, el problema es este. Para la mayoría de páginas queremos que el título se muestre como arriba. Es solo que nos hemos dado cuenta de que para un tipo de entrada personalizado específico (y su plantilla asociada) el título del CPT no debería mostrarse públicamente. Es solo para uso administrativo. Extraño, pero así es. No lo mostramos en ningún H1 de la plantilla, contenido, etc.

Pero sí aparece en el título.

Idealmente nos gustaría una forma de sobrescribir el título de header.php desde dentro de la plantilla, para especificar un título alternativo solo para este conjunto particular de páginas. ¿Es eso posible?

0
Todas las respuestas a la pregunta 5
1

Primero, vamos a cambiar tu <title> a

<title><?php wp_title(' | ', true, 'right'); ?></title>

Porque añadir al título de esa manera no es muy futurista, en su lugar es mejor usar un filtro para hacer cualquier modificación al título. Así que vamos a añadir (en functions.php):

add_filter('wp_title', 'my_custom_title');
function my_custom_title( $title )
{
    // Retorna mi título personalizado
    return sprintf("%s %s", $title, get_bloginfo('name'));
}

Luego, extendamos este práctico filtro de título para hacer lo que quieres lograr:

add_filter('wp_title', 'my_custom_title');
function my_custom_title( $title )
{
    if( is_singular("your_post_type"))
    {
        return ""; // Retorna vacío
    }
    // Retorna mi título personalizado
    return sprintf("%s %s", $title, get_bloginfo('name'));
}
26 feb 2015 21:45:47
Comentarios

+1. ¡¡Esto es genial!!

Adriana Hernández Adriana Hernández
12 abr 2019 19:06:36
0

Es posible que desees filtrar el título.

add_filter( 'wp_title', 'wpse179527_wp_title' );
function wpse179527_wp_title( $title ) {
  global $post;
  if ( is_single() && 'custom-post' == get_post_type( $post ) )
    return '';
  return $title;
}
26 feb 2015 21:22:32
1

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

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:

/**
 * Muestra la etiqueta de título con contenido.
 *
 * @ignore
 * @since 4.1.0
 * @since 4.4.0 Mejoró la salida del título reemplazando `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 puedes usar para manipular la etiqueta de título:

function wp_get_document_title() {
    /**
    * Filtra el título del documento antes de que sea generado.
    *
    * Pasar un valor no vacío cortocircuitará wp_get_document_title(),
    * devolviendo ese valor en su lugar.
    *
    * @since 4.4.0
    *
    * @param string $title El título del documento. Valor por defecto string vacío.
    */
    $title = apply_filters( 'pre_get_document_title', '' );
    if ( ! empty( $title ) ) {
        return $title;
    }
    // --- omitido ---
    /**
    * Filtra el separador para el título del documento.
    *
    * @since 4.4.0
    *
    * @param string $sep Separador del título del documento. Por defecto '-'.
    */
    $sep = apply_filters( 'document_title_separator', '-' );

    /**
    * Filtra las partes del título del documento.
    *
    * @since 4.4.0
    *
    * @param array $title {
    *     Las partes del título del documento.
    *
    *     @type string $title   Título de la página vista.
    *     @type string $page    Opcional. Número de página si está paginado.
    *     @type string $tagline Opcional. Descripción del sitio en la página de inicio.
    *     @type string $site    Opcional. Título del sitio cuando no es la página de inicio.
    * }
    */
    $title = apply_filters( 'document_title_parts', $title );
    // --- omitido ---
    return $title;
}

Así que aquí hay dos formas de hacerlo.

La primera usa el filtro pre_get_document_title que cortocircuita la generación del título y por lo tanto es más eficiente si no vas a hacer cambios en el título actual:

function custom_document_title( $title ) {
    return 'Aquí está el nuevo título';
}
add_filter( 'pre_get_document_title', 'custom_document_title', 10 );

La segunda forma usa los hooks document_title_separator y document_title_parts 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 está a punto de ser mostrado:

// La función personalizada debe devolver un string
function custom_seperator( $sep ) {
   return '>';
}
add_filter( 'document_title_separator', 'custom_seperator', 10 );

// La función personalizada debe devolver un array
function custom_html_title( $title ) {
   return array(
     'title' => 'Título Personalizado',
     'site'  => 'Sitio Personalizado'
    );
}
add_filter( 'document_title_parts', 'custom_html_title', 10 );
16 jun 2020 17:15:17
Comentarios

¡Gracias por esta respuesta tan detallada! Realmente funciona en WP en 2020, no pude hacer que las respuestas anteriores funcionaran.

JoLoCo JoLoCo
29 jul 2020 18:11:50
0

Combinando diferentes respuestas, esto es lo que funcionó para mí en WordPress v5.7.2 y mi tipo de entrada personalizado company. Pude sobrescribir fácilmente el título en la página de entradas personalizadas para agregar el Nombre de mi Sitio al final

function custom_document_title( $title ) {
    if( is_singular("company"))
    {
        return sprintf("%s - %s", $title, get_bloginfo('name'));
    }
    return $title; // Devolver el título por defecto en otros casos
}
add_filter( 'pre_get_document_title', 'custom_document_title', 99 );
22 may 2021 21:42:57
0

La versión anterior no funcionó para mí en WordPress 6.1.1 ya que devolvía un $title vacío. Esta versión devuelve el título de la página + el nombre del blog o cualquier texto personalizado que desees.

function custom_document_title( $title ) {
    global $post;
    $title = get_the_title($post);
    if( is_singular("event")){
        return sprintf("%s - %s", $title, 'Registro de Evento');
    } else {
        // Devuelve el título habitual de WordPress
        return sprintf("%s - %s", $title, get_bloginfo('name'));
    }
}
add_filter( 'pre_get_document_title', 'custom_document_title', 99 );
17 feb 2023 11:58:28