Cambiar el_título () de una página dinámicamente


9

Estoy desarrollando un complemento que no usa un tipo de publicación personalizado, sino tablas de base de datos separadas. Es un complemento 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 código corto para obtener los datos de los complementos en una página con una plantilla de página personalizada (page-course.php).

Ahora quiero cambiar the_title()dinámicamente, de acuerdo con la página que muestra el complemento (lista de cursos, página de detalles del curso con formularios, página de envío de formulario exitoso). Pero cada vez que hago eso 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 'Custom Title';
}

Editar

En footer.php tengo una función que incluye enlaces de pie de página 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 de pie de página todavía se ven afectados, aunque no están en el bucle.

<?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 'Custom Title';
}

Es similar a esta pregunta: filtra el problema del título en la navegación , solo que los enlaces afectados están en el pie de página y in_the_loop()no funcionan.

¿Cómo puedo cambiar the_title()mientras solo afecta 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

Así que finalmente lo hice funcionar:

<?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 'Custom Title';
    }
    return $title;
}

El archivo page-listcourses.php es una plantilla de publicación personalizada que asigné a la página estática llamada 'Cursos'.

Supongo que no funcionó antes porque el nombre de la página estática y el nombre de archivo de la plantilla de publicación personalizada eran los mismos.


1
¿Por qué está rodando sus propias tablas de base de datos? Su vida sería mucho más simple si implementara su contenido personalizado como un Tipo de publicación personalizado .
Chip Bennett

En realidad pensé que vendría esta pregunta. Desarrollé este complemento para conocer Wordpress, por lo que primero no sabía sobre los tipos de publicaciones personalizadas. 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, por lo que las dos tablas están vinculadas. No creo que sea tan fácil lograrlo con los tipos de publicaciones personalizadas. Claro que podría usar Taxonomías personalizadas para los cursos, pero tendría que agregar más campos, porque una categoría de curso no solo tiene nombre. Solo por ahora es mucho más fácil hacerlo con tablas de bases de datos personalizadas.
Gchtr

1
Su caso de uso es el caso de uso exacto previsto para los tipos de publicaciones personalizadas y las taxonomías personalizadas. Puede estar subestimando la elegancia, la flexibilidad y el poder de los CPT y las taxonomías personalizadas.
Chip Bennett el

De hecho, es posible que lo haga. Probablemente debería intentarlo. Gracias por el consejo.
Gchtr

in_the_loop()está configurado para truecuando the_post()se dispara. Sin profundizar demasiado en el núcleo, y sabiendo que los menús de navegación son en sí mismos bucles , supongo que en algún lugar del camino, wp_nav_menu()crea una instancia de bucle y hace in_the_loop()que regrese true.
Chip Bennett

Respuestas:


5

Yo usaría el is_page_template()condicional:

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

Editar

Usaría este condicional dentro de su devolución de llamada de filtro:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Ahora, para aislar sólo los títulos de las páginas que utilizan la plantilla de página, usted puede tomar ventaja de otro parámetro que recibe the_title: $id. Como conoce el Id. De la publicación para la que se está filtrando el título, puede consultar el _wp_page_templatemeta de la publicación y asegurarse de que sea igual a la plantilla de su página:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

Editar 2

Si desea orientar específicamente la página "Cursos", úsela is_page()con la ficha de la página 'courses'o el título de la página de 'Courses':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Sin embargo, recomendaría cambiar page-courses.phpa una Plantilla de página personalizada , lo que haría que todo este proceso sea mucho más robusto.


Eso no funcionó por ahora. Pero refiné mi pregunta, porque podría no haber sido lo suficientemente específica. Quizás el problema yace en otro lado.
Gchtr

¿Qué quieres decir con " eso no funcionó por ahora "? ¿Qué intentaste exactamente ? ¿Qué esperaba que sucediera, que no sucedió o que sucedió inesperadamente?
Chip Bennett

Consulte la respuesta actualizada, que debería abordar los títulos de los elementos del menú de navegación.
Chip Bennett

Lo dije porque creo que su respuesta podría ser la correcta (presionando en la dirección correcta), pero que tal vez no hice mi pregunta lo suficientemente clara. get_post_meta( $id, '_wp_page_template', true )vuelve defaulty no sé qué hacer con esto. Cuando configuro 'page-course.php' en 'default', todos los enlaces de navegación cambian, excepto cuando engancho el the_titlefiltro loop_start, entonces solo cambian los enlaces de pie de página. Verifiqué qué archivo de plantilla se usa, y es 'page-course.php' y no 'page.php' (que pensé que podría ser el predeterminado).
Gchtr

Entonces, ¿es "Cursos" el nombre de su página estática?
Chip Bennett

1

Si solo desea editar el título de la página actual, use el in_the_loop()condicional, como en:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}


0

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


1
¿Cómo funcionaría eso, bajo el supuesto de que el código en cuestión usa the_title()? Ejemplos de código?
Chip Bennett el

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

Sí, en realidad yo también creo que esto funcionaría. Sin embargo, creo que tendría que tomar el desvío para establecer una variable en el complemento que estaría disponible en query_vars? Entonces, para mí, el filtrado the_titlees una mejor solución.
Gchtr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.