WordPress 类别 php 查询内存不足


Wordpress category php query running out of memory?

我有一个wordpress页面,上面有一张我最近旅行的地图。

http://www.marksmayo.com/south-american-journey/

如果我然后编写一个基本的 php 查询函数来列出"南美 2010"类别中的所有帖子,它适用于 4-5 个帖子,但是当我将帖子添加到该类别时,它开始耗尽内存与此查询(在页面上给出错误),现在只是没有加载地图下方的任何内容。

相同的代码已打开:

http://www.marksmayo.com/northern-europe-and-asia-mission/

并且目前正在工作,但随着我添加更多帖子,这些帖子可能也会停止。

代码为:

<?php
// The Query
query_posts( array ( 'category_name' => 'south america 2010', 'posts_per_page' => -1 ) );
// The Loop
while ( have_posts() ) : the_post();
    echo '<li><a href=';
        the_permalink();
        echo'>';
    the_title();
    echo '</a></li>';
endwhile;
// Reset Query
wp_reset_query();
?>

两件事:使用更简单的查询并提高WP的内存分配。

尝试此查询,它会自行重置,并且可以在页面(使用 php 执行)或页面模板中使用任意次数。将类别和显示帖子的名称更改为数字,或将 -1 更改为全部显示。

<?php $my_query = new WP_Query('category_name=mycategory&showposts=10'); ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
<?php the_title(); ?></a>
<?php endwhile; ?>

在 wp-config 中提高 WP 的内存分配.php在顶部附近

define('WP_MEMORY_LIMIT', '64M');

并检查您帐户中的 PHP.ini 文件,以查看 PHP 内存是否设置为非常低的限制。您在Bluehost上,所以如果您没有php.ini文件,则可以在Cpanel的php配置中添加单个php.ini然后在root帐户中进行编辑。

Bluehost 将允许 PHP 使用那么多 RAM,但请注意,Bluehost 有时会限制您的帐户 CPU;检查 Cpanel 以了解您的 CPU 使用率和限制量。

我会使用类别 ID 而不是类别 slug,因此您的查询变为:

query_posts( array ( 'cat' => 4, 'posts_per_page' => -1 ) );

(我认为整数搜索会更快,强度更低。(显然将 4 替换为您的类别 ID)。

您也可以删除对"the_title()"的调用并将其替换为$post->post_title,就像您调用the_post()一样,尽管说实话,我不是 100% 确定这是否会产生影响。

此外,如果您在共享主机上,您可能会考虑使用缓存插件。我推荐 W3 总缓存,它只会在内容实际更新时构建运行此查询的平面文件。

最后,在你的代码片段之前,你还没有把它循环起来,所以它循环通过其他东西,每次都运行这个,是吗?

即使您

按照单独答案中的建议提高了wp-config.php文件中的内存限制,您也无法逃脱内存不足问题,因为$wpdb管理内存的方式非常浪费。(它在WP 3.0中创建并存储它检索的每一行的两个副本,即使与早期版本相比,这也是一个巨大的改进。

我建议将每页的帖子数量限制为更合理的值,例如 50 个。

另一个可能有助于查询使用更少内存的小补充是添加

no_found_rows=1

因为它将有助于减少查询开销。

你试过使用WP_Query类吗?也许这会有所帮助:

// Query posts
$the_query = new WP_Query( $args );
// Loop the result
while ( $the_query->have_posts() ) : $the_query->the_post();
    // your impl
endwhile;
// Reset Post Data
wp_reset_postdata();