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)
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)
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)
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)
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 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)
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)
function remove_devicepx() {
wp_dequeue_script( ‘devicepx’ );
}
add_action( ‘wp_enqueue_scripts’, ‘remove_devicepx’ );
DESACTIVAR ETAGS DE ARCHIVOS ESTÁTICOS (.HTACCESS)
<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)
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)
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)
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)
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)
/* 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)
// 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)
// 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
<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)
<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 ##
Comentarios ( 6 )
¡Gracias! Tu comentario esta pendiente de ser moderado y será publicado en breve si esta relacionado con el artículo del blog. Comentarios sobre soporte o incidencias no serán publicados. En tal caso, por favor repórtalo directamente a través de
Javier
Muy útiles los consejos. Gracias ;)
Sergio Arregui
Oro puro. Muchas gracias
Vanesa Quiroz
Hola! Quisiera saber si con la nueva versión de enero 2018, Versión 4.9.2, este código sigue vigente. Gracias
Fernando Tellado
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.
Carolina
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!
Laura
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!
Iniciar discusión
¡Gracias! Tu comentario esta pendiente de ser moderado y será publicado en breve si esta relacionado con el artículo del blog. Comentarios sobre soporte o incidencias no serán publicados. En tal caso, por favor repórtalo directamente a través de