WP_QUERY自定义职位发布

时间:2012-11-24 作者:Robert Isaev

假设我有一个基于两种自定义帖子类型的自定义查询:

$wp_query = new WP_Query(array(
           \'post_type\' => array(\'post-type-1\', \'post-type-2\'), 
           \'post_status\' => \'publish\', 
           \'posts_per_page\' => \'3\');
我想要的是把post-type-2的帖子放在每页结果的第三位。

是否可以在一个查询中使用筛选器或任何其他方式?

1 个回复
SO网友:s_ha_dum

分页应该很容易。您只需将分页参数添加到查询和下一篇/上一篇文章链接中,more or less like in another thread I posted in recently.

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$my_query = new WP_Query( 
    array(
        \'showposts\'=>10,
        \'paged\'    => $paged 
    )
); 
// run the loop then, 
// pagination links ...
var_dump(paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\' => \'?paged=%#%\',
    \'prev_text\' => __(\'« Previous\'),
    \'next_text\' => __(\'Next »\'),
    \'current\' => max( 1, get_query_var(\'paged\') ),
    \'total\' => $my_query->max_num_pages
) ));
But... 在每个结果集中获得一个二比一的比率并非如此。

我相信我可以通过自定义SQL查询(使用UNION) 和$wpdb->get_results$wpdb->get_col. 然而,分页将有点棘手,而且您无法以这种方式获取WordPress post对象,因此您可能需要第二个查询来创建这些对象(而且您几乎总是需要它们)。最小的SQL看起来像。。。

(SELECT ID FROM {$wpdb->posts} WHERE post_type=\'post-type-1\' LIMIT a,b) UNION ALL (SELECT ID FROM {$wpdb->posts} WHERE post_type=\'post-type-2\' LIMIT c,d)

棘手的部分是获取这些LIMIT是的。

原则上,使用正确的过滤器——posts_where, posts_fields, etc.-- 您应该能够更改查询以匹配上面提到的自定义SQL,但分页将有点棘手,实际查询WP_Query 使用更加复杂,因此在构建UNION.

对于这两种解决方案中的任何一种,可能都需要在响应结果之前对结果进行排序。我必须设置查询,测试它,然后查看。

最终,我无法说服自己,这些解决方案中的任何一个都比只运行两个查询的简单而明显的解决方案要好。我知道你想让查询倒计时。我也是,但有时两个查询是正确的。除非您的服务器功能严重不足,或者您的站点在许多其他方面设计得非常糟糕,否则此页面的两个查询与一个查询不会有什么区别。

所以

是否可以在一个查询中使用筛选器或任何其他方式?

是的,我认为这是可能的,但您必须使用过滤器从根本上改变查询,我认为这不值得花时间来开发解决方案,也不值得节省您可能从中获得或无法获得的执行时间。

结束

相关推荐

如何将此循环重写为新的WP_QUERY-LOOP?

如何重写if (have_posts()) : ... while (have_posts()) : the_post(); 使用以下样式将Wordpress循环设置为新的\\u查询样式循环<?php $the_query = new WP_Query();? (如所示http://codex.wordpress.org/Class_Reference/WP_Query )下面的当前循环交替显示帖子类,以显示一个由两个帖子宽的帖子组成的网格(请参见下图)。但我需要使用一个新的查询来重写它,以便:1)