2009-08-28 18 views
3

Wordpressでは、ループのために独自のWP Querysを作成することができます。例はこれです:Wordpress - 複数のWPクエリーオブジェクトを1つにまとめる?

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

別の例はこれです:私は同じループからページや投稿を提示ループをしたい

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

今質問します。これら2つのオブジェクトを1つにまとめることは可能ですか?そうなら、どうですか?私は2つの異なるループを作るのに興味がありません。

答えて

2

私は解決策を自分で見つけご覧ください。私はsetup_postdataを使用してSQLクエリを解析します。あなたはSQLでそれを行うにはしたくない場合は

The solution

2

希望するものはWHERE ... OR ...の条件に変換するか、UNIONをSQLに変換します。

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()を見てから、私はこれが可能であるとは思わない:クエリVARSのない論理和演算やUNIONはありません。私の心に来る

唯一のものは、(post配列を返すクエリのWHERE句に適用posts_whereフィルタを実装したプラグインを書いています。あなたは別のWP Querysでこのプラグインを呼び出すことができ、プラグインはWHEREの部分を取得し、ORを一緒にすることができます。

http://codex.wordpress.org/Custom_Queries

+0

私は(私自身の答えを参照)SQLパーサとしてsetup_postdataを使用して、この時の私の解決策を見つけました。あなたの選択肢は将来役立ちます。代替ソリューションを私に教えてくれてありがとう! –

1

、これは私が私の検索ページをやった方法です。

基本的な問題:meta_queryを実行するとき、wordpressは "OR"ではなく "AND"で条件を結合したいと思っています。

だからWordpressはtitle/content = "myContent"とaioseop_keyword "myContent"のページを探します。 SEOキーワードが一致するページがあるにもかかわらず、これは(私の場合は)ゼロの結果につながります。

これを回避するために、2つのクエリを行います。シンプルに聞こえますが、$ postオブジェクトに投稿があるにもかかわらず、ループは投稿を認識したくありませんでした。私は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>'; 
} 
関連する問題