每一个 wordpress 深度用户患者,无不是折腾帝。在优化 wordpress 方面大家各自有自己的一套理论经验,在这里简单分享下我对 wordpress 的一些优化

一、后端删除无用功能

image (2).png
还原最纯粹的后端体验!下面是我的配置项:

/*删除菜单*/
function remove_submenu() {
    /* 删除 “媒体库”下面的子菜单“添加”*/
    remove_submenu_page('upload.php', 'media-new.php');
    /* 删除 “文章”下面的子菜单 “标签”*/
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag');
    /* 删除 “文章”下面的子菜单 “写文章”*/
    remove_submenu_page('edit.php', 'post-new.php');
    /* 删除 “文章”下面的子菜单 “分类目录”*/
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=category');
    //删除外观-主题编辑器
    remove_submenu_page('themes.php', 'theme-editor.php');
    //删除外观-小工具
    remove_submenu_page('themes.php', 'widgets.php');
    //删除页面-新建页面
    remove_submenu_page('edit.php?post_type=page', 'post-new.php?post_type=page');
}
if (is_admin()) {
    add_action('admin_init', 'remove_submenu', '5');
}
/*删除左侧菜单*/
function remove_menus() {
    global $menu;
    $restricted = array(
        __('Dashboard') ,
        __('Users') ,
        __('Links') ,
        __('Settings') ,
        __('Plugins') ,
        __('Tools') ,
        __('Media')
    );
    end($menu);
    while (prev($menu)) {
        $value = explode(' ', $menu[key($menu) ][0]);
        if (strpos($value[0], '<') === FALSE) {
            if (in_array($value[0] != NULL ? $value[0] : "", $restricted)) {
                unset($menu[key($menu) ]);
            }
        } else {
            $value2 = explode('<', $value[0]);
            if (in_array($value2[0] != NULL ? $value2[0] : "", $restricted)) {
                unset($menu[key($menu) ]);
            }
        }
    }
}
if (is_admin()) {
    add_action('admin_menu', 'remove_menus');
}

二、前端全静态化

将动态 php 程序渲染后的结果存储为本地的静态 html 文件。

  • 在网站根目录下新建 cache 目录,保证当前用户可读写
  • 在网站根目录下新建 cache.php 文件,内容如下
<?php
define('CACHE_ROOT', dirname(__FILE__) . '/cache');
define('CACHE_LIFE', 86400); //缓存文件的生命期,单位秒,86400秒是一天
define('CACHE_SUFFIX', '.html'); //缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等
$file_name = md5($_SERVER['REQUEST_URI']) . CACHE_SUFFIX; //缓存文件名
//缓存目录,根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要,可以用第三四位为名,再加一层目录。
//256个目录每个目录1000个文件的话,就是25万个页面。两层目录的话就是65536*1000=六千五百万。
//不要让单个目录多于1000,以免影响性能。
$cache_dir = CACHE_ROOT . '/' . substr($file_name, 0, 2);
$cache_file = $cache_dir . '/' . $file_name; //缓存文件存放路径
if ($_SERVER['REQUEST_METHOD'] == 'GET') { //GET方式请求才缓存,POST之后一般都希望看到最新的结果
    if (file_exists($cache_file) && time() - filemtime($cache_file) < CACHE_LIFE) { //如果缓存文件存在,并且没有过期,就把它读出来。
        $fp = fopen($cache_file, 'rb');
        fpassthru($fp);
        fclose($fp);
        exit();
    } elseif (!file_exists($cache_dir)) {
        if (!file_exists(CACHE_ROOT)) {
            mkdir(CACHE_ROOT, 0777);
            chmod(CACHE_ROOT, 0777);
        }
        mkdir($cache_dir, 0777);
        chmod($cache_dir, 0777);
    }
    function auto_cache($contents) { //回调函数,当程序结束时自动调用此函数
        global $cache_file;
        $fp = fopen($cache_file, 'wb');
        fwrite($fp, $contents);
        fclose($fp);
        chmod($cache_file, 0777);
        clean_old_cache(); //生成新缓存的同时,自动删除所有的老缓存。以节约空间。
        return $contents;
    }
    function clean_old_cache() {
        chdir(CACHE_ROOT);
        foreach (glob("*/*" . CACHE_SUFFIX) as $file) {
            if (time() - filemtime($file) > CACHE_LIFE) {
                unlink($file);
            }
        }
    }
    ob_start('auto_cache'); //回调函数 auto_cache

} else {
    if (file_exists($cache_file)) { //file_exists() 函数检查文件或目录是否存在。
        unlink($cache_file); //不是GET的请求就删除缓存文件。

    }
}
?>
  • 在根目录的 index.php 头部引用 cache.php
<?php
require ('cache.php');