Concentrato di best practices relative alla seo “on site”. Si parla di indicizzazione, linking interno,status code e microformati e di tanti piccoli accorgimenti che possono portare grandi risultati. Ogni consiglio è accompagnato da diversi snippet di codice
Professional WordPress Development with Vagrant - Andrea Cardinali - WordCam...
5 consigli SEO da tenere a mente durante lo sviluppo di temi e plugin @ WpCamp Bologna 2013
1. 5 Regole SEO da tenere a mente nello
sviluppo di temi e plugin Wordpress
di ANDREA CARDINALI
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013
@WORDCAMPBOLOGNA # WPCAMPBO13
2. SI DICE CHE LA SEO E’ MORTA…
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
3. #1: LA SEO NON MORIRA’ MAI
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
4. #2 LINKING INTERNO E INDICIZZAZIONE
LINKING INTERNO
FONTE: http://www.linkdex.com/blog/page-rank-and-link-juice-explained/
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
5. #2 LINKING INTERNO E INDICIZZAZIONE
LINKING INTERNO
In generale evitare di avere troppi link su una pagina.
Cosa evitare:
• Tag cloud nel footer (effettuare una selezione dei tag)
• Paginazione elevata
Cercate di distribuire al meglio il link juice.
Cosa fare:
• Utilizzare i breadcrumbs
• Link sitewide alla mappa del sito
• Linkare le pagine con ancor text differenti
• Se nella pagina sono presenti più link alla stessa risorsa, verificare che il link che
si trova più in alto nella pagina (nel codice sorgente) abbia un anchor text
ottimizzato (es. Titolo post + leggi tutto)
• Noindex, follow nelle pagine superiori alla prima
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
6. #2 LINKING INTERNO E INDICIZZAZIONE – ROBOTS.TXT
ROBOTS.TXT
File virtuale gestito in automatico da WP (Non inserirlo nella web root)
Aggiungere regole al robots.txt
add_filter(‘robots_txt’,’crd_blocca_file’,999,1);
function crd_blocca_cartella_plugin($output)
{
$site_url = parse_url( site_url() );
$path = ( !empty( $site_url['path'] ) ) ? $site_url['path'] : '';
$output .= "Disallow: $path/filedabloccare.phpn";
return $output;
}
User-agent: *
Disallow: /filedabloccare.php
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
7. #2 LINKING INTERNO E INDICIZZAZIONE – META ROBOTS
GESTIONE meta name=‘robots’
Se non specificato lo spider considera la pagine come INDEX, FOLLOW
NOINDEX, NOFOLLOW
• i link presenti all’interno della pagina non vengono seguiti
• tutto ciò che non vogliamo compaia nei risultati di ricerca
NOINDEX, FOLLOW
• la pagina non compare nei risultati di ricerca ma i risultati sì*
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
8. #2 LINKING INTERNO E INDICIZZAZIONE – META ROBOTS
GESTIONE meta name=‘robots’
Aggiungere il <meta name=‘robots’> nell’ <head>
add_action( 'wp_head',crd_custom_meta',999 );
function crd_custom_meta() {
echo "<meta name='robots' content='noindex,follow' />n";
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8" />
<meta name='robots' content='noindex,follow' />
http://support.google.com/webmasters/bin/answer.py?hl=it&answer=93710
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
9. #2 LINKING INTERNO E INDICIZZAZIONE – META ROBOTS
GESTIONE meta name=‘robots’
Bloccare indicizzazione tramite Header X-Robots-Tag
<?php
@header( 'Content-Type: text/html; charset=' . get_option(
'blog_charset' ) );
@header( 'X-Robots-Tag: noindex' );
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
10. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
RISPOSTE HTTP (STATUS CODE) CORRETTE
200 - OK
302 – Found
301 – Moved Permanently
404 – Not Found
503 - Unavailable
TOOLS:
• Firebug
• Network Inspector
• Fiddler
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
11. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 200: OK
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
12. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 302 (TEMPORANEO)
• Da utilizzare quando si cambia provvisoriamente url a una risorsa.
(es. voglio dirottare i visitatori dalla homepage a una landing page)
• Lo spider non aggiorna l’url della risorsa
• Non trasferisce Link juice
• ATTENZIONE: wp_redirect($url) utilizza il 302
• Utilizzato anche per _wp_old_slug
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
13. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 301: MOVED PERMANENTLY
• Da utilizzare quando si cambia url a una risorsa.
• Trasferisce Link juice
• Utile soprattutto quando si cambia permalink ad un url dopo la pubblicazione
• Attenzione a _wp_old_slug (function wp_old_slug_redirect )
• Attenzione a quando si cambia la struttura dei permalink
Wordpress di default utilizza lo status code 302 (Non passa link juice).
Per modificare questo comportamento:
add_filter(‘wp_redirect_status’,’crd_redirect_corretto’,10,2);
function crd_redirect_corretto ($location,$status)
{ //aggiungere eventuale condizione aggiuntiva x 301
if(302==$status)
$status=301;
return $status;
}
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
14. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 301: MOVED PERMANENTLY
Come inserire un redirect (o qualsiasi altra regola) nel .htaccess
//utilizzare solo nell’admin es. add_action('admin_init',
'crd_htaccess');
function crd_htaccess()
{
$htaccess_file = ABSPATH.'.htaccess';
$rules=array();
$rules[]='Redirect 301 /vecchio-url/ http://www.example.com/nuovo-
url/';
insert_with_markers( $htaccess_file, 'Marker personalizzato
Redirect', $rules );
}
Redirect 301 /vecchio-url/ http://www.example.com/nuovo-url/
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
15. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 404: NOT FOUND
• Restituito ogni volta che si richiede una risorsa inesistente
• Importante monitorarli ( è possibile farlo in almeno 4 modi diversi)
• E’ possibile personalizzare la pagina d’errore (404.php)
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
16. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 404: COME TRACCIARLO (1)
Tracciamento tramite file di testo e/o email di alert:
add_action (‘template_redirect’,’crd_log_404’);
function crd_log_404()
{
if(is_404())
{
//consigliato solo per siti nuovi e/o con pochi errori
wp_mail(‘webmaster@example.com’,’errore 404’, $_SERVER[‘REQUEST_URI’]);
//il file error.log deve essere scrivibile
file_put_contents(‘error.log’,sprintf(‘%s - %s ’,date(‘d-m-Y h:i:s’), ’,
$_SERVER[‘REQUEST_URI’])
}
}
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
17. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 404: COME TRACCIARLO (2)
Tracciamento tramite Google Analytics (inserire in 404.php)
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackEvent', 'Error', '404', ‘pagina’+ document.location.pathname
+ document.location.search + '&from=' + document.referrer]);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
</script>
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
18. #2 LINKING INTERNO E INDICIZZAZIONE – STATUS CODE
STATUS CODE 404: COME RESTITUIRLO
Impostare manualmente un 404:
<?php
global $wp_query;
$wp_query->set_404();
status_header( 404 );
?>
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
19. #2: MASSIMIZZARE L’INDICIZZAZIONE – STATUS CODE
STATUS CODE 404: NOT FOUND
Personalizzate il template 404.php
• [Internet Explorer will only show your custom 404 page
if it’s larger than 512 bytes (hard to get smaller than
that with WordPress).]
Proponete alternative:
• Ricerca
• Sitemap
• Link all’homepage
• Miglior alternativa
http://yoast.com/404-error-pages-wordpress/
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
20. #2: MASSIMIZZARE L’INDICIZZAZIONE
STATUS CODE 503: SERVICE UNAVAILABLE
• Da utilizzare durante le operazioni di manutenzione
• Specificare anche l’header Retry-After
Per personalizzare la pagina, creare il file maintance.php dentro wp-content (non
utilizzare funzioni di WP )
<?php
$protocol = $_SERVER["SERVER_PROTOCOL"];
if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
$protocol = 'HTTP/1.0';
header( "$protocol 503 Service Unavailable", true, 503 );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 3600' ); // 3600 secondi = 1ora
?>
<!DOCTYPE html>
<html>
<head>
<title>Sorry, We're Getting Tuned Up</title>
<!– […] -->
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
21. #3: EVITARE CONTENUTI DUPLICATI
NO AI CONTENUTI DUPLICATI
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
23. #3: EVITARE CONTENUTI DUPLICATI
COME EVITARE I CONTENUTI DUPLICATI -1
Nelle pagine archivio e categoria non inserire il post completo
if(have_posts()):while(have_posts()):the_post();?>
<div class=‘post’>
<h3><a href="<?php the_permalink()?>">
<?php the_title()?></a></h3>
<?php the_excerpt()?>
<p><a class="btn" href="<?php the_permalink()?>">Leggi»</a>
</p>
</div><!--/.post-->
<?php endwhile; endif;?>
• Evitare d’inserire l’excerpt nella pagina in cui è presente il post (è un riassunto)
• Scegliere se far indicizzare categorie o tag (non entrambi)
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
24. #3: EVITARE CONTENUTI DUPLICATI
COME EVITARE I CONTENUTI DUPLICATI - 2
• Aggiungere testo unico nella pagina archivio (solo nella prima e non nelle successive)
DESCRIZIONE UNICA IN ARCHIVE.PHP
<h1><?php echo single_cat_title('',false)?></h1>
<?php if(!is_paged()):
<p><?php category_description()?></p>
<?php endif;?>
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
25. #4: CANONICALIZZAZIONE DEI CONTENUTI
UTILIZZO rel=‘canonical’
Es. ordinamento risultati tramite query string
http://www.example.com/prodotti/plugin/?sort=alpha
http://www.example.com/prodotti/plugin/?sort=price
COME AGGIUNGERE IL CANONICAL IN UNA PAGINA:
remove_action(‘wp_head’,’rel_canonical’);
add_action(‘wp_head’, crd_manage_canonical’);
function crd_manage_canonical()
{
$link=‘http://www.example.com/prodotti/plugin/’;
echo "<link rel='canonical' href='$link' />n";
}
<link rel=‘canonical’ href=‘http://www.example.com/prodotti/plugin/’ />
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
26. #5: UTILIZZARE I MICROFORMATI
MICROFORMATI
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
27. #5: UTILIZZARE I MICROFORMATI
HCALENDAR
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
28. #5: UTILIZZARE I MICROFORMATI
HREVIEW-AGGREGATE (VOTES)
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
29. #5: UTILIZZARE I MICROFORMATI
HREVIEW-AGGREGATE (COUNT)
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
30. #5: UTILIZZARE I MICROFORMATI
HRECIPE
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
31. #5: UTILIZZARE I MICROFORMATI
IMPLEMENTARE rel=‘author’
3 STEP
1. Link dall’articolo alla pagina autore interna al sito
2. Link dalla pagina autore al profilo G+ con rel=‘author’
3. Link dalla pagina profilo G+ alla pagina autore con rel=‘me’
APPROFONDIMENTO: http://seoblog.giorgiotave.it/implementare-rel-author/2108
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
32. #4: EVITARE CONTENUTI DUPLICATI
IMPLEMENTARE rel=‘author’
In single.php
Altri articoli di<a href="<?php echo
get_author_posts_url(get_the_author_meta('ID'));?>“ rel=“author”>
<?php the_author()?></a>
In author.php
<a href="<?php echo get_the_author_meta(‘gplus');?>" rel=“me"
target="_blank">Google plus</a>
gplus è un custom user meta.
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13
33. #4: EVITARE CONTENUTI DUPLICATI
APPROFONDIMENTI
SCHEMA.ORG
http://www.schema.org
GOOGLE RICH SNIPPET TESTING TOOL:
http://www.google.com/webmasters/tools/richsnippets
GENERATORE SCHEMA.ORG:
http://www.microdatagenerator.com/
ALTRO GENERATORE SCHEMA.ORG
http://schema-creator.org
WORDCAMP BOLOGNA - 9 FEBBRAIO 2013 @WORDCAMPBOLOGNA # WPCAMPBO13