Wordpress - 多个WP Query对象合二为一?

时间:2009-08-28 10:40:30

标签: wordpress object

在Wordpress中,可以为循环创建自己的WP Querys。一个例子是:

$my_query = new WP_Query(array('post_parent' => 3, 'post_type' => 'page'));

另一个例子是:

$my_query = new WP_Query(array('cat' => 1, 'post_type' => 'post'));

我想要一个循环来显示来自同一循环的页面和帖子。

现在回答我的问题。是否可以将这两个对象合并为一个?如果是的话,怎么样?我对创建两个不同的循环不感兴趣。

3 个答案:

答案 0 :(得分:2)

您想要的内容会转换为SQL中的WHERE ... OR ...条件或UNION,例如。

SELECT * FROM posts WHERE (post_parent = 3 AND post_type = 'page') 
  OR (cat = 1 AND post_type = 'post')

SELECT * FROM posts WHERE post_parent = 3 AND post_type = 'page'
  UNION
SELECT * FROM posts WHERE cat = 1 AND post_type = 'post'

从查看源和the way WP constructs SQL from WP_Query(),我认为这是不可能的:查询变量没有OR'ing和UNION。

我唯一想到的是编写一个实现posts_where过滤器的插件(应用于返回post数组的查询的WHERE子句)。您可以使用不同的WP Querys调用此插件,插件将获得他们的WHERE部分并且可以OR他们在一起。

另见http://codex.wordpress.org/Custom_Queries

答案 1 :(得分:2)

如果您不想使用SQL,这就是我搜索页面的方式。

基本问题:在进行meta_query时,wordpress认为我希望条件与“AND”而不是“OR”结合。

所以Wordpress会查找一个标题/内容=“myContent”和aioseop_keyword“myContent”的页面。这个(在我的情况下)导致零结果,尽管有一个页面具有匹配的SEO关键字。

为了解决这个问题,我提出两个问题。听起来很简单,但是:尽管$ post对象中有帖子,但Loop不想识别帖子。我在查看the have_posts() function之后找到了这个解决方案:它引用的是除$ post对象之外的其他变量。

$term = get_search_query(); // same as $_GET['s']

# the normal search:
$wordpress_keyword_search =& new WP_Query(array(
  's'         => $term,
  'showposts' => -1
));

# now push already found post IDs to an array, so we can exclude them from the meta search.
foreach ($wordpress_keyword_search->posts as $post_)
  $exclusion[] = $post_->ID;


# now do the meta query search
$aioseop_keyword_search =& new WP_Query(array(
  'post__not_in' => $exclusion,
  'post_type' => 'any',
  'showposts' => -1,
  'meta_query' => array(            
    array(
      'key'       => '_aioseop_keywords',
      'value'     => $term,
      'compare'   => 'LIKE',
    )
  )
));

# merge the two array posts.
# post_count and found_posts must be added together also. 
# otherwise have_posts() returns false.
# see: http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/query.php#L2886

$wordpress_keyword_search->posts       = array_merge($wordpress_keyword_search->posts, $aioseop_keyword_search->posts );
$wordpress_keyword_search->found_posts = $wordpress_keyword_search->found_posts + $aioseop_keyword_search->found_posts;
$wordpress_keyword_search->post_count  = $wordpress_keyword_search->post_count + $aioseop_keyword_search->post_count;

然后在一个简单的循环中使用它:

if ($wordpress_keyword_search->have_posts()) {
  while($wordpress_keyword_search->have_posts()) {
    $wordpress_keyword_search->the_post();
    # now you simply can:
    the_title();
    the_content();

  }
} else {
  echo '<p>Sorry, no posts found</p>';
}

答案 2 :(得分:1)

我自己找到了解决方案。我使用setup_postdata来解析SQL查询。

The solution