通过使用Transients API缓存自定义查询来加速您的WordPress

哦,男孩,标题听起来可怕,不是。 你没有什么可担心的,因为我们会把这一切都打破。 你的主题是运行自定义的WordPress查询来显示随机帖子,热门帖子,最近的帖子等在边栏或其他地方? 如果是的话,那么你应该考虑使用WordPress的瞬态API缓存这些查询,以减少资源消耗以及帮助加载时间。 在本文中,我们将向您展示如何通过使用Transients API缓存自定义查询来加速您的WordPress网站。

注意:您需要了解WordPress主题如何工作(循环等),以便您遵循这个帖子。

所以这整个缓存和短暂的行话正在我的头上。 别担心,让我们来解释一下它的功能。 基本上,如果你正在运行一个像List25这样的站点,并且有一个循环,在你的边栏中显示6个随机文章,那么瞬态API可以提供帮助。 每次用户刷新页面时,您拥有的自定义WP Query都将进入您的数据库并随机抽取6个帖子。 如果你是一个相对较新的网站,应该不会那么糟糕。 但是,如果您将大量的人员加入到您的网站,那么可能会导致您的SQL服务器崩溃,您将看到“建立数据库连接时出错”屏幕。 通过添加一些额外的代码行,您可以使用Transients API轻松地将该查询的结果(高速缓存)保存一段时间。

我们用于提取随机帖子的循环代码示例:

have_posts()):$ random_query-> the_post();
 ?> 

关于我们在侧边栏中随机帖子查询的最酷的部分是每次都显示新的内容。 因此,通过缓存查询12小时,我们将有相同的6个职位显示12小时的权利? 好吧,我们找到了一个工作,感谢我们的朋友Konstantin Kovshenin(@kovshenin)的建议。 他建议,而不是使用WP_Query,我们使用get_posts和拉20个职位。 使用瞬态API缓存该查询的结果,然后使用array_rand()函数随机显示原始20中只有6个帖子。 这样我们就可以不断模拟网站上的随机效应。

我们做的第一件事就是设置瞬态。 我们从WordPress Codex页面获得了代码。

//获取我们的瞬态数据的任何现有的副本
 if(false ===($ special_query_results = get_transient('special_query_results'))){
     //它不在那里,所以重新生成数据并保存瞬态
 $ randargs = array('orderby'=>'rand','numberposts'=> 20);
 $ special_query_results = get_posts($ randargs);
     set_transient('special_query_results',$ special_query_results,60 * 60 * 12);
 } 

请注意,60 * 60 * 12是您可以控制缓存长度的区域。 随意将其改为任何你喜欢的。 现在,如果我们使用foreach循环显示$ special_query_results,我们将显示所有20个帖子。 所以我们需要使用array_rand()函数来随机抽取6个项目。 我们添加了这样的代码:

$ randomposts = get_transient('special_query_results');
 $ randkey = array_rand($ randomposts,6); 

现在这将从我们的瞬态数据中随机抽取6个ID。 但是,它不会拉每个职位的价值观。 所以我们不得不添加这些代码:

$ sixposts [0] = $ randomposts [$ randkey [0]];
 $ sixposts [1] = $ randomposts [$ randkey [1]];
 $ sixposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ sixposts [4] = $ randomposts [$ randkey [4]];
 $ sixposts [5] = $ randomposts [$ randkey [5]]; 

基本上我们为$ sixposts创建了一个数组,其中我们为每个项目赋值。 不知道这是否是最好的方式,但它的工作。 如果您有任何更好的建议,请随时将其发布在评论中。

做完之后,我们现在准备好显示循环。 简单地把这样的代码:

全球$ post;  //需要它的工作
 foreach($ sixposts as $ post):setup_postdata($ post);

 //所有的项目都在这里

 endforeach; 

setup_postdata允许你使用这个foreach循环中的所有循环标签,比如the_permalink等。

为了方便大家,下面是我们的最终代码:

'rand','numberposts'=> 20);
 $ special_query_results = get_posts($ randargs);
     set_transient('special_query_results',$ special_query_results,60 * 60 * 12);
 }

 //使用像你通常那样的数据...
 $ randomposts = get_transient('special_query_results');
 $ randkey = array_rand($ randomposts,6);
 $ sixposts [0] = $ randomposts [$ randkey [0]];
 $ sixposts [1] = $ randomposts [$ randkey [1]];
 $ sixposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ sixposts [4] = $ randomposts [$ randkey [4]];
 $ sixposts [5] = $ randomposts [$ randkey [5]];

 全球$ post;
 foreach($ sixposts as $ post):setup_postdata($ post);  ?> 

大达,现在你只有这个数据库查询每12小时一次,无论有多少用户访问您的网站。