是否使用QUERY_POST和/或PRE_GET_POST将主查询拆分到多个循环中?

时间:2012-09-03 作者:unfulvio

我有一个自定义的post类型“events”,我已将自定义分类法“calendar”关联到该类型。日历有12个固定期限,每年的每个月(“八月”、“十月”、“十一月”等)。

我正在制作“事件”帖子类型的归档页面。我想为一年中的每个月显示12个不同的列表,每个列表最多10个帖子==日历分类法中的术语。

由于这将是一个归档页面,Wordpress可能已经查询了数据库中的“事件”帖子类型。我正要使用query_posts 更改主查询,但我突然想知道是否有更好的方法来更优化地使用默认查询。query_posts 将基本上丢弃主查询,并生成12个列表,这将导致对数据库的更多点击。

对于这种情况,哪种做法是最好的?

您是只运行12个query\\u post实例,每个列表一个实例,还是希望执行其他操作,例如pre_get_posts什么的?

感谢分享您的想法

2 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

不使用query_posts(). 不要从模板中修改主循环查询。

您可以通过一个查询来提供所需内容(例如,通过筛选pre_get_postsgroupby), 但更可能的是,您需要使用WP_Query(). 也许是这样的:

// Get all the months
$months = get_terms( $calendar );

// Set up the base query args
$events_query_args = array(
    \'post_type\' => \'events\',
    \'post_per_page\' => 10,
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'calendar\',
            \'field\' => \'slug\',
            \'terms\' => \'\'
        )
    )
);

// Loop through the months, and
// output a custom query and loop
// for each
foreach ( $months as $month ) {

    // Add $month to the query args
    $events_query_args[\'tax_query\'][\'terms\'] = $month[\'slug\'];

    // Build the query
    $events_query = new WP_Query( $events_query_args );

    // Open the query loop
    if ( $events_query->have_posts() ) : while ( $events_query->have_posts() ) : $events_query->the_post();

        // YOUR LOOP CODE GOES HERE

    // Close the loop
    endwhile; endif;

    // Clean up
    $events_query = null;
    wp_reset_postdata()
}
当然,您必须添加实际的循环输出标记。

SO网友:Jan Beck

我想不出任何理由,如果你需要的是12组单独的帖子,那么你为什么不想查询数据库12次,除非你正在运行一个像CNN或NYT这样的网站,而这些网站的数字很重要。您可以对该分类法的所有帖子运行一个查询,并使用PHP将它们按类别进行划分,但最终这听起来不是一个好主意,因为这不是PHP的用途。

如果您担心资源:请使用transients API 缓存查询。(Example)

如果您担心更改主循环:只需调用wp_reset_query 完成后。

结束

相关推荐

Query is not work

我在函数中使用此代码。php跟踪帖子视图。/* Functions to track Post Views*/ function getPostViews($postID){ $count_key = \'post_views\'; $count = get_post_meta($postID, $count_key, true); if($count==\'\'){ delete_post_meta($postID, $count_key);&#x