Cambiar the_title() de una página dinámicamente

28 ene 2013, 23:39:36
Vistas: 21K
Votos: 11

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.

5
Comentarios

¿Por qué estás creando tus propias tablas de base de datos? Tu vida sería mucho más sencilla si implementaras tu contenido personalizado como un Tipo de Entrada Personalizado.

Chip Bennett Chip Bennett
29 ene 2013 17:10:30

En realidad pensé que esta pregunta surgiría. Desarrollo este plugin para conocer WordPress, así que al principio no sabía acerca de los Tipos de Entrada Personalizados. Tengo dos tablas de base de datos, una para los cursos y otra para las categorías de cursos. Una categoría puede tener varios cursos, así que las dos tablas están vinculadas. No creo que sea tan fácil lograrlo con Tipos de Entrada Personalizados. Claro que podría usar Taxonomías Personalizadas para los cursos, pero tendría que añadir más campos, porque una categoría de curso no solo tiene nombre. Por ahora es mucho más fácil hacerlo con tablas de base de datos personalizadas.

Gchtr Gchtr
29 ene 2013 21:23:21

Tu caso de uso es exactamente el caso de uso previsto para los Tipos de Entrada Personalizados y las Taxonomías Personalizadas. Puede que estés subestimando la elegancia, flexibilidad y potencia de los CPTs y las Taxonomías Personalizadas.

Chip Bennett Chip Bennett
29 ene 2013 21:25:52

Es posible que lo haga. Probablemente debería intentarlo. Gracias por el consejo.

Gchtr Gchtr
29 ene 2013 21:30:09

in_the_loop() se establece en true cada vez que se ejecuta the_post(). Sin profundizar demasiado en el núcleo, y sabiendo que los menús de navegación son en sí mismos loops, supongo que en algún momento, wp_nav_menu() inicia un loop, haciendo que in_the_loop() devuelva true.

Chip Bennett Chip Bennett
30 ene 2013 16:22:06
Todas las respuestas a la pregunta 4
9

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.

29 ene 2013 17:09:43
Comentarios

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.

Gchtr Gchtr
30 ene 2013 15:46:35

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

Chip Bennett Chip Bennett
30 ene 2013 16:05:09

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

Chip Bennett Chip Bennett
30 ene 2013 16:31:43

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

Gchtr Gchtr
30 ene 2013 17:46:42

Entonces, ¿"Courses" es el nombre de tu página estática?

Chip Bennett Chip Bennett
30 ene 2013 18:24:30

Sí, ese es el nombre de la página estática.

Gchtr Gchtr
30 ene 2013 18:37:57

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

Chip Bennett Chip Bennett
30 ene 2013 18:51:07

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!

Gchtr Gchtr
30 ene 2013 19:11:27

Para referencia futura: recomiendo no nombrar las plantillas de página personalizadas como page-foobar.php, precisamente por esta razón. Yo uso template-foobar.php en su lugar.

Chip Bennett Chip Bennett
30 ene 2013 19:16:58
Mostrar los 4 comentarios restantes
3

Si bien is_page_template() funcionará, prefiero colocar este tipo de código en la plantilla de página en sí para tener todo el código que genera este tipo de página en un solo archivo.

29 ene 2013 18:58:58
Comentarios

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

Chip Bennett Chip Bennett
29 ene 2013 19:54:19

@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().

Mark Kaplun Mark Kaplun
29 ene 2013 21:25:09

Sí, en realidad yo también creo que esto funcionaría. Sin embargo, creo que tendría que dar un rodeo para establecer una variable en el plugin que estaría disponible en query_vars. Así que para mí, filtrar the_title es una solución más elegante.

Gchtr Gchtr
30 ene 2013 19:19:45
0

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;
}
8 nov 2016 14:08:32
0

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

29 ene 2013 16:50:06