Cómo optimizar tu web para mejorar el SEO - Webinar con Fernando Tellado

Hay un tema en el mundo digital que cada vez está cobrando más relevancia. Se trata de la optimización web o Web Performance Optimization (WPO). Nuestros clientes nos han transmitido sus dudas acerca de este tema y para despejarlas organizamos un desayuno técnico dirigido a ellos con Fernando Tellado, uno de los mayores expertos en WordPress, creación web y marketing digital de España, sobre “La optimización web (WPO) es el nuevo SEO” en nuestras oficinas. Seguro que algunos de vosotros tenéis las mismas dudas que ellos, por lo que queremos compartir los consejos de Fernando con todos vosotros en este post.

Para los que no estéis familiarizados con el WPO, se trata de aplicar una serie de estrategias y acciones de desarrollo y diseño orientadas a mejorar el rendimiento de una web o proyecto online, con el objetivo de que funcione de forma óptima para todos los usuarios que lo visitan en cualquier dispositivo y en cualquier momento. Es decir, si aplicáis WPO, vuestras webs serán más rápidas, podréis obtener un mejor posicionamiento SEO en buscadores, reduciréis el consumo de recursos, aplicaréis lo último en tecnología y ofreceréis la mejor experiencia de usuario.

Si queréis conseguir todo esto, Fernando os explica fácilmente los pasos a seguir en este vídeo de su charla en nuestro desayuno técnico y aquí tenéis su presentación. Podréis ver una hoja de ruta con los elementos a tener en cuenta como realizar una auditoría para saber el estado de vuestra web, el papel del hosting, el caché, diferencias entre CDNs, gestión de contenidos, adaptación a móvil, entre otros. Además, él destaca que las reglas de posicionamiento en buscadores están cambiando, y aunque el contenido es de lo que se alimentan los motores de búsqueda cada vez tiene más peso otros factores como la velocidad de carga de nuestra web.

Puedes ver más fotos en nuestro Facebook y los comentarios de los asistentes en Twitter con el hashtag #DesayunoSiteGround. ¡Algunos de ellos ya han aplicado los consejos de Fernando con gran éxito!

A continuación os dejamos los códigos facilitados por Fernando Tellado que aparecen en su presentación para que os sea más sencillo aplicarlos en vuestras webs.

QUE NO SE ACTIVEN LOS DASHICONS EN LA BARRA DE ADMIN SI EL USUARIO NO ESTÁ REGISTRADO/CONECTADO (FUNCTIONS.PHP)

// Deregister los dashicons si no se muestra la barra de admin
add_action( ‘wp_print_styles’, function() {
if (!is_admin_bar_showing()) wp_deregister_style( ‘dashicons’ );
}, 100);

DESACTIVA LA HEARTBEAT API DE WORDPRESS (DESACTIVA AUTOGUARDADOS Y REVISIONES) (FUNCTIONS.PHP)

//Desactivar Heartbeat API
add_action( ‘init’, ‘stop_heartbeat’, 1 );
function stop_heartbeat() {
wp_deregister_script(‘heartbeat’);
}

DESACTIVA LA JSON API DE WORDPRESS SI NO LA USA NINGÚN PLUGIN (FUNCTIONS.PHP)

// disable json api and remove link from header
if (in_array(‘json_api’,$settings)) {
// remove json_api
remove_action( ‘wp_head’, ‘rest_output_link_wp_head’, 10 );
remove_action( ‘wp_head’, ‘wp_oembed_add_discovery_links’, 10 );
remove_action( ‘rest_api_init’, ‘wp_oembed_register_route’ );
add_filter( ’embed_oembed_discover’, ‘__return_false’ );
remove_filter( ‘oembed_dataparse’, ‘wp_filter_oembed_result’, 10 );
remove_action( ‘wp_head’, ‘wp_oembed_add_discovery_links’ );
remove_action( ‘wp_head’, ‘wp_oembed_add_host_js’ );
remove_action( ‘template_redirect’, ‘rest_output_link_header’, 11, 0 );
// disable json_api
add_filter(‘json_enabled’, ‘__return_false’);
add_filter(‘json_jsonp_enabled’, ‘__return_false’);
add_filter(‘rest_enabled’, ‘__return_false’);
add_filter(‘rest_jsonp_enabled’, ‘__return_false’);
}

DESACTIVA LOS ESTILOS Y SCRIPTS DE LOS EMOJIS SI NO LOS USAS (FUNCTIONS.PHP)

// remove emoji styles and script from header
if (in_array(’emojicons’,$settings)) {// disabled options are called at the end of machete_admin.php//remove_action( ‘admin_print_styles’, ‘print_emoji_styles’ );
remove_action( ‘wp_head’, ‘print_emoji_detection_script’, 7 );
//remove_action( ‘admin_print_scripts’, ‘print_emoji_detection_script’ );
remove_action( ‘wp_print_styles’, ‘print_emoji_styles’ );
remove_filter( ‘wp_mail’, ‘wp_staticize_emoji_for_email’ );
remove_filter( ‘the_content_feed’, ‘wp_staticize_emoji’ );
remove_filter( ‘comment_text_rss’, ‘wp_staticize_emoji’ );
}

LLAMADAS A LA BASE DE DATOS A SUSTITUIR POR LAS URLS REALES (EN DISTINTOS ARCHIVOS DEL TEMA)

<?php language_attributes(); ?> en header.php.
<?php bloginfo(‘html_type’); ?> en header.php.
<?php bloginfo(‘charset’); ?> en header.php.
<?php bloginfo(‘name’); ?> Sustituir por nombre del sitio.
<meta name=”generator” content=”WordPress <?php bloginfo(‘version’); ?>” /> en header.php.
<?php bloginfo(‘stylesheet_url’); ?> Sustituir por ruta absoluta.
<?php bloginfo(‘rss2_url’); ?> Sustituir por la URL de tu feed.
<?php bloginfo(‘pingback_url’); ?> en header.php.
<?php bloginfo(‘stylesheet_directory’); ?> Sustituir por ruta absoluta.
<?php bloginfo(‘description’); ?> Sustituir por descripción del sitio.
<?php bloginfo(‘comments_rss2_url’); ?> en sidebar.php y footer.php.
<!– <?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. –> en footer.php.

DESACTIVAMOS LOS SCRIPTS DE WOOCOMMERCE EN PÁGINAS QUE NO SEAN DE LA TIENDA (FUNCTIONS.PHP)

add_action( ‘wp_enqueue_scripts’, ‘child_manage_woocommerce_styles’, 99 );
function child_manage_woocommerce_styles() {
remove_action( ‘wp_head’, array( $GLOBALS[‘woocommerce’], ‘generator’ ) );
if ( function_exists( ‘is_woocommerce’ ) ) {
if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
wp_dequeue_style( ‘woocommerce_frontend_styles’ );
wp_dequeue_style( ‘woocommerce_fancybox_styles’ );
wp_dequeue_style( ‘woocommerce_chosen_styles’ );
wp_dequeue_style( ‘woocommerce_prettyPhoto_css’ );
wp_dequeue_script( ‘wc_price_slider’ );
wp_dequeue_script( ‘wc-single-product’ );
wp_dequeue_script( ‘wc-add-to-cart’ );
wp_dequeue_script( ‘wc-cart-fragments’ );
wp_dequeue_script( ‘wc-checkout’ );
wp_dequeue_script( ‘wc-add-to-cart-variation’ );
wp_dequeue_script( ‘wc-single-product’ );
wp_dequeue_script( ‘wc-cart’ );
wp_dequeue_script( ‘wc-chosen’ );
wp_dequeue_script( ‘woocommerce’ );
wp_dequeue_script( ‘prettyPhoto’ );
wp_dequeue_script( ‘prettyPhoto-init’ );
wp_dequeue_script( ‘jquery-blockui’ );
wp_dequeue_script( ‘jquery-placeholder’ );
wp_dequeue_script( ‘fancybox’ );
wp_dequeue_script( ‘jqueryui’ );
}
}
}

DESACTIVAMOS EL SCRIPT DEVICEPX DE JETPACK (FUNCTIONS.PHP)

//Desactivar devicepx de JetPack
function remove_devicepx() {
wp_dequeue_script( ‘devicepx’ );
}
add_action( ‘wp_enqueue_scripts’, ‘remove_devicepx’ );

DESACTIVAR ETAGS DE ARCHIVOS ESTÁTICOS (.HTACCESS)

#Quitar ETag de archivos estáticos
<FilesMatch “\.(ico|jpg|jpeg|png|gif|js|css|htm|html|eot|svg|ttf|woff|woff2)$”>
Header unset ETag
FileETag None
</FilesMatch>

DESACTIVAMOS CONTROL DE VERSIONES QUE HACE WORDPRESS (FUNCTIONS.PHP)

//Quitar control de versiones de scripts de WP
function _remove_script_version( $src ){
$parts = explode( ‘?’, $src );
return $parts[0];
}
add_filter( ‘script_loader_src’, ‘_remove_script_version’, 15, 1 );
add_filter( ‘style_loader_src’, ‘_remove_script_version’, 15, 1 );

ELIMINAMOS SISTEMÁTICAMENTE LOS ARCHIVOS TEMPORALES TRANSIENTS DE WORDPRESS (FUNCTIONS.PHP)

//ELIMINAR TRANSIENTS
add_action( ‘wp_scheduled_delete’, ‘delete_expired_db_transients’ );function delete_expired_db_transients() {global $wpdb, $_wp_using_ext_object_cache;if( $_wp_using_ext_object_cache )
return;$time = isset ( $_SERVER[‘REQUEST_TIME’] ) ? (int)$_SERVER[‘REQUEST_TIME’] : time() ;
$expired = $wpdb->get_col( “SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE ‘_transient_timeout%’ AND option_value < {$time};” );foreach( $expired as $transient ) {

$key = str_replace(‘_transient_timeout_’, ”, $transient);
delete_transient($key);
}
}

CARGAMOS SCRIPT DE LOS COMENTARIOS DISQUS SOLO EN ENTRADAS CON COMENTARIOS, SE DESACTIVA EN EL RESTO (FUNCTIONS.PHP)

//Cargar disqus solo donde es necesario
add_action( ‘wp_head’, ‘tgm_tame_disqus_comments’ );
function tgm_tame_disqus_comments() {//Si estás visitando una entrada o página con los comentarios abiertos es necesario el código
if ( is_singular( array( ‘post’, ‘page’ ) ) && comments_open() )
return;/** Y se frena a Disqus donde no estén abiertos los comentarios */
remove_action( ‘loop_end’, ‘dsq_loop_end’ );
remove_action( ‘wp_footer’, ‘dsq_output_footer_comment_js’ );}

QUITAMOS LAS QUERY STRINGS FROM STATIC RESOURCES (FUNCTIONS.PHP)

//Quitar las query strings from statics resources
function _remove_script_version( $src ){
$parts = explode( ‘?ver’, $src );
return $parts[0];
}
add_filter( ‘script_loader_src’, ‘_remove_script_version’, 15, 1 );
add_filter( ‘style_loader_src’, ‘_remove_script_version’, 15, 1 );

CÓMO CARGAR DE MANERA ÓPTIMA EN EL TEMA HIJO LOS ESTILOS (FUNCTIONS.PHP)

<?php
/* Carga eficaz de estilos del tema padre en vez de @import */
function child_theme_styles() {
wp_dequeue_style( ‘parent-theme-style’ );
wp_enqueue_style( ‘child-theme-style’, get_stylesheet_uri() );
}
add_action( ‘wp_enqueue_scripts’, ‘child_theme_styles’ );
?>

APLAZAR LA CARGA DE JAVASCRIPTS (FUNCTIONS.PHP)

// Aplazar JavaScripts
// Aplaza la carga de jQuery usando la propiedad HTML5 defer
if (!(is_admin() )) {
function defer_parsing_of_js ( $url ) {
if ( FALSE === strpos( $url, ‘.js’ ) ) return $url;
if ( strpos( $url, ‘jquery.js’ ) ) return $url;
// return “$url’ defer “;
return “$url’ defer onload=’”;
}
add_filter( ‘clean_url’, ‘defer_parsing_of_js’, 11, 1 );
}

MOVER TODO EL JAVASCRIPT AL FOOTER (FUNCTIONS.PHP)

if(!is_admin()) {
// Mover todo el JS de la cabecera (header) al pié (footer)
remove_action(‘wp_head’, ‘wp_print_scripts’);
remove_action(‘wp_head’, ‘wp_print_head_scripts’, 9);
remove_action(‘wp_head’, ‘wp_enqueue_scripts’, 1);
add_action(‘wp_footer’, ‘wp_print_scripts’, 5);
add_action(‘wp_footer’, ‘wp_enqueue_scripts’, 5);
add_action(‘wp_footer’, ‘wp_print_head_scripts’, 5);
}

ACTIVAR KEEPALIVE EN EL SERVIDOR (.HTACCESS) – NO NECESARIO CON HTTP/2

#Habilitar Keep-alive
<IfModule mod_headers.c>
Header set Connection keep-alive 
# Number of requests to allow during a persistent connection
MaxKeepAliveRequests 60
# Number of seconds to wait for the next request from the # same client on the same connection
KeepAliveTimeout 15
</IfModule>

ACTIVAMOS COMPRESIÓN GZIP PARA ARCHIVOS (.HTACCESS)

## BEGIN GZIP Compression ##
<IfModule mod_deflate.c>
# Compress HTML, CSS, JavaScript, Text, XML and fonts
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE image/gif
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
</IfModule>
## END GZIP Compression ##

Ana García

Responsable de Marketing España

Una mezcla de Geek y Arty. Siempre curiosa por conocer lo último tanto en marketing online como offline, así como en nuevas tecnologías. Como SiteGrounder me involucro en todas las áreas de la gestión de la marca, desde la estrategia de marketing, contenido, relaciones públicas hasta eventos y mucho más.

Comentarios ( 6 )

avatar del autor

Javier

Jun 01, 2017

Muy útiles los consejos. Gracias ;)

Responder
avatar del autor

Sergio Arregui

Jun 09, 2017

Oro puro. Muchas gracias

Responder
avatar del autor

Vanesa Quiroz

Jan 24, 2018

Hola! Quisiera saber si con la nueva versión de enero 2018, Versión 4.9.2, este código sigue vigente. Gracias

Responder
avatar del autor

Fernando Tellado

Jan 25, 2018

Hola Vanesa, No sé a cuál de todos te refieres poero sí, los códigos de esta publicación son independientes de la versión de WordPress.

Responder
avatar del autor

Carolina

Nov 12, 2018

Hola! Como podría reducir el tiempo de respuesta del servidor? actualmente es lo que mas relentiza mi web. Las imagenes estan optimizadas como progresivo en photoshop He instalado algunos plugins para mejorar la respuesta de la web: [- hummingbird - Autoptimize - Bj lazy load[/b] A pesar de haber activado el lazy load, hay imagenes que no están optimizadas para carga diferida segun webtest.org - he comprobado que está habilitado php 7.1 A pesar de que la versión de escritorio funciona bien, la version móvil es muy lenta. Gracias!

Responder
avatar del autor

Laura

Nov 13, 2018

Hola Carolina, pueden influir varios factores. Para poder darte una respuesta, necesitaríamos más datos, como saber la URL de tu web, y proceder a hacer un estudio concreto de qué la ralentiza. Si tu web está alojada en SiteGround, comunícaselo a nuestro equipo de soporte via ticket o chat para que puedan ayudarte. ¡Un saludo!

Responder

Iniciar discusión

Artículos relacionados

Ha llegado el momento de practicar