Cómo cambiar el separador en el título de WordPress
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? ]

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

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.

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.

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

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.

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