No se puede cambiar wp_title usando add_filter

12 feb 2011, 13:31:59
Vistas: 22.8K
Votos: 10

Tengo una página personalizada donde intento cambiar el título de la página.
La función se ejecuta, pero el título no cambia. Este es el código que estoy usando:

  add_filter('wp_title', set_page_title($brand));

  function set_page_title($brand) { 
    $title = 'Diseñador '.$brand['name'].' - '.get_bloginfo('name');
    //Aquí puedo hacer echo del resultado y ver que realmente se activa
    return $title;  
  } 

Entonces, ¿por qué no está funcionando? ¿Estoy usando add_filter incorrectamente?

1
Comentarios

Si solo deseas cambiar el título para una plantilla específica, creo que sería más apropiado llamar a tu función de título personalizado en lugar de wp_title en el marcado de la plantilla.

Steve Buzonas Steve Buzonas
27 dic 2011 21:51:50
Todas las respuestas a la pregunta 3
3
20

El filtro wp_title está obsoleto desde WordPress 4.4 (ver aquí). Puedes usar document_title_parts en su lugar

function custom_title($title_parts) {
    $title_parts['title'] = "Título de la Página";
    return $title_parts;
}
add_filter( 'document_title_parts', 'custom_title' );

En el filtro custom_title, $title_parts contiene las claves 'title', 'page' (la paginación, si existe), 'tagline' (el eslogan especificado, solo en la página de inicio) y 'site'. Configura "title" como prefieras. WordPress mantendrá tu formato configurado para luego concatenar todo junto.

Si deseas anular el formato de título de WordPress, entonces usa pre_get_document_title y proporciona a ese filtro una función que tome una cadena y devuelva el título que desees.

function custom_title($title) {
    return "Título de la Página";
}
add_filter( 'pre_get_document_title', 'custom_title' );
28 may 2016 07:09:03
Comentarios

wp_title ha sido restablecido. Siguiendo tu enlace de arriba, encontrarás el comentario: ACTUALIZACIÓN 12 de noviembre [2017] – wp_title ha sido restablecido hasta que se identifiquen usos alternativos y se defina un camino a seguir para ellos.

amurrell amurrell
27 oct 2018 02:20:49

Hasta julio de 2020, document_title_parts funcionó para mí mientras que wp_title no lo hizo.

GreatBlakes GreatBlakes
9 jul 2020 17:16:55

@GreatBlakes Este sigue siendo el caso en mi caso. Hasta marzo de 2022, document_title_parts funcionó para mí mientras que wp_title no lo hizo.

Clarus Dignus Clarus Dignus
25 mar 2022 02:08:56
3

No puedes pasar un array a set_page_title, el callback de los filtros solo acepta el título original como parámetro de entrada.

Si quieres que tu función funcione de esta manera, define el array $brand fuera de la función y hazlo global

  add_filter( 'wp_title', 'set_page_title' );
  $brand = array( 'name' => 'Nombre de la Marca' );

  function set_page_title( $orig_title ) { 
    global $brand;
    $title = 'Diseñador '.$brand['name'].' - '.get_bloginfo( 'name' );
    //Aquí puedo mostrar el resultado y ver que realmente se está ejecutando
    return $title;  
  }
12 feb 2011 15:16:19
Comentarios

Cuando hago esto, la función no se llama en absoluto. También probé add_filter('wp_title', 'set_page_title'); La única forma de llamar a la función es haciendo esto: add_filter('wp_title', set_page_title('test'));. ¿Alguna razón por la que no puedo llamar a la función de tu manera?

Steven Steven
13 feb 2011 15:01:38

Creo que sé por qué. ¿Podría ser que esté intentando usar add_filter dentro de custom_template.php y no en mi function.php?

Steven Steven
13 feb 2011 17:39:41

¡Debes colocar esta función en tu archivo function.php que está en el directorio de tu tema!

keatch keatch
13 feb 2011 18:22:29
0

Lo que está sucediendo en ambos ejemplos de código es que add_filter no está llamando a una función para aceptar un retorno como el nuevo título. La función add_filter espera al menos dos parámetros, el primero siendo una cadena que contiene el 'tag' o nombre del filtro que deseas usar, y el segundo es mixto. En el caso de usar una función definida, deberías usar el nombre de la función como una cadena, también puede aceptar un array para un callback dentro de un namespace, y una función anónima.

En el caso de:

add_filter('wp_title', set_page_title('test'));

La función más interna será evaluada primero, pasando sus resultados de retorno a la siguiente función externa.

Entonces...

add_filter('wp_title', set_page_title(other_function(function() {return "real_filter";})));

Pasaría la cadena 'real_filter' a add_filter asumiendo que todas las funciones entre las dos pasan sus parámetros de entrada como su valor de retorno.

Creo que lo que querrías sería algo como:

function my_title_filter($old_title, $sep, $seplocation) {
    // Añade algún código para determinar si/qué deseas cambiar tu título.

    global $brand;

    $title = "Designer " . $brand['name'] . " $sep " . get_bloginfo('name');

    return $title;
}

add_filter('wp_title', 'my_title_filter', 10, 3); // 10 es la prioridad,
    // y 3 es el número de argumentos que la función acepta.
    // wp_title puede pasar 3.

Una advertencia adicional... El filtro debe inicializarse antes de que se llame a apply_filters. Y la mejor práctica es tener tu función definida antes de llamar a add_filter.

27 dic 2011 21:49:28