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.
fonte
in_the_loop()
está definido comotrue
sempre quethe_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 processowp_nav_menu()
instancia um loop, causando oin_the_loop()
retornotrue
.Respostas:
Eu usaria o
is_page_template()
condicional:Editar
Você usaria esse condicional dentro do retorno de chamada do filtro:
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_template
meta da postagem e garantir que seja igual ao modelo da sua página: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'
:No entanto, eu recomendaria mudar
page-courses.php
para um modelo de página personalizado , o que tornaria todo esse processo muito mais robusto.fonte
get_post_meta( $id, '_wp_page_template', true )
retornadefault
e 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 othe_title
filtroloop_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).Se você deseja editar apenas o título da página atual, use o
in_the_loop()
condicional, como em:fonte
Tente usar tags condicionais para garantir que
the_title()
apenas sejam modificadas nas páginas desejadas.fonte
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.fonte
the_title()
? Exemplos de código?get_header()
.the_title
é uma solução melhor.