Meu Sitemap Dinâmico para Wordpress

publicidade
Gostou? Curta e Compartilhe!
Email this to someone
email
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter

Desde que coloquei meu site no ar, venho fazendo meu tema (WordPress) aos poucos e conforme vou usando, vou percebendo que deixei de fazer alguma coisa nele. Acho que é da idade. A “descoberta” da vez foi que esqueci de disponibilizar um Sitemap. Aquele arquivinho XML que tem todas as url’s do nosso site, que queremos que os mecanismos de busca encontrem. Logo pensei em baixar um plugin já prontinho para fazer a função, porém como tenho o meu plugin da Biblia e quero que as ulr’s dos livros sejam todas indexada, preferi criar uma função no meu tema para realizar a tarefa.

Para começar criei uma WP_query usando os filtros que vão buscar na tabela ‘posts’ as publicações que eu quero que sejam listadas. No meu caso os tipos ‘post’ e ‘page’ que tenham o status ‘publish’. O WordPress por padrão retorna 10 postagens, mas eu preciso listar todas, então acrescentei mais um argumento, o ‘posts_per_page’, para forçar a entrega de todas as postagens que atendam as condições apresentadas. Atribuir o valor -1 a este argumento fará o WordPress retornar todas as postagens. A WP_query ficou assim:

function meu_Sitemapp(){

  # declaramos a variável global $wp_query para que possamos usá-la dentro da função
  global $wp_query;

  # definimos os argumentos para sejam retonados todas as postagens e páginas publicadas.
  $args = array(
    'post_status' => 'publish',
    'post_type'   => array('post','page'),
    'posts_per_page' => -1
  );

  # criamos a nossa query com os argumentos deefinidos.
  $query_data = new WP_Query( $args );

Neste ponto a função, já realiza a varredura da tabela posts, pegando o que solicitamos e nos devolvendo tudo em um objeto. Como Só precisamos das postagens, vamos pegar esse conteúdo e colocar na variável $posts, então fazemos um loop nela para preparamos os dados que serão incluídos no arquivo. Ao final do loop restauramos a query ao seu estado padrão.

  # pegamos só o conteúdo dos posts e jogamos na nossa variável post.
  $posts = $query_data->posts; 

  # agora fazemos um loop em $posts para arrumar o conteudo que vai ser inserido no nosso sitemap.
  foreach ( $posts as $key => $post ) {   

    $date = new DateTime( $post->post_modified_gmt );
    $date = $date->format('Y-m-d');

    $sitemap_data[] = array(
      'url_loc'=> home_url('/' . $post->post_name),      
      'url_lastmod'=> $date,
    );

  }

  # Resetamos a WP_query para o seu padrão.
  wp_reset_postdata();

Agora precisamos converter o objeto $posts em um arquivo XML válido, para enviarmos aos mecanismos de busca. Um XML para sitemaps apresenta a aparência abaixo:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>http://exemplo.ex</loc>
		<lastmod>2020-08-10</lastmod>
		<changefreq>weekly</changefreq>
	</url>
</urlset>

Vamos usar a extensão DOMDocument, do PHP que permite a criação e manipulação de arquivos XML, para gerarmos nosso sitemap. Primeiro criaremos o cabeçalho, em seguida o nó principal. Depois adicionaremos os nós filhos com as informações das nossa url’s.

  # Usamos a extensão DOMDocument para criar nosso arquivo XML.
  $sitemap = new DOMDocument;

  $sitemap->formatOutput = true;
  
  $root = $sitemap->createElement("urlset");
  $sitemap->appendChild($root);
   
  $root_attr = $sitemap->createAttribute('xmlns'); 
  $root->appendChild($root_attr); 

  $root_attr_text = $sitemap->createTextNode('http://www.sitemaps.org/schemas/sitemap/0.9'); 

  $root_attr->appendChild($root_attr_text); 
  
  foreach( $sitemap_data as $key => $post_info ){

      extract($post_info);

      $url = $sitemap->createElement("url");
      $root->appendChild($url);
      
      $loc = $sitemap->createElement("loc");
      $url->appendChild($loc);
      $url_text = $sitemap->createTextNode($url_loc);
      $loc->appendChild($url_text);

      $lastmod = $sitemap->createElement("lastmod");
      $url->appendChild($lastmod);
      $lastmod_text = $sitemap->createTextNode($url_lastmod);
      $lastmod->appendChild($lastmod_text);


      $changefreq = $sitemap->createElement("changefreq");      
      $url->appendChild($changefreq);
      $changefreq_text = $sitemap->createTextNode("weekly");
      $changefreq->appendChild($changefreq_text);
      
  }

Agora precisamos salvar o arquivo na raiz do nosso site.

  # salvamos todo o conteudo em um arquivo na raiz do site.
  $sitemap->save( ABSPATH . 'sitemap.xml');

Prontinho, executando nossa função, o nosso sitemap já ficará disponível na raiz do site para ser utilizado pelos mecanismos de busca. Só tem um problema, sempre que criarmos uma nova postagem teremos que executar a função novamente manualmente para que o sitemap seja atualizado. Pra resolver isso vamos automatizar o processo. Vamos associar nossa função ao hook publish_post que é executado quando uma nova postagem é publicada.

# para automatizar o processo associamos nossa função ao hook 'publish_post' do WordPress para que ela seja executada toda vez que um post for publicado.
add_action('publish_post', 'meu_Sitemap');

Agora sim!! Sempre que adicionarmos novos conteúdos ao nosso blog, nosso sitemap será atualizado automaticamente.

Comente!

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *