因此,我遇到了一个看起来像WP RAM使用问题的问题,正在寻找解决方案。
在我的站点上,我唯一真正遇到这个问题的地方是我试图填充的站点地图页面,但这个问题的解决方案可以在整个站点上普遍应用并节省RAM使用。
本质上,我的这个站点地图页面是所有posts
和pages
在我的网站上。在此页面上,我需要访问的$post变量的唯一元素是title和permalink。不幸的是,我使用的查询返回了所有帖子,每个$post变量中都包含所有信息。
以下是我在此网站地图页面上使用的查询示例custom-post-type
命名为“产品”,自定义分类法为“补充”和术语“所有补充”。我的站点地图页面有多个这样的查询,但出于解释的目的,我只包含这个查询的代码。
$varArray= array(
\'post_type\' => \'products\',
\'post_status\' => \'publish\',
\'supplements\' => \'all-supplements\',
\'posts_per_page\' => -1,
\'orderby\' => \'title\',
\'order\' => \'ASC\'
);
$myProducts= new WP_Query($varArray);
$post变量中保存的大部分信息(对于我的站点,我猜这一趋势在一般使用情况下都会出现)都在“内容”中。我的站点地图页面的典型RAM使用量约为140MB(由调试栏报告),而我的站点上的任何其他典型页面的使用量为50-60MB。差别很大。昨天,站点地图页面停止工作(WSOD),为了修复它,我必须增加WP可以使用的最大RAM量。因为只有一个页面,所以我增加了所有必要的系统资源。
因此,我来回答我的问题。
Wordpress中是否有我遗漏的路径/选项posts
/pages
像一个普通的查询,但不是为检索到的帖子获取内容?
或者,是否有更简单的方法可以仅获取给定查询中的特定元素(Title/Permaklink/Slug/etc…)而不是得到整个$post变量shebang?
在我看来,对于许多可湿性粉剂应用程序来说,通常需要帖子/页面的“内容”的唯一位置就是page
或post
页面(显然这里也有例外),访问通过查询在其他页面上检索到的帖子/页面的全部内容是一种简单的过火行为。如果有一种方法可以避免加载帖子列表页面的全部内容,那么就可以节省大量的RAM使用。
任何帮助都将不胜感激。
SO网友:bosco
程序员丹,老兄!
让我们开始自定义SELECT
使用查询$wpdb
全球的抄本上有一个很好的条目Displaying Posts using a Custom Select Query. 如果你利用setup_postdata()
您可以像坐在标准Wordpress循环中一样循环查看结果:
global $wpdb;
$sitemap_query = "
SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
FROM $wpdb->posts
WHERE $wpdb->posts.post_status = \'publish\'
AND $wpdb->posts.post_type IN (\'post\',\'supplement\',\'another_post_type\')
ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
";
$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);
if( $sitemap_nodes ):
global $post;
foreach ( $sitemap_nodes as $post ):
setup_postdata( $post );
?>
<!-- //Use standard Wordpress template tags for SELECT\'d data within The Loop here -->
<?php the_title() ?>
<?php the_permalink() ?>
<?php
endforeach;
endif;
此查询只提取帖子的ID、标题和GUID(用于确定帖子的永久链接),而完全忽略其他所有内容。此外,它还将结果排序为
post_type
然后
post_title
, 尽管您可能希望使用多个查询来分离您的帖子类型(理论上性能受到的影响很小)。
显然,您可能希望跳过使用setup_postdata()
然后简单地循环$sitemap_nodes
, 或者修改查询以获得所需的结果。
如果你打电话setup_postdata()
如果激活了调试模式,调用很可能会左右弹出关于(故意)丢失信息的通知。你可以扔一个@
在确认自定义查询正常运行后,在函数调用之前抑制它们。
但这应该让你开始!您可以参考以下数据库关系图(从Database Description 第页)查找需要查询的字段:
EDIT:
内存效率最高的解决方案可能是结合了自定义
SELECT
使用@Rarst的protip进行查询:)