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

Evaluación rápida del SEO de una web

Sacaremos un pantallazo a la información del índice de visibilidad de sistrix

indice de visibilidad de Sixtrix

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

  • Tenemos un sitemap.xml (http://dominio.com/sitemap.xml) y es referenciado en las Web Master Tools
  • 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

Escalar posiciones

Comprobamos que urls están en la segunda pagina de Google (entra la posición 10 y la 20) y tienen un número considerable de visitas. Debemos potenciar esas urls.

    • Sistrix: Palabras clave -> Palabras clave -> Ordenamos por posición
    • SemRush: Análisis de dominio -> Investigación organica -> posiciones (Domain Analytics -> Organic Research -> Positions)
    • Search Console: Search Traffic -> Search Analytics -> Marcamos la check de position -> ordenamos por position. Los resultados son más imprecisos que con las otras dos herramientas
  1. Optimizamos esa url:

    • 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

Reporte básico

Para obtener una idea de la evolción del dominio, podem os sacar un pantallazo a:

Reporte palabras clave (basta escoger sólo una herramienta):

  • Semrush : Domain Analytics -> Overview
  • Sistrix: SEO -> Overview

Reporte tráfico

  • Semrush : Seo Dashboard
  • Sistrix: SEO -> Overview
icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

¡Hola! ¿En qué puedo ayudarte?