Como criar um CMS completo com CakePHP – Parte 8 – Gerando sitemap.xml e robots.txt Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 4 anos, 2 meses, 4 dias atrás.

Para garantir que seu site será bem indexado pelo Google você tem que seguir uma série de boas práticas, como criar um robots.txt e um sitemap.xml, o primeiro lista as páginas que podem ou não ser indexadas pelos buscadores e o segundo as páginas do site que existem atualmente, neste artigo vamos incrementar no nosso CMS um recurso que irá gerar esses dois arquivos para nós.

Embora o conceito de cada arquivo possa ser usado em separado, é extremamente útil que você tenha lido:

Ok, vamos lá:

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

O Controller

Bem nosso controller terá tres actions e um beforeFilter, as actions serão:

  • admin_index - Formulário de administração dos dados
  • robots - imprime o conteúdo do robots.txt e seta o cabeçalho para arquivo tipo txt
  • sitemap - imprime o xml indicando as páginas do site e informa o que o arquivo é um xml

O beforeFilter por sua vez vai apenas liberar o acesso ao robots e sitemap para usuários não logados.

Veja:

<?php class SeoController extends AppController{
    public $components = array('RequestHandler');
        public function beforeFilter(){
        $this->Auth->allow(array('robots','sitemap'));
    }

    function admin_index(){
        $this->Seo->id=1;
        if(!$this->Seo->exists())$this->Seo->create();
        if($this->request->is('post')||$this->request->is('put')):
            if($this->Seo->save($this->request->data)){
                $this->Session->setFlash(__('Configuração salva com sucesso!'),'sucesso');
            }else{
                $this->Session->setFlash(__('Configuração não pode ser salva!'),'erro');
            }
        else:
            $this->request->data=$this->Seo->read();
        endif;
    }

    public function robots(){
        $this->layout='ajax';

        $this->RequestHandler->respondAs('text');
        $this->Seo->id = 1;
        $this->set('retorno',$this->Seo->read());
    }
    public function sitemap(){
        $this->layout='ajax';
        $this->Seo->id = 1;
        $retorno = $this->Seo->read();
        if($retorno['Seo']['sitemap']=='NULL'):
            $sitemap=$retorno['Seo'];
        else:
            $this->loadModel('Pagina');
            $sitemap = $this->Pagina->find('all');
        endif;
        $this->set('sitemap',$sitemap);
        $this->RequestHandler->respondAs('xml');
    }
}

Note que estou usando o component RequestHandle, isso porque preciso informar que os arquivos serão um txt e um xml, além disso o sitemap verifica se tem alguma coisa informada no banco, se não ele mesmo se encarrega de gerar o xml para a view.

As views

As views são fáceis, basta criar os arquivos dentro de app/View/Seo:

admin_index.ctp

<?php echo $this->Session->flash(); ?>
<?php
    echo $this->Form->create('Seo',array('class'=>'form-horizontal'));
?>
<div class="row-fluid">
    <div class="span12">
        <legend>Configurações do site</legend>
    </div>
</div>
<div class="row-fluid">
    <div class="span12">
        <h4>SEO (Otimização para motores de busca)</h4>
        <?php
            echo $this->Form->input('robots',array('label'=>'Robots.txt'));
            echo $this->Form->input('sitemap',array('label'=>'Sitemap.xml','after'=>'<span class="help-block">Deixe em branco para gerar automáticamente!</span>'));
        ?>
    </div>
</div>
<div class="row-fluid">
    <div class="span12">
        <div class="btn-group">
            <?php
                echo $this->Form->button('Salvar',array('class'=>'btn btn-primary'));
                echo $this->Html->link(
                    'Cancelar',
                    array(
                        'action'=>'index'
                    ),
                    array('class'=>'btn'));
            ?>
        </div>
    </div>
</div>
<?php
echo $this->Form->end();
?>

robots.ctp

<?php echo($retorno['Seo']['robots'])?>

sitemap.ctp

<?php if(is_array($sitemap)):?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
    http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<?php foreach($sitemap as $value): ?>
<?php $value = $value['Pagina'];?>
<url>
    <loc><?php echo $this->Html->url('/', true).$value['slug'];?></loc>
    <priority><?php if($value['slug']=='home'||$value['slug']=='Home'){echo '1.000';}else{echo '0.500';};?></priority>
    <lastmod><?php 
            $modified = explode(' ',$value['modified']);
            echo $modified[0]; ?></lastmod>
    <changefreq>weekly</changefreq>
</url>
<?php endforeach; ?>
</urlset>
<?php else: ?>
<?php endif; ?>

Routeamento

Bom, então quer dizer que está pronto... não... note que apenas vai exibir se você acessar usando seo/robots e seo/sitemap e não é isso que queremos, tem que ficar disponível da forma como manda o figurino, robots.txt e sitemap.xml sem o seo/, mas isso é fácil.

Abra o seu routes.php em app/Config/routes.php e adicione isso antes de tudo:

Router::connect('/robots.txt', array('controller' => 'Seo', 'action' => 'robots'));
Router::connect('/sitemap.xml', array('controller' => 'Seo', 'action' => 'sitemap'));

Viu como que é prático gerar arquivos em outras extensões com CakePHP.

Por ultimo vamos acrescentar um link para as configurações de SEO no painel, abra o arquivo app/View/Elements/admin/header.ctp e acrescente isto após a linha 9, quando fecha o li do link para o perfil do usuário:

<li>
    <?php echo $this->Html->link(
    'SEO',
    array('admin'=>true,'controller'=>'Seo','action'=>'index'),
    array('escape'=>false));?>
</li>

Uma correção que quero postar aqui é quanto ao seu schema.php (app/Config/Schema/schema.php e app/Config/Schema/schema1.php) nele está setado um espaço enorme antes da segunda linha do robots.txt, fique a vontade para remover e também para acertar no seu painel de controle (http://sua-aplicacao/publichtml/admin/seo), mas pra ficar mais fácil vamos adicionar um link no painel de controle.

Aguarde o ultimo artigo, quando vamos criar o tema final do site com recursos de ajax.

Então este foi 8º artigo de 9 que ensina como construir um CMS completo com CakePHP.


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!