Alterar dinamicamente o título () de uma página

9

Estou desenvolvendo um plug-in que não usa um tipo de postagem personalizado, mas separa tabelas de banco de dados. É um plug-in 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 em um curso.

No estado atual, estou usando um código de acesso para inserir os dados dos plugins em uma página com um modelo de página personalizado (page-cursos.php).

Agora eu quero mudar the_title()dinamicamente, de acordo com a página que o plug-in mostra (lista de cursos, página de detalhes do curso com formulários, página de êxito no envio de formulários). 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é 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 'Título personalizado'. Mas eu só quero mudar o título da página, sem afetar os links do menu no rodapé.

Tentando adicionar uma marca condicional, in_the_loop()os links do 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 esta pergunta: filtre o problema do título na navegação , apenas que os links afetados estão no rodapé e in_the_loop()não funcionam.

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

Edit 2 - Solution

Então eu finalmente consegui 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;
}

O arquivo page-listcourses.php é um modelo de postagem personalizado que eu atribuí à página estática denominada 'Cursos'.

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.

Gchtr
fonte
11
Por que você está rolando suas próprias tabelas de banco de dados? Sua vida seria muito mais simples se você implementasse seu conteúdo personalizado como um Tipo de postagem personalizado .
Chip Bennett
Na verdade, eu pensei que essa pergunta viria. Eu desenvolvi este plugin para conhecer o Wordpress, então eu não conhecia os tipos de postagem personalizados. Eu tenho duas tabelas de banco de dados, uma para os cursos e outra para as categorias de cursos. Uma categoria pode ter vários cursos, portanto as duas tabelas estão vinculadas. Não acho que seja fácil fazê-lo com tipos de postagem personalizados. Claro que eu poderia usar taxonomias personalizadas para os cursos, mas teria que adicionar mais campos, porque uma categoria de curso não tem apenas nome. Por enquanto, é muito mais fácil fazê-lo com tabelas de banco de dados personalizadas.
Gchtr
11
Seu caso de uso é o caso de uso exato e pretendido para Tipos de postagem personalizados e taxonomias personalizadas. Você pode estar subestimando a elegância, flexibilidade e poder dos CPTs e taxonomias personalizadas.
Chip Bennett
É realmente possível que eu faça. Eu provavelmente deveria apenas tentar. Obrigado pelo conselho.
Gchtr
in_the_loop()está definido como truesempre que the_post()é acionado. Sem me aprofundar muito no núcleo, e sabendo que os menus de navegação são eles mesmos loops , acho que em algum momento do processo wp_nav_menu()instancia um loop, causando o in_the_loop()retorno true.
precisa saber é o seguinte

Respostas:

5

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 esse condicional dentro do retorno de chamada do 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 apenas os títulos de páginas que usam o modelo de página, você pode tirar vantagem do outro parâmetro passado para the_title: $id. Como você conhece o ID da postagem para a qual o título está sendo filtrado, é possível consultar a _wp_page_templatemeta da postagem e garantir que seja igual ao modelo da sua 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 o slug 'courses'da página ou com 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 mudar page-courses.phppara um modelo de página personalizado , o que tornaria todo esse processo muito mais robusto.

Chip Bennett
fonte
Isso não funcionou por enquanto. Mas refinei minha pergunta, porque ela pode não ter sido específica o suficiente. Talvez o problema esteja em outro lugar.
Gchtr
O que você quer dizer com " que não funcionou por enquanto "? O que exatamente você tentou? O que você esperava que acontecesse, o que não aconteceu, ou o que aconteceu inesperadamente?
Chip Bennett
Consulte a resposta atualizada, que deve abordar os títulos dos itens do menu de navegação.
Chip Bennett
Eu disse isso porque acho que sua resposta pode ser a correta (empurrando na direção certa), mas talvez eu não tenha feito minha pergunta com clareza suficiente. get_post_meta( $id, '_wp_page_template', true )retorna defaulte não sei o que fazer com isso. Quando defino 'page-cursos.php' como 'padrão', todos os links de navegação são alterados, exceto quando eu conecto o the_titlefiltro loop_start, apenas os links de rodapé. Eu verifiquei qual arquivo de modelo é usado, e é 'page-cursos.php' e não 'page.php' (que eu pensei que poderia ser o padrão).
Gchtr
Então, "Cursos" é o nome da sua página estática?
precisa saber é o seguinte
1

Se você deseja editar apenas 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;
}
pixeline
fonte
0

Tente usar tags condicionais para garantir que the_title()apenas sejam modificadas nas páginas desejadas.

theMojoWill
fonte
0

Embora is_page_template()funcione, 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.

Mark Kaplun
fonte
11
Como isso funcionaria, assumindo que o código em questão usa the_title()? Exemplos de código?
Chip Bennett
@ChipBennett, não entendo a pergunta. Se ele precisar que o filtro seja aplicado apenas à página com um modelo específico, ele poderá colocar o mesmo código no modelo antes de chamar get_header().
precisa saber é o seguinte
Sim, na verdade eu também acho que isso funcionaria. No entanto, acho que teria que fazer um desvio para definir uma variável no plug-in que estaria disponível em query_vars? Então, para mim, a filtragem the_titleé uma solução melhor.
Gchtr