标签 cache 下的文章

在wordpress管理后台顶部加一个一键清除所有cos-html-cache插件产生的缓存文件功能

应要求,得在wordpress管理后台顶部加一个一键清除所有cos-html-cache插件产生的缓存文件功能。

cos-html-cache是一款简单高效的wordpress缓存插件,之前写过它的源码简单解读

当更新文章时,缓存文件会自动更新,但是对某些小地方的更新,比如友情链接等功能,这些小地方的更新无法触发cos-html-cache去给所有静态缓存文件更新一遍。

现在因为要对这些小地方较频繁的更新,而为了安全,“仪表盘”中的设置功能不对编辑开放,这样没法提供cos-html-cache自身提供的清除缓存功能。于是就是开放一个单独的清除缓存的链接出来。

想了想,也挺简单的,把cos-html-cache的部分代码提取出来,在functins.php中加上少量代码就可以实现在管理后台的顶部加一个一键清除所有缓存文件的链接了。

实现代码如下:

function conference_admin_bar_render() {
    global $wp_admin_bar;

    if ( !is_user_logged_in()) 
        return false;


    $wp_admin_bar->add_menu( array(
                'parent' => '',
                'id' => 'delete-cache',
                'title' => __( '删除缓存', 'conference-cache' ),
                'meta' => array( 'title' => __( '删除所有缓存文件', 'conference-cache' ) ),
                'href' => wp_nonce_url( admin_url( 'index.php?action=delcachepage&path=' . urlencode( $_SERVER[ 'REQUEST_URI' ] ) ), 'delete-cache' )
                ) );
}
add_action( 'wp_before_admin_bar_render', 'conference_admin_bar_render' );

function admin_bar_delete_cache() {
    // Delete cache for a specific page
    if ( isset( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'delcachepage' && ( isset( $_GET[ '_wpnonce' ] ) ? wp_verify_nonce( $_REQUEST[ '_wpnonce' ], 'delete-cache' ) : false ) ) {
do_conference_html_cache_action();
        wp_redirect( preg_replace( '/[ <>\'\"\r\n\t\(\)]/', '', $_GET[ 'path' ] ) );
        die();
    }
}
if ( isset( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'delcachepage' )
   add_action( 'admin_init', 'admin_bar_delete_cache' );

// deal with rebuild or delete
if( !function_exists('ConferenceDelCacheByUrl') ){
    function ConferenceDelCacheByUrl($url) {
        $url = get_home_path().str_replace( get_option('home'),"",$url );
        $url = str_replace("//","/", $url );
         if( file_exists( $url )){
             if( is_dir( $url )) {@unlink( $url."/index.html" );@rmdir($url);}
             else @unlink( $url );
         }
    }
}

function do_conference_html_cache_action(){
        @rename(get_home_path()."index.html",get_home_path()."index.bak");
        @chmod( get_home_path()."index.bak", 0666 );
        global $wpdb;
        $postRes=$wpdb->get_results("SELECT `ID`  FROM `" . $wpdb->posts . "` WHERE post_status = 'publish' AND ( post_type='post' OR  post_type='page' )  ORDER BY post_modified DESC ");
        foreach($postRes as $post) {
            ConferenceDelCacheByUrl(get_permalink($post->ID));
            }
        $msg = __('缓存文件已成功清除','delete-cache');
//  if($msg)
//  echo '<div class="updated"><strong><p>'.$msg.'</p></strong></div>';
}

测试了一下,效果很好。

wordpress的缓存插件cos-html-cache的源码解读

之前在“Blog的选择-Wordpress还是Typecho?”说过Wordpress很笨重,所以这里选择了Typecho。因为一些站需要用Wordpress,所以就得上缓存类插件,一般来说直接用WP Super Cache即可,稳定、易用、效率高。

不过,其实Wordpress还有一款效率更高的缓存类插件,那就是cosbeta(江东,东哥)开发的cos-html-cache,关于cos-html-cache,其原理和功能等方面更多的信息见这里

下面简单解读一下cos-html-cache的源码,我不是这款插件的开发者,不保证解读完全正确。

- 阅读剩余部分 -