Altera o the_title () de uma página dinamicamente

9

Estou desenvolvendo um plug-in que não usa um tipo de postagem personalizado, mas tabelas de banco de dados separadas. É um plugin que exibe uma lista de cursos com links que levam às diferentes páginas de detalhes do curso, onde o usuário pode se inscrever para um curso.

No estado atual, estou usando um shortcode para obter os dados dos plug-ins em uma página com um modelo de página personalizado (page-courses.php).

Agora quero alterar the_title() dinamicamente, de acordo com a página exibida pelo plug-in (lista de cursos, página de detalhes do curso com formulários, página de sucesso do envio do formulário). Mas sempre que faço isso com o seguinte filtro, os links para outras páginas no rodapé também mudam:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

Editar

No footer.php, tenho uma função que inclui links de rodapé com wp_nav_menu() , para que eu possa defini-los em Aparência > Menus Mas com o filtro acima, todos os links no rodapé também mudam para 'Custom Title'. Mas eu só quero mudar o título da página, não afetando links de menu no rodapé.

Tentando adicionar uma tag condicional in_the_loop() , os links de rodapé ainda são afetados, embora não estejam no 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 'Custom Title';
}

É semelhante a essa pergunta: filtra o problema do the_title no nav , apenas que os links afetados estão no rodapé e in_the_loop() não funciona.

Como posso alterar the_title() enquanto afeta apenas o título da página atual sendo mostrada não afetando links no rodapé ?

Editar 2 - Solução

Então eu finalmente consegui trabalhar:

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

O arquivo page-listcourses.php é um Custom Post Template que eu atribuí à página estática chamada 'Courses'.

Suponho que não funcionou antes porque o nome da página estática e o nome do arquivo do Modelo de postagem personalizado eram os mesmos.

    
por Gchtr 28.01.2013 / 22:39

4 respostas

4

Eu usaria o is_page_template() condicional:

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

Editar

Você usaria este condicional dentro de seu retorno de chamada 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' );

Agora, para isolar somente os títulos das páginas que usam seu modelo de página, você pode aproveitar o outro parâmetro passado para the_title : $id . Como você sabe o ID da postagem para a qual o título está sendo filtrado, é possível consultar a _wp_page_template post meta e garantir que ela seja igual ao seu modelo de 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

Se você deseja segmentar a página "Cursos" especificamente, use is_page() com a página slug 'courses' ou o título da página 'Courses' :

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

No entanto, eu recomendaria alterar page-courses.php para um Modelo de página personalizada , o que tornaria todo esse processo muito mais robusto.

    
por Chip Bennett 29.01.2013 / 16:09
1

Se você quiser apenas editar o título da página atual, use o in_the_loop() condicional, como em:

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;
}
    
por pixeline 08.11.2016 / 13:08
0

Tente usar tags condicionais para garantir que the_title() esteja sendo modificado apenas nas páginas desejadas.

    
por theMojoWill 29.01.2013 / 15:50
0

Enquanto is_page_template() funcionar, prefiro colocar esse tipo de código no próprio modelo de página para ter todo o código que gera esse tipo de página em um arquivo.

    
por Mark Kaplun 29.01.2013 / 17:58