No se puede cambiar wp_title usando add_filter
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?

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

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.

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

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

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?

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
?

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.
