Cómo cambiar el separador en el título de WordPress

21 sept 2015, 11:41:28
Vistas: 19.4K
Votos: 9

Cambiar el separador del título.

Estoy trabajando con el tema inicial Underscores. Quiero hacer un pequeño cambio en el título. Cambiar el separador de "Título del post | nombre del sitio" a "Título del post - nombre del sitio"

La forma sencilla de hacer esto era poner:

<title><?php wp_title('-', true, 'right' ); ?><?php bloginfo( 'name' ); ?></title>

en el encabezado.

Pero ahora leí que con la introducción de add_theme_support( 'title-tag' ); uno no debería usar la etiqueta <title> en el encabezado.

¿Existe una forma sencilla de cambiar el separador en el título?

Por qué esta pregunta es diferente de otras similares: Esto trata realmente sobre las mejores prácticas, desde la introducción de add_theme_support( 'title-tag' ); y cómo usarlo y modificarlo, ya que se supone que ya no debemos usar la etiqueta <title> en el encabezado.

[ Realmente espero no tener que escribir 8 líneas de código para hacer un cambio tan pequeño. Si decido finalmente usar la etiqueta <title> como una solución más directa, ¿debería comentar/eliminar el add_theme_support( 'title-tag' ); de functions.php? ]

1
Comentarios
Todas las respuestas a la pregunta 2
6
20

ACTUALIZACIÓN para WordPress 4.4

Desde WordPress 4.4 el filtro wp_title no funciona porque la función wp_title() ya no se usa en el núcleo. Esa función fue marcada como obsoleta, luego reinstaurada hasta nuevo aviso, pero se desaconseja a los autores de temas que la usen. Por eso, el filtro wp_title seguirá funcionando si continúas usando la función wp_title() directamente en tu tema, pero no es recomendable.

Hay nuevos filtros para personalizar el título del documento cuando el tema tiene soporte para title-tag:

  1. pre_get_document_title
  2. document_title_parts
  3. document_title_separator.

Como solo quieres personalizar el separador, puedes usar document_title_separator de la siguiente manera:

add_filter( 'document_title_separator', 'cyb_document_title_separator' );
function cyb_document_title_separator( $sep ) {

    $sep = "-";

    return $sep;

}

Respuesta anterior

Puedes usar el filtro wp_title para personalizar la etiqueta <title>.

add_filter( 'wp_title', 'customize_title_tag', 10, 3 );
function customize_title_tag( $title, $sep, $seplocation ) {


    // Personaliza $title aquí.
    // Ejemplo tomado de https://generatepress.com/forums/topic/title-tag-separator/
    $title = str_replace( '|', '-', $title );

    return $title;

}

Un ejemplo más complejo de cómo usar este filtro (tomado del tema TwentyTwelve):

function twentytwelve_wp_title( $title, $sep ) {
    global $paged, $page;

    if ( is_feed() )
        return $title;

    // Añade el nombre del sitio.
    $title .= get_bloginfo( 'name' );

    // Añade la descripción del sitio para la página de inicio/frontal.
    $site_description = get_bloginfo( 'description', 'display' );
    if ( $site_description && ( is_home() || is_front_page() ) )
        $title = "$title $sep $site_description";

    // Añade un número de página si es necesario.
    if ( $paged >= 2 || $page >= 2 )
        $title = "$title $sep " . sprintf( __( 'Página %s', 'twentytwelve' ), max( $paged, $page ) );

    return $title;
}
add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 );
21 sept 2015 12:14:15
Comentarios

Gracias. Lo revisé. El problema es que TwentyTwelve no utiliza add_theme_support( 'title-tag' ); que por cierto ahora es requerido como mejor práctica. Usa su propia función y <title></title?> en el header.php (lo cual ya no está permitido). Y esta función específica no cambia el separador, según creo.

IXN IXN
21 sept 2015 13:19:26

Era solo un ejemplo de cómo puedes usar el filtro wp_title para personalizar la salida de la etiqueta de título, no importa si el tema soporta title-tag o usa la función wp_title(), el filtro funciona para ambos casos.

cybmeta cybmeta
21 sept 2015 14:16:15

La respuesta de @IXN ha sido actualizada para WordPress 4.4

cybmeta cybmeta
17 dic 2015 11:47:13

wp_title() no está obsoleta, fue restablecida hasta nuevo aviso. Sí, ya no se recomienda su uso, pero no está obsoleta.

Pieter Goosen Pieter Goosen
17 dic 2015 12:13:14

Ah, sí, fue restablecida, no lo sabía. Pero, de todos modos, el filtro wp_title no funciona si no usas la función wp_title() directamente.

cybmeta cybmeta
17 dic 2015 13:25:50

Respuesta actualizada nuevamente con información más precisa. Gracias Pieter por señalar que wp_title() fue restablecida.

cybmeta cybmeta
17 dic 2015 13:38:52
Mostrar los 1 comentarios restantes
0

La generación del título del documento ha cambiado desde WordPress v4.4.0. Ahora wp_get_document_title determina cómo se genera el título:

/**
 * Muestra la etiqueta del 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 la versión 5.4.2. Estos son los filtros que puedes usar para manipular la etiqueta del título:

function wp_get_document_title() {
    /**
    * Filtra el título del documento antes de generarse.
    *
    * Pasar un valor no vacío interrumpirá 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 cadena vacía.
    */
    $title = apply_filters( 'pre_get_document_title', '' );
    if ( ! empty( $title ) ) {
        return $title;
    }
    // --- fragmento 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 está en la página de inicio.
    * }
    */
    $title = apply_filters( 'document_title_parts', $title );
    // --- fragmento omitido ---
    return $title;
}

Así que aquí hay dos formas de hacerlo.

La primera usa el filtro pre_get_document_title que interrumpe 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 del 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 mostrarse:

// La función personalizada debe devolver una cadena
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:26:54