Wordpress高性能优化设置记录

Wordpress是全球最流行的博客程序
这里记录一下收集到的优化方法,以后用到可以不用再搜索

为wordpress数据库增加部分索引

post_modified_gmt,post_date,post_date_gmt,author_post_date_gmt(如果作者多的话)建立索引

一些可以优化的查询参数

'no_found_rows' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'cache_results'          => false,
'posts_per_page' => -1,

禁用SQL_CALC_FOUND_ROWS查询参数

//wp-admin\includes\class-wp-ms-sites-list-table.php
		if ( wp_is_large_network() ) {
			$args['no_found_rows'] = true;
		} else {
			-   $args['no_found_rows'] = false;
                       +   $args['no_found_rows'] = true;
		}
//wp-includes\class-wp-query.php
		if ( isset($q['no_found_rows']) )
			$q['no_found_rows'] = (bool) $q['no_found_rows'];
		else
			- $q['no_found_rows'] = false;
                       + $q['no_found_rows'] = true;
//wp-includes\comment-template.php
        - 		'no_found_rows' => false,
        +		'no_found_rows' => true,
//wp-includes\rest-api\endpoints\class-wp-rest-comments-controller.php
        -		$prepared_args['no_found_rows'] = false;
       +		$prepared_args['no_found_rows'] = true;
       

//无分页代码
if ( ! function_exists( 'wpartisan_set_no_found_rows' ) ) :
 
    /**
     * Sets the 'no_found_rows' param to true.
     *
     * In the WP_Query class this stops the use of SQL_CALC_FOUND_ROWS in the
     * MySql query it generates.
     *
     * @param  WP_Query $wp_query The WP_Query instance. Passed by reference.
     * @return void
     */
    function wpartisan_set_no_found_rows( \WP_Query $wp_query ) {
 
        if ( $wp_query->is_main_query() ) {
 
            $wp_query->set( 'no_found_rows', true );
 
        }
    }
endif;
add_filter( 'pre_get_posts', 'wpartisan_set_no_found_rows', 10, 1 );


//有分页代码
if ( ! function_exists( 'wpartisan_set_no_found_rows' ) ) :
 
    /**
     * Sets the 'no_found_rows' param to true.
     *
     * In the WP_Query class this stops the use of SQL_CALC_FOUND_ROWS in the
     * MySql query it generates. It's slow so we're going to replace it with
     * a COUNT(*) instead.
     *
     * @param  WP_Query $wp_query The WP_Query instance. Passed by reference.
     * @return void
     */
    function wpartisan_set_no_found_rows( \WP_Query $wp_query ) {
        $wp_query->set( 'no_found_rows', true );
    }
endif;
add_filter( 'pre_get_posts', 'wpartisan_set_no_found_rows', 10, 1 );
 
if ( ! function_exists( 'wpartisan_set_found_posts' ) ) :
 
    /**
     * Workout the pagination values.
     *
     * Uses the query parts to run a custom count(*) query against the database
     * then constructs and sets the pagination results for this wp_query.
     *
     * @param array    $clauses  Array of clauses that make up the SQL query.
     * @param WP_Query $wp_query The WP_Query instance. Passed by reference.
     * @return array
     */
    function wpartisan_set_found_posts( $clauses, \WP_Query $wp_query ) {
 
        // Don't proceed if it's a singular page.
        if ( $wp_query->is_singular()  ) {
            return $clauses;
        }
 
        global $wpdb;
 
        // Check if they're set.
        $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';
        $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';
        $distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : '';
 
        // Construct and run the query. Set the result as the 'found_posts'
        // param on the main query we want to run.
        $wp_query->found_posts = $wpdb->get_var( "SELECT $distinct COUNT(*) FROM {$wpdb->posts} $join WHERE 1=1 $where" );
 
        // Work out how many posts per page there should be.
        $posts_per_page = ( ! empty( $wp_query->query_vars['posts_per_page'] ) ? absint( $wp_query->query_vars['posts_per_page'] ) : absint( get_option( 'posts_per_page' ) ) );
 
        // Set the max_num_pages.
        $wp_query->max_num_pages = ceil( $wp_query->found_posts / $posts_per_page );
 
        // Return the $clauses so the main query can run.
        return $clauses;
    }
endif;
add_filter( 'posts_clauses', 'wpartisan_set_found_posts', 10, 2 );

去列表的分页

// wp-includes/query.php 
$this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); 
改为 
$this->max_num_pages = 100; 

禁用WordPress的自动保存功能[wp-includes\functions.php]

//禁止wptexturize函数
remove_filter('the_content', 'wptexturize');
remove_action('pre_post_update', 'wp_save_post_revision' );
add_action( 'wp_print_scripts', 'disable_autosave' );
function disable_autosave() {
    wp_deregister_script('autosave');
}

去除无用的html代码,自己选择使用[wp-includes\functions.php]

remove_action( 'wp_head', 'wp_enqueue_scripts', 1 ); //Javascript的调用
remove_action( 'wp_head', 'feed_links', 2 ); //移除feed
remove_action( 'wp_head', 'feed_links_extra', 3 ); //移除feed
remove_action( 'wp_head', 'rsd_link' ); //移除离线编辑器开放接口
remove_action( 'wp_head', 'wlwmanifest_link' );  //移除离线编辑器开放接口
remove_action( 'wp_head', 'index_rel_link' );//去除本页唯一链接信息
remove_action('wp_head', 'parent_post_rel_link', 10, 0 );//清除前后文信息
remove_action('wp_head', 'start_post_rel_link', 10, 0 );//清除前后文信息
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
remove_action( 'wp_head', 'locale_stylesheet' );
remove_action('publish_future_post','check_and_publish_future_post',10, 1 );
remove_action( 'wp_head', 'noindex', 1 );
remove_action( 'wp_head', 'wp_print_styles', 8 );//载入css
remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
remove_action( 'wp_head', 'wp_generator' ); //移除WordPress版本
remove_action( 'wp_head', 'rel_canonical' );
remove_action( 'wp_footer', 'wp_print_footer_scripts' );
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
add_action('widgets_init', 'my_remove_recent_comments_style');
function my_remove_recent_comments_style() {
global $wp_widget_factory;
remove_action('wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'] ,'recent_comments_style'));
}
       

相关补充

remove_action( 'wp_head', 'wp_resource_hints', 2 );
//禁止加载emoji
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
add_filter( 'emoji_svg_url', '__return_false' );
//禁止自动更新
add_filter( 'auto_update_translation', '__return_false' );
//禁止自动更新和后台更新检查
add_filter('automatic_updater_disabled', '__return_true');// 彻底关闭自动更新
remove_action('init', 'wp_schedule_update_checks');// 关闭更新检查定时作业
wp_clear_scheduled_hook('wp_version_check');// 移除已有的版本检查定时作业
wp_clear_scheduled_hook('wp_update_plugins');// 移除已有的插件更新定时作业
wp_clear_scheduled_hook('wp_update_themes');// 移除已有的主题更新定时作业
wp_clear_scheduled_hook('wp_maybe_auto_update');// 移除已有的自动更新定时作业

remove_action( 'admin_init', '_maybe_update_core' );            // 移除后台内核更新检查
remove_action( 'load-plugins.php', 'wp_update_plugins' );       // 移除后台插件更新检查
remove_action( 'load-update.php', 'wp_update_plugins' );
remove_action( 'load-update-core.php', 'wp_update_plugins' );
remove_action( 'admin_init', '_maybe_update_plugins' );

remove_action( 'load-themes.php', 'wp_update_themes' );         // 移除后台主题更新检查
remove_action( 'load-update.php', 'wp_update_themes' );
remove_action( 'load-update-core.php', 'wp_update_themes' );
remove_action( 'admin_init', '_maybe_update_themes' );
##
function disable_dashboard_widgets() {
    remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');//近期评论 
    remove_meta_box('dashboard_recent_drafts', 'dashboard', 'normal');//近期草稿
    remove_meta_box('dashboard_primary', 'dashboard', 'core');//wordpress博客  
    remove_meta_box('dashboard_secondary', 'dashboard', 'core');//wordpress其它新闻  
    remove_meta_box('dashboard_right_now', 'dashboard', 'core');//wordpress概况  
    remove_meta_box('dashboard_incoming_links', 'dashboard', 'core');//wordresss链入链接  
    remove_meta_box('dashboard_plugins', 'dashboard', 'core');//wordpress链入插件  
    remove_meta_box('dashboard_quick_press', 'dashboard', 'core');//wordpress快速发布   
}
add_action('admin_menu', 'disable_dashboard_widgets');

##
add_action( 'wp_footer', 'wpjam_page_speed' ); function wpjam_page_speed() { date_default_timezone_set( get_option( 'timezone_string' ) ); $content = '[ ' . date( 'Y-m-d H:i:s T' ) . ' ] '; $content .= '页面生成时间 '; $content .= timer_stop( $display = 0, $precision = 2 ); $content .= ' 查询 '; $content .= get_num_queries(); $content .= ' 次'; if( ! current_user_can( 'administrator' ) ) $content = ""; echo $content; }
##
add_filter( 'gettext_with_context', 'wpjam_disable_google_fonts', 888, 4);

function wpjam_disable_google_fonts($translations, $text, $context, $domain ) {
        $google_fonts_contexts = array('Open Sans font: on or off','Lato font: on or off','Source Sans Pro font: on or off','Bitter font: on or off');
        if( $text == 'on' && in_array($context, $google_fonts_contexts ) ){
                $translations = 'off';
        }

        return $translations;
}
##
//function remove_open_sans_from_wp_core() {
//wp_deregister_style( 'open-sans' );
//wp_register_style( 'open-sans', false );
//wp_enqueue_style('open-sans','');
//}
//add_action( 'init', 'remove_open_sans_from_wp_core' );
// Remove Open Sans that WP adds from frontend   
if (!function_exists('remove_wp_open_sans')) :
function remove_wp_open_sans() {
wp_deregister_style( 'open-sans' );
wp_register_style( 'open-sans', false );
}
// 前台删除Google字体CSS   
add_action('wp_enqueue_scripts', 'remove_wp_open_sans');
// 后台删除Google字体CSS   
add_action('admin_enqueue_scripts', 'remove_wp_open_sans');
endif;
##
//function wpjam_disable_feed() {
//      wp_die(__('本博客不再提供 Feed'));
//}
//add_action('do_feed',      'wpjam_disable_feed', 1);
//add_action('do_feed_rdf',  'wpjam_disable_feed', 1);
//add_action('do_feed_rss',  'wpjam_disable_feed', 1);
//add_action('do_feed_rss2', 'wpjam_disable_feed', 1);
//add_action('do_feed_atom', 'wpjam_disable_feed', 1);
##
remove_action( 'wp_head', 'feed_links_extra', 3 ); //去除评论feed
remove_action( 'wp_head', 'feed_links', 2 ); //去除文章feed
remove_action( 'wp_head', 'rsd_link' ); //针对Blog的远程离线编辑器接口
remove_action( 'wp_head', 'wlwmanifest_link' ); //Windows Live Writer接口
remove_action( 'wp_head', 'index_rel_link' ); //移除当前页面的索引
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); //移除后面文章的url
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); //移除最开始文章的url
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );//自动生成的短链接
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ); ///移除相邻文章的url
remove_action( 'wp_head', 'wp_generator' ); // 移除版本号
##
##
//不加载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' );
        }
}
##
//移除wp-json链接
add_filter('rest_enabled', '_return_false');
add_filter('rest_jsonp_enabled', '_return_false');
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );
###############################################

//禁用embeds功能
function disable_embeds_init() {
    /* @var WP $wp */
    global $wp;
    $wp->public_query_vars = array_diff( $wp->public_query_vars, array(
        'embed',
    ) );
    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' );
    add_filter( 'tiny_mce_plugins', 'disable_embeds_tiny_mce_plugin' );
    add_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
}
add_action( 'init', 'disable_embeds_init', 9999 );
function disable_embeds_tiny_mce_plugin( $plugins ) {
    return array_diff( $plugins, array( 'wpembed' ) );
}
function disable_embeds_rewrites( $rules ) {
    foreach ( $rules as $rule => $rewrite ) {
        if ( false !== strpos( $rewrite, 'embed=true' ) ) {
            unset( $rules[ $rule ] );
        }
    }
    return $rules;
}
function disable_embeds_remove_rewrite_rules() {
    add_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'disable_embeds_remove_rewrite_rules' );
function disable_embeds_flush_rewrite_rules() {
    remove_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'disable_embeds_flush_rewrite_rules' );
############################################################
//移除Wordpress后台顶部左上角的W图标
function annointed_admin_bar_remove() {
global $wp_admin_bar;
/* Remove their stuff */
$wp_admin_bar->remove_menu('wp-logo');
}
add_action('wp_before_admin_bar_render', 'annointed_admin_bar_remove', 0);
##
##
##
##
// set permalink  
//function set_permalink(){  
//    global $wp_rewrite;  
 //   $wp_rewrite->set_permalink_structure('/%postname%-%post_id%/');  
//}  
//add_action('init', 'set_permalink');   
###
//自定义登录页面的LOGO图片
function my_custom_login_logo() {
    echo '';
}
add_action('login_head', 'my_custom_login_logo');

//自定义登录页面的LOGO链接为首页链接
add_filter('login_headerurl', create_function(false,"return get_bloginfo('url');"));

//自定义登录页面LOGO提示为任意文本
function custom_loginlogo_desc($url) {
    return 'IT服务中心'; //修改文本信息
}
add_filter( 'login_headertitle', 'custom_loginlogo_desc' );

###
//解决标题为空
function filter_post_empty_title($title){
$format = get_post_format();
if($title == $post_id || $title == ''){
$time = get_the_time('Y-m-d H:i:s');
$title = get_post_format_string($format).' @ '.$time."请修改标题";
}
return $title;
}
add_filter('the_title','filter_post_empty_title');
add_filter('get_the_title','filter_post_empty_title');

搜索时间间隔设置

//搜索间隔设置
add_action('admin_init','searchInterval');
function searchInterval(){
    add_settings_field('sI','搜索间隔控制','sIAdd','reading');
    register_setting('reading','sI');
}

function sIAdd(){
    echo '<textarea name="sI" rows="1" cols="1" id="sI" class="large-text code">' . get_option('sI') . '</textarea>
         <br><more>输入秒即可如想要设置10秒在空格中输入"10"</more>';
}
add_action('template_redirect', 'searchIntervalRealize');
function searchIntervalRealize(){
    $currentTime = time();
    $sI =  get_option('sI');

    $IntervalTime = str_replace("rn", "|", $sI);
    if(empty($IntervalTime)||$IntervalTime < 0){
        wp_die('请在后台设置正确的间隔时间');
    }

    if (is_search()){
        if( empty($_COOKIE['live_searchInterval']) ){
            setcookie('live_searchInterval',$currentTime,$currentTime+$IntervalTime);
        }else{
            $beforeTime = $_COOKIE['live_searchInterval'];
            $DValue = $currentTime - $beforeTime;
            if ( $DValue < $IntervalTime ){
                $errorInfo = '请在'.$IntervalTime .'秒后再次使用搜索功能';
                wp_die($errorInfo);
            }
        }
    }
}


隐藏WordPress版本号

/* 在 js 文件和 css 文件中隐藏 WordPress 版本号
 * @return {string} $src
 * @filter script_loader_src
 * @filter style_loader_src
 */
function livelu_remove_wp_version_strings( $src ) {
     global $wp_version;
     parse_str(parse_url($src, PHP_URL_QUERY), $query);
     if ( !empty($query['ver']) && $query['ver'] === $wp_version ) {
          $src = remove_query_arg('ver', $src);
     }
     return $src;
}
add_filter( 'script_loader_src', 'livelu_remove_wp_version_strings' );
add_filter( 'style_loader_src', 'livelu_remove_wp_version_strings' );
 
/* 在 generator meta 标签中隐藏 WordPress版本号 */
function livelu_remove_version() {
return '';
}
add_filter('the_generator', 'livelu_remove_version');

禁用wordpress搜索功能,归档[wp-includes\functions.php]

add_filter('posts_search', 'disable_search_query_like');
function disable_search_query_like($arg){
    if(!is_admin()){
        return '';
    }else{
        return $arg;
    }
}
 
if(isset($_GET['s'])){
    add_filter('posts_request', 'disable_search_query');
}
function disable_search_query($arg){
    echo '';
    if(!is_admin()){
        return '';
    }else{
        return $arg;
    }
}


wordpress慢查询优化
1.使用以下插件寻找慢查询语句
Query Monitor
Debug Bar
NewRelic
2.EXPLAIN优化语句
a 加索引
b 拆分修改
c 部分逻辑改为PHP执行
d 缓存

参考来源:
https://www.jianshu.com/p/98662fffe637
https://cloud.tencent.com/developer/article/1344258
https://deliciousbrains.com/sql-query-optimization/
https://css-tricks.com/finding-and-fixing-slow-wordpress-database-queries/
https://wpartisan.me/tutorials/wordpress-database-queries-speed-sql_calc_found_rows

发表评论