Wordpress оптимизация, ускорение сайта

Wordpress оптимизация, ускорение сайта

Содержание: 

  1. CSS - добавить rel=’preload’ атриббут
  2. Добавить функцию defer ко всем скриптам.
  3. Удалить junk с head
  4. Отключить emoji's
  5. Удалить tinymce emoji plugin
  6. Отключить embeds
  7. Убрать версию скриптов
  8. Отложить загрузку скриптов
  9. Удалить стандартный jquery
  10. Научим Wordpress отдавать заголовок Last-Modified
  11. Меняем http status
  12. IP переадресация
  13. Убираем циклические ссылки

1. CSS - добавить rel=’preload’ атриббут

function add_rel_preload($html, $handle, $href, $media) {
    
    if (is_admin())
        return $html;

     $html = <<%3Clink%20rel%3D'preload'%20as%3D'style'%20onload%3D%22this.onload%3Dnull%3Bthis.rel%3D'stylesheet'%22%20id%3D'%24handle'%20href%3D'%24href'%20type%3D'text%2Fcss'%20media%3D'all'%20%2F%3E
EOT;
    return $html;
}
add_filter( 'style_loader_tag', 'add_rel_preload', 10, 4 );

2. Добавить функцию defer ко всем скриптам.

function crave_js_defer_attr($tag) {
    if (is_admin()) {
        return $tag;
    }
    // Do not add defer attribute to these scripts
    $scripts_to_exclude = array('jquery.js'); // add a string of js file e.g. script.js

    foreach($scripts_to_exclude as $exclude_script) {
        if (true == strpos($tag, $exclude_script ) )
            return $tag; 
    }
    // Defer all remaining scripts not excluded above
    return str_replace( ' src', ' defer src', $tag );
}
add_filter( 'script_loader_tag', 'crave_js_defer_attr', 10);

3. Удалить junk с head

function crave_remove_version() {
    return '';
}
add_filter('the_generator', 'crave_remove_version');
remove_action('wp_head', 'wp_generator');

remove_action('wp_head', 'rsd_link'); // remove really simple discovery (RSD) link
remove_action('wp_head', 'wlwmanifest_link'); // remove wlwmanifest.xml (needed to support windows live writer)

remove_action('wp_head', 'feed_links', 2); // remove rss feed links (if you don't use rss)
remove_action('wp_head', 'feed_links_extra', 3); // removes all extra rss feed links

remove_action('wp_head', 'index_rel_link'); // remove link to index page

remove_action('wp_head', 'start_post_rel_link', 10, 0); // remove random post link
remove_action('wp_head', 'parent_post_rel_link', 10, 0); // remove parent post link
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0); // remove the next and previous post links
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );

remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0 ); // remove shortlink

4. Отключить emoji's

function crave_disable_emojis() {
    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_action( 'admin_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' );
    add_filter( 'tiny_mce_plugins', 'crave_disable_emojis_tinymce' );
    add_filter( 'wp_resource_hints', 'crave_disable_emojis_remove_dns_prefetch', 10, 2 );
}
add_action( 'init', 'crave_disable_emojis' );

5. Удалить tinymce emoji plugin

function crave_disable_emojis_tinymce( $plugins ) {
    if ( is_array( $plugins ) ) {
        return array_diff( $plugins, array( 'wpemoji' ) );
    } else {
        return array();
    }
}

6. Отключить embeds

function crave_disable_embeds() {
    
    // Remove the REST API endpoint.
    remove_action( 'rest_api_init', 'wp_oembed_register_route' );
    
    // Turn off oEmbed auto discovery.
    add_filter( 'embed_oembed_discover', '__return_false' );
    
    // Don't filter oEmbed results.
    remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
    
    // Remove oEmbed discovery links.
    remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
    
    // Remove oEmbed-specific JavaScript from the front-end and back-end.
    remove_action( 'wp_head', 'wp_oembed_add_host_js' );
    add_filter( 'tiny_mce_plugins', 'crave_disable_embeds_tiny_mce_plugin' );
    
    // Remove all embeds rewrite rules.
    add_filter( 'rewrite_rules_array', 'crave_disable_embeds_rewrites' );
    
    // Remove filter of the oEmbed result before any HTTP requests are made.
    remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
}
add_action( 'init', 'crave_disable_embeds', 9999 );
    
function crave_disable_embeds_tiny_mce_plugin($plugins) {
    return array_diff($plugins, array('wpembed'));
}

    

function crave_disable_embeds_rewrites($rules) {
    foreach($rules as $rule => $rewrite) {
        if(false !== strpos($rewrite, 'embed=true')) {
            unset($rules[$rule]);
        }
    }
    return $rules;
}

7. Убрать версию скриптов

function crave_remove_jquery_migrate( &$scripts) {
    if(!is_admin()) {
        $scripts->remove('jquery');
        $scripts->add('jquery', false, array( 'jquery-core' ), '1.12.4');
    }
}

8. Отложить загрузку скриптов, отлично подходит для скриптов отслеживание статистики или чатов:

<div id="script_ad" class="script_ad" style="display:none;">

Здесь файл или скрипт для загрузки.
</div>

<script type="text/javascript">
 // переместить файл в место отображения
 document.getElementById('script_block').appendChild(document.getElementById('script_ad'));

 // показать
 document.getElementById('script_ad').style.display = 'block';

</script>

9. Удалить стандартный jquery

<?php wp_deregister_script('jquery'); ?>

и если требуется подключаем скрипты на contact form 7

<script asyns type='text/javascript' src='/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js'></script>
    <script type='text/javascript'>
        /* <![CDATA[ */
        var _wpcf7 = {"loaderUrl":"\/wp-content\/plugins\/contact-form-7\/images\/ajax-loader.gif","sending":"Sending ..."};
        /* ]]> */
    </script>
    <script asyns type='text/javascript' src='/wp-content/plugins/contact-form-7/includes/js/scripts.js'></script>

 

Научим Wordpress отдавать заголовок Last-Modified

 post_modified_gmt ) ) {
            return;
        }
 
        $post_time = strtotime( $post -> post_modified_gmt );
        $modified_time = $post_time;
 
        // Если есть комментарий, обновляем дату
        if ( ( int ) $post -> comment_count > 0 ) {
            $comments = get_comments( array(
                'post_id' => $post -> ID,
                'number' => '1',
                'status' => 'approve',
                'orderby' => 'comment_date_gmt',
                    ) );
            if ( !empty( $comments ) && isset( $comments[0] ) ) {
                $comment_time = strtotime( $comments[0] -> comment_date_gmt );
                if ( $comment_time > $post_time ) {
                    $modified_time = $comment_time;
                }
            }
        }
 
        $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
    }
 
 
    // Cтраницы архивов: рубрики, метки, даты и тому подобное
    if ( is_archive() || is_home() ) {
        global $posts;
 
        if ( empty( $posts ) ) {
            return;
        }
 
        $post = $posts[0];
 
        if ( !isset( $post -> post_modified_gmt ) ) {
            return;
        }
 
        $post_time = strtotime( $post -> post_modified_gmt );
        $modified_time = $post_time;
 
        $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) );
    }
 
 
    // Если заголовки уже отправлены - ничего не делаем
    if ( headers_sent() ) {
        return;
    }
 
    if ( !empty( $last_modified ) ) {
        header( 'Last-Modified: ' . $last_modified );
 
        if ( !is_user_logged_in() ) {
            if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $modified_time ) {
                $protocol = (isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1');
                header( $protocol . ' 304 Not Modified' );
            }
        }
    }
}

11. Меняем http статус + плагин 404 Solution

<?php
// Берем текущий код и устанавливаем новый
var_dump(http_response_code(404));
// Берем новый код
var_dump(http_response_code());
?>

12. IP переадресация 

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP_HOST} ^176\.107\.130\.40
RewriteRule (.*) http://rf-dlplom.com/$1 [R=301,L]
</IfModule>

14. Убираем циклические ссылки

function mayak_list_page_no_link($no_link){
$gg_mk = '!<li class="(.*?)current_page_item"><a(.*?)>(.*?)</a>!si';
$dd_mk = '<li class="$1current_page_item">$3';
return preg_replace($gg_mk, $dd_mk, $no_link );
}
add_filter('wp_list_pages', 'mayak_list_page_no_link');

function mayak_page_menu_no_link($no_link){
$gg_mk = '!<li class="(.*?)current_page_item"><a(.*?)>(.*?)</a>!si';
$dd_mk = '<li class="$1current_page_item">$3';
return preg_replace($gg_mk, $dd_mk, $no_link );
}
add_filter('wp_page_menu', 'mayak_page_menu_no_link');

function mayak_nav_menu_no_link($no_link){
$gg_mk = '!<li(.*?)class="(.*?)current_page_item(.*?)"><a(.*?)>(.*?)</a>!si';
$dd_mk = '<li$1class="\\2current_page_item\\3">$5';
return preg_replace($gg_mk, $dd_mk, $no_link );
}
add_filter('wp_nav_menu', 'mayak_nav_menu_no_link');