A-A+

wordpress常用数据库缓存API调用

2015年01月18日 PHP开源系统 评论 4 条 阅读 173 views 次

有不少博友发现夏日博客使用的是香港空间,而且速度相当快,便问我是怎么进行优化的,之前写过使用一些缓存的插件进行优化的文章,还有将没有用的功能都删除掉。

不少人都认为,wordpress 功能过于强大,几乎没有实现不了功能的插件,所以当站点流量越来越大的时候,就有不少人开始抱怨 wordpress 太耗费服务器资源了,夏日博客也一度因为耗费服务器资源而被停止站点的情况,所以首先建议大家在使用 wordpress 时最好少使用插件,后台的一些小工具用不到的就删除掉,先保持 wordpress 优化的最佳状态。

后来研究了不少的主题,发现一些主题为了其功能的强大,直接在主题文件中使用 sql 进行查询数据库,这样一来,每一次的查询都要去调用数据库,流量越来越多的时候,会导致 mysql 被频繁的查询,最终导致占用大量的服务器资源。

其实 wordpress 本身提供了良好的数据库缓存机制,除了我们使用数据库缓存插件外,有一些缓存数据是可以直接进行调用的,比如缓存标签云,缓存自定义查询等等,这些功能不少主题里面都直接进行了 SQL,这样是很不规范的。

下面举几个简单的例子,在我们开发主题的时候直接调用 wordpress 的缓存机制即可。

缓存wordpress的菜单(menu)将如下代码加入到主题 functions.php文件中。

function hh_cached_nav_menu( $args = array(), $prime_cache = fals
e ) {
    global $wp_query;
       
    $queried_object_id = empty( $wp_query->queried_object_i
d ) ? 0 : (int) $wp_query->queried_object_id;
    $queried_object_id );
       
    $nav_menu_key = md5( serialize( $args ) );
       
    $my_args = wp_parse_args( $args );
    $my_args = apply_filters( 'wp_nav_menu_args', $my_args );
    $my_args = (object) $my_args;
       
    if ( ( isset( $my_args->echo ) && true === $my_args->ech
o ) || !isset( $my_args->echo ) ) {
        $echo = true;
    } else {
        $echo = false;
    }
       
    $skip_cache = false;
    $use_cache = ( true === $prime_cache ) ? false : true;
       
    if ( is_singular() ) {
        $skip_cache = true;
    } else if ( !in_array( $queried_object_id, hh_get_nav_me
nu_cache_objects( $use_cache ) ) ) {
        $skip_cache = true;
    }
   
    if ( true === $skip_cache || true === $prime_cache || fa
lse === ( $nav_menu = get_transient( $nav_menu_key ) ) ) {
        if ( false === $echo ) {
            $nav_menu = wp_nav_menu( $args );
        } else {
            ob_start();
            wp_nav_menu( $args );
            $nav_menu = ob_get_clean();
        }
        if ( false === $skip_cache )
            set_transient( $nav_menu_key, $nav_menu );
    }
    if ( true === $echo )
        echo $nav_menu;
    else
        return $nav_menu;
}
   
   
function hh_update_nav_menu_objects( $menu_id = null, $menu_d
ata = null ) {
    hh_cached_nav_menu( array( 'echo' => false ), $prime_cac
he = true );
}
add_action( 'wp_update_nav_menu', 'hh_update_nav_menu_objects' );
   
function hh_get_nav_menu_cache_objects( $use_cache = true ) {
    $object_ids = get_transient( 'hh_nav_menu_cache_object_ids' );
    if ( true === $use_cache && !empty( $object_ids ) ) {
        return $object_ids;
    }
   
   
   
   
    $object_ids = $objects = array();
       
    $menus = wp_get_nav_menus();
    foreach ( $menus as $menu_maybe ) {
        if ( $menu_items = wp_get_nav_menu_items( $menu_may
be->term_id ) ) {
            foreach( $menu_items as $menu_item ) {
                if ( preg_match( "#.*/category/([^/]+)/?$#", $m
enu_item->url, $match ) )
                    $objects['category'][] = $match[1];
                if ( preg_match( "#.*/tag/([^/]+)/?$#", $me
nu_item->url, $match ) )
                    $objects['post_tag'][] = $match[1];
            }
        }
    }
    if ( !empty( $objects ) ) {
        foreach( $objects as $taxonomy => $term_names ) {
            foreach( $term_names as $term_name ) {
                $term = get_term_by( 'slug', $term_name, $t
axonomy );
                if ( $term )
                    $object_ids[] = $term->term_id;
            }
        }
    }
       
    $object_ids[] = 0;
       
    set_transient( 'hh_nav_menu_cache_object_ids', $o
bject_ids );
    return $object_ids;
}

缓存标签云 api,代码如下,放入到需要调用的地方即可.

$tag_cloud = get_transient( 'tag_cloud' );
if ( false === $tag_cloud || '' === $tag_cloud ){
    $args = array('echo' => false);
    $tag_cloud = wp_tag_cloud( $args );
    set_transient( 'tag_cloud', $tag_cloud, 60*60*12 );
}
echo $tag_cloud;

缓存自定义查询:

<?php
if ( false === ( $special_query_results = get_transie
nt( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and sav
e the transient
     $special_query_results = new WP_Query( 'cat=5&ord
er=random&tag=tech&post_meta_key=thumbnail' );
     set_transient( 'special_query_results', $special_q
uery_results );
} 
?>

小提示:wordpress 本身的功能很强大,接口插件很多,所以这也导致了 wordpress 的臃肿,在使用 wordpress 时,并不是安装的插件越多越好,相反,安装的插件越少越好,我们这样来对比一下,把现在正在使用的站点主题与wordpress的默认主题对比一下就知道了,wordpress刚开始的时候没有哪么多功能,所以不占用服务器的资源,而随着站点的发展,插件多了,功能多了,相反,速度则慢了。

标签:

4 条留言  访客:4 条  博主:0 条

  1. 互联网那些事

    互联网那些事感觉不错

  2. 诸神的黄昏

    有备案可以用万网或者景安的免费空间

  3. 梦轩丽人

    我有些查询就是这种方法,看来还需要继续学习改进才行

  4. 超級efly

    前來支持一下~學習啦! 😀

给我留言