有没有一种方法可以从post变量中排除内容以节省RAM使用量?


9

因此,我遇到了看起来像WP RAM使用问题的问题,并且正在寻找解决方案。

我在网站上真正遇到这个问题的唯一地方是我尝试填充的“网站地图”页面,但是可以普遍应用此问题的解决方案,并节省整个网站的RAM使用率。

从本质上讲,这个网站地图页面我是所有人的名单posts,并pages在我的网站。我需要在此页面上访问的$ post变量的唯一元素是标题和永久链接。不幸的是,我正在使用的查询返回所有帖子,以及每个$ 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 (由Debug Bar报告),而我网站上任何其他典型页面的使用量为50-60MB。很大的区别。昨天,“站点地图”页面停止工作(WSOD),要解决此问题,我不得不增加WP可以使用的最大RAM量。因此,由于只有一页,因此我增加了总体必要的系统资源。

因此,我提出了问题。

有没有在WordPress的路径/选项的地方,我的思念,将获取posts/ pages像一个正常的查询,但获取检索到的帖子的内容?

或者,是否有一种更简单的方法让我仅获取给定查询(标题/ Permaklink / Slug / etc ...)中的特定元素,而不是获取整个$ post变量shebang?

在我看来,对于许多WP应用,唯一的地方,通常会需要后/页的“内容”是对pagepost页面(当然这里也有例外),并有机会获得职位的全部内容通过其他页面上的查询检索到的/ pages是简单的矫kill过正。如果有一种方法可以避免加载列表列表页面的全部内容,则可以节省大量的RAM使用量。

任何帮助,将不胜感激。

Answers:


8

您可以尝试一种技巧,直接查询发布数据并将filter发布对象的字段设置为,sample然后再传递get_permalink()以减少内存使用。

有关背后的详细原因,请参见get_permalink内存使用问题


此解决方案效果很好。好吧,经过一番争吵之后。:)我必须弄清楚如何在查询中包括我的自定义分类法/术语,但这是一个巨大的帮助。现在,站点地图页面使用70MB的RAM(根据调试栏)。感谢您的指导。
程序员丹

4

您可以尝试将其添加到数组中:

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

似乎很不言自明,但实际上您并不是在查询所有post变量,而只是查询所需的东西。


2

程序员丹,ma!

让我们开始SELECT使用$wpdb全局的自定义查询。食品法典委员会在使用“自定义选择查询”显示帖子中有一个很好的条目。如果您使用它,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()并激活了调试模式,则这些呼叫可能会左右散布关于(故意)缺少信息的通知。@在确认自定义查询功能正常之后,您可能希望在函数调用前添加一个以抑制它们。

但这应该可以帮助您入门!您可以参考以下数据库图(从Codex 的“ 数据库描述”页面)找到需要查询的字段:

WordPress数据库图

编辑:

内存使用效率最高的解决方案可能是将自定义SELECT查询与@Rarst的protip 结合在一起的方法:)


1

WP_Query具有一个“返回字段”参数,如下所示:

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

以这种方式使用时,WP_Query仅返回帖子ID,而不返回整个帖子对象。然后,你可以使用get_permalink()get_the_title()和其他杂七杂八的WordPress的功能基础上,文章ID检索您的内容。


1
请注意,接受帖子ID的函数通常仅get_post()在其上立即运行以检索完整数据,因此完全破坏了仅检索ID的目的。
拉斯特

1
很高兴知道!我觉得自己很聪明。
道尔顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.