Modelos de Temas: Search.php

Modelos de Temas: Search.php

Nesta lição, vamos aprender a criar um modelo de template que é bastante usado em diversos temas do WordPress, o famoso search.php.

É ele que irá receber todas as pesquisas que seu visitante realiza dentro do seu tema, a fim de mostrar todos os conteúdos relacionados com os termos pesquisados.

Mas antes disso, você precisa aprender a criar um formulário de pesquisa no seu tema 🔎

Criando um formulário de pesquisa para o seu tema

Existem duas formas de se criar um formulário de pesquisa dentro do seu tema.

A primeira delas, envolve a importação de uma função do WordPress chamada de get_search_box().

Essa função irá adicionar o layout necessário para que haja um campo de texto atrelado a um botão de pesquisar.

Se você está comigo desde o início desta jornada, vai saber que dentro do arquivo header.php, não temos nenhuma estrutura que comporte uma área de busca.

Sem problema! Nós vamos resolver isso agora criando uma nova section logo abaixo de links-area, chamada de search-area:

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
 <head>
 <meta charset="<?php bloginfo('charset') ?>">
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <meta name="description" content="<?php bloginfo( 'description' ); ?>">
 <?php wp_head(); ?>
 </head>
 <body <?php body_class(); ?>>
 <header>
 <section class="logo-area">
 <img src="./logo.png" />
 </section>
 <section class="links-area">
 <?php wp_nav_menu(array(
 'theme_location' => 'wp_micilini_header_menu',
 'depth' => 1,
 )); ?>
 </section>
 <section class="search-area">
 <?php get_search_form(); ?>
 </section>
 </header>

O segundo método, envolve a criação manual de uma estrutura HTML, com um campo de texto onde contenha a tagname="s", junto a um formulário que leve o usuário para a URL principal do seu tema.

No meu caso, a URL principal do meu tema é esta: http://localhost/minha-primeira-aplicacao/

O resultado deve ficar mais ou menos assim:

<form role="search" method="get" id="searchform" class="searchform" action="http://localhost/minha-primeira-aplicacao/">
	<div>
		<label class="screen-reader-text" for="s">Pesquisar por:</label>
		<input type="text" value="" name="s" id="s">
		<input type="submit" id="searchsubmit" value="Pesquisar">
	</div>
</form>

É importante ressaltar que existe um problema quanto a inserir a URL do seu tema de maneira estática dentro do action do formulário, tal problema que veremos sua resolução mais a diante.

Você sabia que a função get_search_form() pode carregar um modelo de template chamado searchform.php, quando ele existe dentro da pasta raiz do seu tema?

Não, então vamos aprender a como fazer isso 🙃

Criando o searchform.php

Dentro da pasta raiz do seu tema, crie um novo arquivo chamado de searchform.php:

<form role="search" method="get" id="searchform" class="searchform" action="<?php echo esc_url(home_url('/')); ?>">
	<div>
		<label class="screen-reader-text" for="s">Pesquisar por:</label>
		<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s">
		<input type="submit" id="searchsubmit" value="Pesquisar">
	</div>
</form>

Como mostrado acima, temos um código comum de pesquisa feito em HTML, onde contém duas funções importantíssimas do WordPress, que são:

home_url('/'): Usado para retornar a URL principal do site onde o tema está instalado.

get_search_query(): Usado para retornar o valor pesquisado no campo de pesquisa. Isso faz com que o valor que você pesquisou, fique armazenado dentro do campo de texto.

Um ponto interessante, é o fato da tag action não estar estática (como apresentado no segundo método), pois caso um dia você instale esse tema em outro site do WordPress, você não precisaria ficar mudando o valor do action para a URL do site atual.

E você não quer ficar fazendo isso toda hora, não é verdade? Ou pior... falar para seu usuário fazer isso por você 🫣

Ainda falando sobre este modelo de template, é possível passar junto ao formulário, um campo de texto do tipo hidden, onde informa ao wordpress os tipos de posts que devem ser retornados na pesquisa:

<input type="hidden" value="post" name="post_type" id="post_type" /><!-- Para posts -->

<input type="hidden" name="page_type" value="page" /><!-- Para páginas -->

Ambos os inputs podem coexistir dentro de um mesmo formulário, ok?

Criando o Search.php

Dentro da pasta raiz do seu tema, vamos precisar criar um modelo de template que irá lidar com os resultados de pesquisa do nosso tema, o modelo é chamado de search.php:

<?php
/**
 * O template para exibir páginas de pesquisa.
 *
 * @link https://codex.wordpress.org/Template_Hierarchy
 *
 * @package WPMicilini
 * @since 1.0
 */

get_header(); 

?>

<!-- Insira os comandos necessários para buscar suas postagens -->

<?php
get_footer();
?>

Como podemos ver, o conteúdo inicial sempre começa com a abertura das tags PHP, onde inserimos algumas informações relevantes sobre o arquivo em formato de comentários, e é claro, importamos o cabeçalho e o rodapé por meio das funções get_header() e get_footer().

No local onde está escrito <!-- Insira os comandos necessários para buscar suas postagens -->, é onde faremos a mágica acontecer, inserindo um punhado de código, como estes que estamos vendo abaixo:

<div class="data-div">

<h1>Resultado Para: <?php echo get_search_query(); ?></h1>

<?php if ( have_posts() ) : ?>

<!-- Inicio Formulário de Pesquisa -->
<?php get_search_form(); ?>
<!-- Fim Formulário de Pesquisa -->

<!-- Inicio Carregamento de Posts -->
<?php while(have_posts()): the_post(); ?>
<article id="post-<?php the_ID();?>" <?php post_class(); ?>>
 <header>
 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
 <?php if( 'post' == get_post_type() ): ?>
 <div class="dados-info">
 <p>Postado em: <?php echo get_the_date(); ?> by <?php the_author_posts_link(); ?></p>
 <p>Categorias: <?php the_category( ' ' ); ?></p>
 <p>Tags: <?php the_tags( '', ', ' ); ?></p> 
 </div>
 <?php endif; ?>
 </header>
 <div class="dados-conteudo">
 <?php the_excerpt(); ?>
 </div>
</article>
<?php endwhile; ?>
<!-- Fim Carregamento de Posts -->

<!-- Fim Paginação do Conteúdo -->
<?php the_posts_pagination(); ?>
<!-- Fim Páginação do Conteúdo -->

<?php else : ?>
<p>Termos pesquisados não encontrados.</p>
<?php endif;?>

</div>

No comando acima, começamos definindo uma div que vai encapsular todo o conteúdo que será mostrado dali em diante.

Começamos fazendo a validação com a função have_posts(), para checar se existem postagens a serem mostradas relacionadas a pesquisa, caso negativo, a execução do código pula para o else, que por sua vez, mostra a mensagem: Termos pesquisados não encontrados.

No bloco [Formulário de Pesquisa], estamos seguindo uma recomendação do próprio WordPress, onde ele nos recomenda inserir um campo de busca também nesta página, mesmo que exista um campo de busca no header.php.

get_search_form(): Função responsável por importar o formulário de pesquisa existente no arquivo searchform.php.

No bloco [Carregamento de Posts], estamos usando as funções necessárias para carregar todas as informações relacionadas a aquele post.

the_ID(): Função usada para retornar o ID relacionado aquela postagem.

post_class(): Retorna o formato de conteúdo daquela postagem, aqui ele vai adicionar automaticamente classes como "post""type-post" (para postagens padrão), "category-nome-da-categoria" (para a categoria da postagem), "tag-nome-da-tag" (para cada tag da postagem) e outras classes relevantes.

É utilizada para adicionar classes CSS a um elemento que exibe uma postagem no loop de postagens, permitindo a flexibilização e estilização da tag HTML.

the_permalink(): Função usada para retornar o link que vai direto ao Post. Ou seja, leva o usuário para a página de single.php.

the_title(): Função usada para retornar o título do Post.

get_the_date(): Função usada para retornar a data da publicação do Post.

the_author_posts_link(): Função usada para exibir um link para a página do autor que contém uma lista de todas as postagens publicadas por um autor específico. Ou seja, leva o usuário para a página de author.php.

the_category(): Função que retorna todas as categorias daquele post.

the_tags(): Função que retorna todas as tags daquele post separadas por vírgulas.

the_excerpt(): Função que retorna uma pequena descrição relacionada a aquele post.

No bloco [Paginação do Conteúdo], estamos fazendo o uso do comando the_posts_navigation(), que é usada para exibir a navegação entre as páginas de postagens, quando há mais de uma página de resultados em um conjunto de postagens.

Veja como ficou o resultado final do arquivo search.php:

<?php
/**
 * O template para exibir páginas de pesquisa.
 *
 * @link https://codex.wordpress.org/Template_Hierarchy
 *
 * @package WPMicilini
 * @since 1.0
 */

get_header(); 

?>

<div class="data-div">

<h1>Resultado Para: <?php echo get_search_query(); ?></h1>

<?php if ( have_posts() ) : ?>

<!-- Inicio Formulário de Pesquisa -->
<?php get_search_form(); ?>
<!-- Fim Formulário de Pesquisa -->

<!-- Inicio Carregamento de Posts -->
<?php while(have_posts()): the_post(); ?>
<article id="post-<?php the_ID();?>" <?php post_class(); ?>>
 <header>
 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
 <?php if( 'post' == get_post_type() ): ?>
 <div class="dados-info">
 <p>Postado em: <?php echo get_the_date(); ?> by <?php the_author_posts_link(); ?></p>
 <p>Categorias: <?php the_category( ' ' ); ?></p>
 <p>Tags: <?php the_tags( '', ', ' ); ?></p> 
 </div>
 <?php endif; ?>
 </header>
 <div class="dados-conteudo">
 <?php the_excerpt(); ?>
 </div>
</article>
<?php endwhile; ?>
<!-- Fim Carregamento de Posts -->

<!-- Fim Paginação do Conteúdo -->
<?php the_posts_pagination(); ?>
<!-- Fim Páginação do Conteúdo -->

<?php else : ?>
<p>Termos pesquisados não encontrados.</p>
<?php endif;?>

</div>

<?php
get_footer();
?>

Como acessar a página de pesquisa

Para acessar a página de pesquisa como um visitante, basta abrir qualquer página do seu tema, inserir no campo de busca o termo e clicar no botão de [Pesquisar].

Automaticamente você será direcionado a página de search.php  (/?s=termo), com os possíveis posts que foram encontrados.

Variações do search.php

Sim, o search.php assim como outros modelos de temas, também conta com algumas variações, vejamos cada uma delas a seguir:

search-{term}.php: Permite que você crie modelos personalizados para resultados de pesquisa associados a termos de pesquisa específicos. Por exemplo: search-banana.php, que será carregado quando o usuário escrever banana na pesquisa.

search-{search_type}.php: Permite que você crie modelos personalizados para resultados de pesquisa associados ao tipo de busca realizada. Por exemplo: search-products.php para resultados de pesquisa específicos de produtos.

search-{post_type}.php: Permite que você crie modelos personalizados para resultados de pesquisa associados com o formato de post. Por exemplo: search-movies.php para resultados de pesquisa específicos de filmes.

É importante ressaltar que ao usar as variações ditas acima, o WordPress automaticamente vai reconhecer esses modelos específicos ao exibir postagens buscadas.

Caso não exista tais arquivos, o wordpress seguirá a hierarquia de modo a abrir o arquivo mais genérico que é o search.php.

E caso ele não exista, o wordpress vai parar no index.php.

Conclusão

Nesta lição você aprendeu sobre o modelo de tema search.php e suas variações.

Até a próxima 😁