HostGator Promoção (728x60)

Breadcrumbs + Rich Snippets Sem Plugin

breadcrumbs e rich snippets

Neste artigo você vai aprender a colocar Breadcrumbs (Navegação Estrutural) ou Migalha de Pão sem usar plugins. De quebra, vai inserir Rich Snippets para permitir que a estrutura de páginas a pareça também nos resultados de buscas do Google, consequentemente deixado seu site muito mais amigável nos resultados. Essa é a melhor maneira de mostrar para o usuário e o Google como é a estrutura do site.

O que é breadcrump?

Pode se dizer que o breadcrump é o "caminho" percorrido pelo usuário até uma determinada página. Ele permite que o usuário localize a página que está acessando em meio a estrutura do site. É comum ser exibido na parte superior das páginas da internet.

breadcrumbs

O que é Rich Snippets?

O Rich Snippets são dados estruturados usados geralmente para permitir que os buscadores identifiquem informações relevantes dentro de um site. Os buscadores usam essas informações para aprimorar os resultados de buscas. Neste caso, os Rich Snippets são os responsáveis por permitir que o Google interprete e exiba o Breadcrumbs nos resultados de buscas.

rich snippets

O Código

Coloque o seguinte código no arquivo functions.php do seu tema:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* Retorna um Breadcrumbs da página atual
* @author Lucas Tavares <contato@wptotal.com.br>
* @global WP_Post $post
* @global int $author
* @param array $args Argumentos para personalizar o Breadcrumbs
* @return string Retorna o código HTML do Breadcrumbs
*/
 
function wp_custom_breadcrumbs($args = array()) {
global $post, $author;
 
$default = array(
'after' => '', //Valor impresso depois do breadcrumbs
'before' => '', //Valor impresso antes do breadcrumbs
'container' => 'div', //Container do breadcrumbs
'container_class' => 'breadcrumbs', //Classe do container
'container_id' => 'bcrumbs', //Id do container
'separator' => '&raquo;', //Seperador do items (páginas)
'display_404' => 'Página não encontrada', //Valor exibido para o erro 404
'display_home' => 'Home', //Valor exibido para Home Page (Página Inicial)
'display_search' => 'Resultado da busca por %1$s', //Valor exibido para o resultado de busca
'item_wrap' => '<span class="bcrumb-item" %1$s>%2$s</span>', //É o "Envelope" dos items
'rich_snippets' => true, //Ultiliza Rich Rnippets para os buscadores localizarem o breadcrumb
);
 
$args = array_merge($default, $args);
$args = (object) $args;
 
$items = array();
 
if (!in_array($args->container,array('div','nav','span','section')))
$args->container = 'div';
 
$container_before = sprintf("{$args->before}<{$args->container} %s id=\"{$args->container_id}\" "
. "class=\"{$args->container_class}\">", !$args->rich_snippets ? '' : 'xmlns:v="http://rdf.data-vocabulary.org/#"');
$container_after = "</{$args->container}>{$args->after}";
 
if ($args->display_home && (is_paged() || (!is_home() && !is_front_page())))
$items[] = array($args->display_home, get_home_url());
 
if (is_paged()) {
$items[] = array('Página '.get_query_var( 'paged' ));
}
else if (is_home() || is_front_page()) {
if ($args->display_home)
$items[] = array($args->display_home);
}
else if (is_search()) {
if ($args->display_search) {
$display = vsprintf($args->display_search, get_search_query());
$items[] = array($display);
}
}
else if (is_404()) {
if ($args->display_404)
$items[] = array($args->display_404);
}
else if (is_tag()) {
$items[] = array('Tag '.single_tag_title( '', false ));
}
elseif ( is_post_type_archive() ) {
$items[] = array(post_type_archive_title( '', false ));
}
else if (is_author()) {
$userdata = get_userdata($author);
$items[] = array('Postado por '.$userdata->display_name);
}
else if (is_category()) {
$cat = get_the_category();
$cats_ancestors = get_ancestors( $cat[0]->cat_ID, 'category' );
$cats_ancestors = array_reverse($cats_ancestors);
 
foreach ($cats_ancestors as $ancest_id) {
$parent = get_category($ancest_id, false);
$items[] = array($parent->name, get_category_link($parent));
}
 
$items[] = array($cat[0]->name);
}
else if (is_year()) {
$items[] = array(get_the_time( 'Y' ));
}
else if (is_month()) {
$items[] = array(get_the_time( 'Y' ), is_year() ? '' : get_year_link(get_the_time( 'Y' )));
$items[] = array(get_the_time( 'F' ));
}
else if (is_day()) {
$items[] = array(get_the_time( 'Y' ), get_year_link(get_the_time( 'Y' )));
$items[] = array(get_the_time( 'F' ), get_month_link(get_the_time( 'Y' ), get_the_time( 'm' )));
$items[] = array(get_the_time( 'd' ));
}
else if (is_single() || is_page()|| is_attachment()) {
$ancestors = get_post_ancestors($post->ID);
$cat = get_the_category((is_attachment() && !empty($ancestors)) ? $ancestors[0] : $post->category_id);
 
if (!empty($cat))
$items[] = array($cat[0]->name, get_category_link($cat[0]));
 
if (!empty($ancestors)) {
$ancestors = array_reverse($ancestors);
foreach ($ancestors as $post_id) {
$items[] = array(get_the_title($post_id), get_permalink($post_id));
}
}
$items[] = array($post->post_title);
}
 
if (empty($items)) //Não faz sentido mostrar apenas 1 item...
return '';
 
$items_output = array();
foreach ($items as $item) {
if (empty($item[0]))
continue;
 
if (isset($item[1])) { //Possui link?
$display = sprintf('<a href="%1$s" %2$s>%3$s</a>',$item[1], !$args->rich_snippets ? '' : 'rel="v:url" property="v:title"', $item[0]);
$item_html = sprintf($args->item_wrap, !$args->rich_snippets ? '' : 'typeof="v:Breadcrumb"', $display);
 
} else {
$item_html = sprintf($args->item_wrap, !$args->rich_snippets ? '' : 'typeof="v:Breadcrumb" property="v:title"', $item[0]);
}
$items_output[] = $item_html;
}
 
return $container_before.
implode('<span class="bcrumb-separator">'.$args->separator.'</span>', $items_output)
.$container_after;
}
/**
* Retorna um Breadcrumbs da página atual
* @author Lucas Tavares <contato@wptotal.com.br>
* @global WP_Post $post
* @global int $author
* @param array $args Argumentos para personalizar o Breadcrumbs
* @return string Retorna o código HTML do Breadcrumbs
*/

function wp_custom_breadcrumbs($args = array()) {
global $post, $author;

$default = array(
'after' => '', //Valor impresso depois do breadcrumbs
'before' => '', //Valor impresso antes do breadcrumbs
'container' => 'div', //Container do breadcrumbs
'container_class' => 'breadcrumbs', //Classe do container
'container_id' => 'bcrumbs', //Id do container
'separator' => '&raquo;', //Seperador do items (páginas)
'display_404' => 'Página não encontrada', //Valor exibido para o erro 404
'display_home' => 'Home', //Valor exibido para Home Page (Página Inicial)
'display_search' => 'Resultado da busca por %1$s', //Valor exibido para o resultado de busca
'item_wrap' => '<span class="bcrumb-item" %1$s>%2$s</span>', //É o "Envelope" dos items
'rich_snippets' => true, //Ultiliza Rich Rnippets para os buscadores localizarem o breadcrumb
);

$args = array_merge($default, $args);
$args = (object) $args;

$items = array();

if (!in_array($args->container,array('div','nav','span','section')))
$args->container = 'div';

$container_before = sprintf("{$args->before}<{$args->container} %s id=\"{$args->container_id}\" "
. "class=\"{$args->container_class}\">", !$args->rich_snippets ? '' : 'xmlns:v="http://rdf.data-vocabulary.org/#"');
$container_after = "</{$args->container}>{$args->after}";

if ($args->display_home && (is_paged() || (!is_home() && !is_front_page())))
$items[] = array($args->display_home, get_home_url());

if (is_paged()) {
$items[] = array('Página '.get_query_var( 'paged' ));
}
else if (is_home() || is_front_page()) {
if ($args->display_home)
$items[] = array($args->display_home);
}
else if (is_search()) {
if ($args->display_search) {
$display = vsprintf($args->display_search, get_search_query());
$items[] = array($display);
}
}
else if (is_404()) {
if ($args->display_404)
$items[] = array($args->display_404);
}
else if (is_tag()) {
$items[] = array('Tag '.single_tag_title( '', false ));
}
elseif ( is_post_type_archive() ) {
$items[] = array(post_type_archive_title( '', false ));
}
else if (is_author()) {
$userdata = get_userdata($author);
$items[] = array('Postado por '.$userdata->display_name);
}
else if (is_category()) {
$cat = get_the_category();
$cats_ancestors = get_ancestors( $cat[0]->cat_ID, 'category' );
$cats_ancestors = array_reverse($cats_ancestors);

foreach ($cats_ancestors as $ancest_id) {
$parent = get_category($ancest_id, false);
$items[] = array($parent->name, get_category_link($parent));
}

$items[] = array($cat[0]->name);
}
else if (is_year()) {
$items[] = array(get_the_time( 'Y' ));
}
else if (is_month()) {
$items[] = array(get_the_time( 'Y' ), is_year() ? '' : get_year_link(get_the_time( 'Y' )));
$items[] = array(get_the_time( 'F' ));
}
else if (is_day()) {
$items[] = array(get_the_time( 'Y' ), get_year_link(get_the_time( 'Y' )));
$items[] = array(get_the_time( 'F' ), get_month_link(get_the_time( 'Y' ), get_the_time( 'm' )));
$items[] = array(get_the_time( 'd' ));
}
else if (is_single() || is_page()|| is_attachment()) {
$ancestors = get_post_ancestors($post->ID);
$cat = get_the_category((is_attachment() && !empty($ancestors)) ? $ancestors[0] : $post->category_id);

if (!empty($cat))
$items[] = array($cat[0]->name, get_category_link($cat[0]));

if (!empty($ancestors)) {
$ancestors = array_reverse($ancestors);
foreach ($ancestors as $post_id) {
$items[] = array(get_the_title($post_id), get_permalink($post_id));
}
}
$items[] = array($post->post_title);
}

if (empty($items)) //Não faz sentido mostrar apenas 1 item...
return '';

$items_output = array();
foreach ($items as $item) {
if (empty($item[0]))
continue;

if (isset($item[1])) { //Possui link?
$display = sprintf('<a href="%1$s" %2$s>%3$s</a>',$item[1], !$args->rich_snippets ? '' : 'rel="v:url" property="v:title"', $item[0]);
$item_html = sprintf($args->item_wrap, !$args->rich_snippets ? '' : 'typeof="v:Breadcrumb"', $display);

} else {
$item_html = sprintf($args->item_wrap, !$args->rich_snippets ? '' : 'typeof="v:Breadcrumb" property="v:title"', $item[0]);
}
$items_output[] = $item_html;
}

return $container_before.
implode('<span class="bcrumb-separator">'.$args->separator.'</span>', $items_output)
.$container_after;
}

Como Usar o Código

O código abaixo deve colocado onde deseja que a migalha de pão seja exibida no tema.

1
2
3
4
5
6
7
8
9
10
11
12
// Mostra o breadcrumbs com rich snippets
echo wp_custom_breadcrumbs();
 
// Mostra o breadcrumbs sem rich snippets
echo wp_custom_breadcrumbs( array('rich_snippets' => false) );
 
//Alterando o texto mostrado para página inicial e 404.
$args = array(
'display_home'=>'Página Inicial',
'display_404'=>'Erro 404',
);
echo wp_custom_breadcrumbs( $args );
// Mostra o breadcrumbs com rich snippets
echo wp_custom_breadcrumbs();

// Mostra o breadcrumbs sem rich snippets
echo wp_custom_breadcrumbs( array('rich_snippets' => false) );

//Alterando o texto mostrado para página inicial e 404.
$args = array(
'display_home'=>'Página Inicial',
'display_404'=>'Erro 404',
);
echo wp_custom_breadcrumbs( $args );

Esse código eu utilizo em sites de vários clientes. Caso encontre algum problema, é só informar nos comentários.

5 Comentários para “Breadcrumbs + Rich Snippets Sem Plugin

    1. Carolina

    Ótimas dicas, os Breadcrumbs são muito importantes para quem usa SEO, pois ajuda e muito na verificação estruturada que os buscadores fazem no site.

    1. Rhuan

    $container_after = "container}>{$args->after}";

    $container_after = "container}>{$args->after}";

      1. Lucas Tavares
      2. (Autor do Post)

      Obrigado Rhuan,

      Parece que houve algum problema na hora de colocar ele aqui no artigo, mas agora já esta ok.

    1. patricia

    desculpa, mais qual dos código é para usar o de cima ou de baixo?

    eu ainda estou aprendendo deste já obrigada!

      1. Lucas Tavares
      2. (Autor do Post)

      Olá Patricia,

      Na verdade, é para usar os dois códigos. Um é o método em si, e o outro é um exemplo de como chamá-lo (no artigo explica o que é para fazer com cada um).

      Espero ter ajudado.

Deixe um comentário

(required)
(required)