Cambiar the_title() de una página dinámicamente
Estoy desarrollando un plugin que no utiliza un tipo de contenido personalizado, sino tablas separadas en la base de datos. Es un plugin que muestra una lista de cursos con enlaces que conducen a las diferentes páginas de detalles del curso, donde el usuario puede suscribirse a un curso.
En el estado actual, estoy usando un shortcode para obtener los datos del plugin en una página con una plantilla personalizada (page-courses.php).
Ahora quiero cambiar the_title()
dinámicamente, según la página que muestre el plugin (lista de cursos, página de detalles del curso con formularios, página de éxito del envío del formulario). Pero cuando lo hago con el siguiente filtro, los enlaces a otras páginas en el pie de página también cambian:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Título Personalizado';
}
Edición
En el footer.php tengo una función que incluye enlaces del pie de página con wp_nav_menu()
para poder definirlos en Apariencia > Menús. Pero con el filtro anterior, todos los enlaces en el pie de página también cambian a 'Título Personalizado'. Pero solo quiero cambiar el título de la página, sin afectar los enlaces del menú en el pie de página.
Intentando agregar una etiqueta condicional in_the_loop()
los enlaces del pie de página siguen siendo afectados, aunque no están en el loop.
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
if ( in_the_loop() ) {
add_filter( 'the_title', 'custom_page_title' );
}
}
function custom_page_title() {
return 'Título Personalizado';
}
Es similar a esta pregunta: problema con el filtro the_title en nav, solo que los enlaces afectados están en el pie de página y in_the_loop()
no funciona.
¿Cómo puedo cambiar the_title()
afectando solo el título de la página actual que se muestra sin afectar los enlaces en el pie de página?
Edición 2 - Solución
Finalmente lo conseguí funcionando:
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Título Personalizado';
}
return $title;
}
El archivo page-listcourses.php es una Plantilla de Entrada Personalizada que asigné a la página estática llamada 'Cursos'.
Supongo que no funcionaba antes porque el nombre de la página estática y el nombre del archivo de la Plantilla de Entrada Personalizada eran iguales.

Yo usaría el condicional is_page_template()
:
if ( is_page_template( 'page-courses.php' ) ) {
// La página actual usa tu
// plantilla de página personalizada;
// haz algo
}
Editar
Usarías este condicional dentro de tu función de callback del filtro:
function wpse83525_filter_the_title( $title ) {
if ( is_page_template( 'page-courses.php' ) ) {
return 'Título Personalizado';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Ahora, para aislar solo los títulos de las páginas que usan tu plantilla, puedes aprovechar el otro parámetro pasado a the_title
: $id
. Como conoces el ID del post cuyo título se está filtrando, puedes consultar el meta _wp_page_template
y asegurarte de que coincida con tu plantilla:
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Título Personalizado';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
Editar 2
Si quieres apuntar específicamente a la página "Cursos", usa is_page()
con el slug 'courses'
o el título de página 'Cursos'
:
function wpse83525_filter_the_title( $title ) {
if ( is_page( 'Cursos' ) ) {
return 'Título Personalizado';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Sin embargo, recomendaría cambiar page-courses.php
a una Plantilla de Página Personalizada, lo que haría este proceso mucho más robusto.

Eso no funcionó por ahora. Pero refiné mi pregunta, porque puede que no haya sido lo suficientemente específica. Tal vez el problema esté en otro lugar.

¿Qué quieres decir con "eso no funcionó por ahora"? ¿Qué exactamente intentaste? ¿Qué esperabas que pasara, que no sucedió, o qué ocurrió inesperadamente?

Mira la respuesta actualizada, eso debería solucionar los títulos de los elementos del menú de navegación.

Lo dije porque creo que tu respuesta podría ser la correcta (empujando en la dirección correcta), pero que tal vez no formulé mi pregunta con suficiente claridad. get_post_meta( $id, '_wp_page_template', true )
devuelve default
y no sé qué hacer con esto. Cuando configuro 'page-courses.php' como 'default', todos los enlaces de navegación cambian, excepto cuando engancho el filtro the_title
a loop_start
, entonces solo cambian los enlaces del pie de página. Verifiqué qué archivo de plantilla se usa, y es 'page-courses.php' y no 'page.php' (que pensé que podría ser el predeterminado).

Consulta la respuesta actualizada. Puedes apuntar a una página por su título o slug, usando is_page()
.

Ahora lo he conseguido funcionar. Mira la primera pregunta publicada para ver lo que hice. El archivo page-courses.php siempre fue una Plantilla de Página Personalizada. Supongo que antes no funcionaba porque el nombre de la página estática y el nombre del archivo de la Plantilla de Entrada Personalizada eran iguales. ¡Gracias por tus esfuerzos!

¿Cómo funcionaría eso, asumiendo que el código en cuestión utiliza the_title()
? ¿Ejemplos de código?

@ChipBennett, no entiendo la pregunta. Si necesita que el filtro se aplique solo para páginas con una plantilla específica, puede colocar el mismo código en la plantilla antes de llamar a get_header()
.

Si solo deseas editar el título de la página actual, utiliza el condicional in_the_loop()
, como en:
add_filter( 'the_title', 'modify_onpage_title', 10, 2);
function modify_onpage_title( $title , $id = null ) {
if(!in_the_loop()){
// retorna temprano si no es relevante (como en bucles de menús personalizados)
return $title;
}
// Modifica tu título
$title = "¡Yolo! ". $title;
return $title;
}

Intenta usar etiquetas condicionales para asegurarte de que the_title()
solo se modifique en las páginas que deseas.
