Checklist SEO

Sobre esta auditoría

La auditoría consistirá en un unico fichero excel detallaremos todas las cosas que se pueden mejorar/corregir en la web.

Descargar plantilla

Reporte básico

Para obtener una idea de la evolción del dominio, podemos sacar un pantallazo a Search Console -> Performance

rendimiento search console

Optimización Wordpress

//Eliminar typea en la carga de script y css
add_action( 'template_redirect', function(){
    ob_start( function( $buffer ){
        $buffer = str_replace( array( 'type="text/javascript"', "type='text/javascript'" ), '', $buffer );
        
        // Also works with other attributes...
        $buffer = str_replace( array( 'type="text/css"', "type='text/css'" ), '', $buffer );
        $buffer = str_replace( array( 'frameborder="0"', "frameborder='0'" ), '', $buffer );
        $buffer = str_replace( array( 'scrolling="no"', "scrolling='no'" ), '', $buffer );
        
        return $buffer;
    });
});


//eliminar jQuery migrate
add_filter( 'wp_default_scripts', 'dequeue_jquery_migrate' );
function dequeue_jquery_migrate( &$scripts){
	if(!is_admin()){
		$scripts->remove( 'jquery');
		$scripts->add( 'jquery', false, array( 'jquery-core' ), '1.10.2' );
	}
}

//eliminar dash icons
add_action( 'wp_print_styles','my_deregister_styles', 100 );
function my_deregister_styles()    { 
	// wp_deregister_style( 'dashicons' ); 	
	wp_deregister_style( 'amethyst-dashicons-style' ); 
	wp_dequeue_style( 'genesis-sample-fonts' );
}

//Eliminar emojis
function grd_remove_emoji() {
	//remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
	remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
	remove_action( 'admin_print_styles', 'print_emoji_styles' );
	remove_action( 'wp_print_styles', 'print_emoji_styles' );
	remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
	remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
	remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
	// Remove from TinyMCE
	// add_filter( 'tiny_mce_plugins', 'grd_remove_tinymce_emoji' );
}
add_action( 'init', 'grd_remove_emoji' );

Scream Frog

Meta Etiquetas

Title

  • ¿El title tiene entre 50 y 60 palabras y no está duplicado en otras páginas.
    • Web master tools -> Search Appearance -> HTML improvements
    • Screaming Frog
  • ¿Tiene la palabra clave?
  • ¿Es atractivo?

Description

  • ¿Tiene menos de 155 caracteres y no está duplicada?
  • ¿Contiene la palabrra clave?

Contenido

  1. La home tiene suficiente texto
  2. Urls amigables activadas (wordpress)
  3. Página de error 404 correcta
  4. Quitamos de las url's amigables las palabras vacías (pronombres, artículos, etc.)
  5. Los enlaces a url's externas deben tener el atributo target="_blank". Examinar los enlaces a las redes sociales.
    Para ello, en el screaming from iremos a "Menu configuration -> Custom -> Extraction" y usaremos el siguiente selector:
    a:not([target="_blank"]):not([href^="https://pablomonteserin.com"])

Imágenes

  1. Nombres de imágenes y textos alternativos con palabras clave.
  2. No deben pesar mas de 100 kb. Para comprimir las imágenes, usaremos https://tinyjpg.com/
  3. Para poder ver en la biblioteca de medios de Wordpress si una imagen tiene texto alternativo sin tener que meternos dentro, podemos usar este código en el functions.php:
    function wpse_media_extra_column( $cols ) {
        $cols["alt"] = "ALT";
        return $cols;
    }
    function wpse_media_extra_column_value( $column_name, $id ) {
        if( $column_name == 'alt' )
            echo get_post_meta( $id, '_wp_attachment_image_alt', true);
    }
    add_filter( 'manage_media_columns', 'wpse_media_extra_column' );
    add_action( 'manage_media_custom_column', 'wpse_media_extra_column_value', 10, 2 );

Links

  • No hay errores 404
    • Screaming Frog -> Response Codes
  • Los anchor texts de los enlaces son descriptivos
    • Screaming Frog -> Bulk Export -> All Anchor Text
  • Obtener los backlinks que llevan a páginas de error:
    • En Semrush: Busco el dominio -> Backlinks -> busco errores 404.
  • Comprobación de que todas las url's apunten al mismo protocolo. Screaming Frog -> Columna derecha -> Protocol -> Selecciono el protocolo incorrecto -> En el cuadro de filtro escribo la url de la web con el protocolo incorrecto para ver si hay alguna ocurrencia.

Velocidad

  • Gestionar la caché por código y no por plugin. El siguiente código activa la compresión gzip en caso de que el servidor tenga este módulo instalado. Para comprobar si gzip está instalado, podemos usar este servicio.
    # BEGIN WP Rocket v3.2.2 # Use UTF-8 encoding for anything served text/plain or text/html AddDefaultCharset UTF-8 # Force UTF-8 for a number of file formats <IfModule mod_mime.c> AddCharset UTF-8 .atom .css .js .json .rss .vtt .xml </IfModule> # FileETag None is not enough for every server. <IfModule mod_headers.c> Header unset ETag </IfModule> # Since we’re sending far-future expires, we don’t need ETags for static content. # developer.yahoo.com/performance/rules.html#etags FileETag None # Send CORS headers if browsers request them; enabled by default for images. <IfModule mod_setenvif.c> <IfModule mod_headers.c> # mod_headers, y u no match by Content-Type?! <FilesMatch "\.(cur|gif|png|jpe?g|svgz?|ico|webp)$"> SetEnvIf Origin ":" IS_CORS Header set Access-Control-Allow-Origin "*" env=IS_CORS </FilesMatch> </IfModule> </IfModule> # Allow access to web fonts from all domains. <FilesMatch "\.(eot|otf|tt[cf]|woff2?)$"> <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> </FilesMatch> <IfModule mod_alias.c> <FilesMatch "\.(html|htm|rtf|rtx|txt|xsd|xsl|xml)$"> <IfModule mod_headers.c> Header set X-Powered-By "WP Rocket/3.2.2" Header unset Pragma Header append Cache-Control "public" Header unset Last-Modified </IfModule> </FilesMatch> <FilesMatch "\.(css|htc|js|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$"> <IfModule mod_headers.c> Header unset Pragma Header append Cache-Control "public" </IfModule> </FilesMatch> </IfModule> # Expires headers (for better cache control) <IfModule mod_expires.c> ExpiresActive on # Perhaps better to whitelist expires rules? Perhaps. ExpiresDefault "access plus 1 month" # cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5) ExpiresByType text/cache-manifest "access plus 0 seconds" # Your document html ExpiresByType text/html "access plus 0 seconds" # Data ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" # Feed ExpiresByType application/rss+xml "access plus 1 hour" ExpiresByType application/atom+xml "access plus 1 hour" # Favicon (cannot be renamed) ExpiresByType image/x-icon "access plus 1 week" # Media: images, video, audio ExpiresByType image/gif "access plus 4 months" ExpiresByType image/png "access plus 4 months" ExpiresByType image/jpeg "access plus 4 months" ExpiresByType image/webp "access plus 4 months" ExpiresByType video/ogg "access plus 1 month" ExpiresByType audio/ogg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/webm "access plus 1 month" # HTC files (css3pie) ExpiresByType text/x-component "access plus 1 month" # Webfonts ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType application/x-font-woff2 "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" # CSS and JavaScript ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" </IfModule> # Gzip compression <IfModule mod_deflate.c> # Active compression SetOutputFilter DEFLATE # Force deflate for mangled headers <IfModule mod_setenvif.c> <IfModule mod_headers.c> SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding # Don’t compress images and other uncompressible content SetEnvIfNoCase Request_URI \ \.(?:gif|jpe?g|png|rar|zip|exe|flv|mov|wma|mp3|avi|swf|mp?g|mp4|webm|webp|pdf)$ no-gzip dont-vary </IfModule> </IfModule> # Compress all output labeled with one of the following MIME-types <IfModule mod_filter.c> AddOutputFilterByType DEFLATE application/atom+xml \ application/javascript \ application/json \ application/rss+xml \ application/vnd.ms-fontobject \ application/x-font-ttf \ application/xhtml+xml \ application/xml \ font/opentype \ image/svg+xml \ image/x-icon \ text/css \ text/html \ text/plain \ text/x-component \ text/xml </IfModule> <IfModule mod_headers.c> Header append Vary: Accept-Encoding </IfModule> </IfModule> <IfModule mod_mime.c> AddType text/html .html_gzip AddEncoding gzip .html_gzip </IfModule> <IfModule mod_setenvif.c> SetEnvIfNoCase Request_URI \.html_gzip$ no-gzip </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{HTTPS} on [OR] RewriteCond %{SERVER_PORT} ^443$ [OR] RewriteCond %{HTTP:X-Forwarded-Proto} https RewriteRule .* - [E=WPR_SSL:-https] RewriteCond %{HTTP:Accept-Encoding} gzip RewriteRule .* - [E=WPR_ENC:_gzip] RewriteCond %{REQUEST_METHOD} GET RewriteCond %{QUERY_STRING} ="" RewriteCond %{HTTP:Cookie} !(wordpress_logged_in_|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_) [NC] RewriteCond %{REQUEST_URI} !^(/(.+/)?feed/?|/finalizar-compra/(.*)|/(index\.php/)?wp\-json(/.*|$))$ [NC] RewriteCond %{HTTP_USER_AGENT} !^(facebookexternalhit).* [NC] RewriteCond "%{DOCUMENT_ROOT}/usr/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}.html%{ENV:WPR_ENC}" -f RewriteRule .* "/usr/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}.html%{ENV:WPR_ENC}" [L] </IfModule> # END WP Rocket

Diseño

  • La web es responsive

Robots.txt

  1. Existe un robots.txt que referencia al sitemap.xml (http://dominio.com/robots.txt)
    robots.txtUser-agent: * Disallow: /sites/ Disallow: /wp-login.php Disallow: /apuntes/*.html$ Disallow: /*?filename=*&otroparametro=* crawl-delay: 10 Sitemap: https://pablomonteserin.com/sitemap.xml

Google Search Console

  • En la sección coverage (cobertura) no hay errores. Un error muy típico es tener deshabilitada una página en el sitemap.xml pero no tener puesto el no index.
  • Tenemos un sitemap.xml (http://dominio.com/sitemap.xml) y es referenciado en la Google Search Console.
  • Redirección múltiple (cuando una redirección nos lleva a una página que a su vez es una redirección): Menú reports -> Redirect Chains
  • Las url's no se canibalizan. Search console -> Performance -> Filtramos por la query que pensamos que se puede estar canibalizando -> En la pestaña page podemos ver si hay varias url's compitiendo por la misma query.
  • Buscar url's que están en la segunda página de Google para tratar de mejorarlas y meterlas en la primera: Performance -> Click en Average Position para ver la position en el listado -> buscamos las url's que están entre la 11 y la 20. Para potenciarlas:
    • pasarle un seo quake a esa url para ver que se puede mejorar
    • Escribir un post en el blog y enlazarlo con esa url para potenciarla.
    • Añadir una imagen con texto alternativo
    • Optimizacion en general
icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

Para dudas técnicas sobre los ejercicios de mis cursos es necesario estar suscrito.