在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'));
我想要一个循环来显示来自同一循环的页面和帖子。
现在回答我的问题。是否可以将这两个对象合并为一个?如果是的话,怎么样?我对创建两个不同的循环不感兴趣。
答案 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
他们在一起。
答案 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查询。