2016-11-08 14 views
1

を短く私は次のような状況があります:カスタム投稿タイプを持つユーザーによって投稿された製品。それらを「広告」と呼んでください。広告には、WooCommerce製品への1-1リンクがあります。 はそれに続い私はベンダー項目をしている(彼らは、複数のベンダーのプラグインによって追加されている)と1post_typeごとに異なる条件でWP_Query

に設定し、そのmeta_key「_vendor_product」と他のpost_type製品と区別WooCommerce製品は、これまでのところ私は2つのクエリを作って、コメントを追加していますそれら:

$ads = new WP_Query(
    array(
     'post_type' => 'ads', 
     'paged' => $paged, 
     'post_status' => 'publish', 
     'meta_query' => array(
      array(
       'key' => 'product_id', 
       'value' => $product_ids, 
       'compare' => 'IN' 
      ) 
     ) 
    ) 
); 
$shop_items = new WP_Query(
    array(
     'post_type' => 'product', 
     'paged' => $paged, 
     'post__in' => $product_ids, 
     'meta_query' => array(
      array(
       'key' => '_vendor_product', 
       'value' => 1, 
       'compare' => '=' 
      ) 
     ) 
    ) 
); 
} 

// Include shop items in the stream of products 
$wp_query = new WP_Query(array('paged' => $paged)); 
$wp_query->posts = array_merge($ads->posts, $shop_items->posts); 
$wp_query->post_count = $ads->post_count + $shop_items->post_count; 

しかし、私はそう私の行動/フィルター/ページネーションを破るように見えるsomehwereとして、1 WP_Queryでそれらの両方が必要です。 'post_type' => array('ads', 'product')で別のpost_typesをクエリできますが、_vendor_product = 1の条件は、post_type productの項目にのみ適用され、adsには適用されません。私は必要なもの

は基本的に

SELECT * FROM wp_posts, wp_postmeta 
WHERE (post_type = 'ads') 
OR 
(post_type = 'product' AND meta_key = '_vendor_product' AND meta_value = 1) 
AND 
wp_posts.ID = wp_postmeta.post_id 

であることがWP_Queryの境界内にこれを達成することは可能ですか?

+0

これはあなたが関係を追加したり、http://wordpress.stackexchange.com/questions/191748/how-can-i-apply-aあなた複合クエリー、すなわち状況に動作するかどうかを確認してください-meta-a-single-custom-post-in-the-main-query – Mohsin

+0

あなたの答えをありがとうございます。残念ながら、それはうまくいきません。ベンダーによって作成されていないすべての「製品」投稿がまだあります。 –

答えて

0

私は、あなたが1つのクエリの中でそれを直接達成できるとは思っていません(ただし、誰かが解決策を提示するかもしれません)。しかし、私はこの問題に簡単な回避策を示唆 - ポストIDを見つけると、それから、単一のクエリを行います。

global $wpdb; 

$all_needed = $wpdb->get_results('SELECT wp_posts.id FROM wp_posts, wp_postmeta 
WHERE (post_type = 'ads') 
OR 
(post_type = 'product' AND meta_key = '_vendor_product' AND meta_value = 1) 
AND 
wp_posts.ID = wp_postmeta.post_id'); 

// extract_ids is a pseudo-code function - check what the result actually is and make an array of post_ids 
$post_ids = extract_ids($all_needed) 

// now you have your single query 
$query = new WP_Query(array('post__in'=>$post_ids)); 

// proceed .... 
+0

このソリューションは機能しますが、ページネーションは混乱します。前のページの各ページの数がわからないため、どのデータを取るべきか分かりません。 –

+0

ただし、ページ分割はいくつかの方法で解決できます。 a)SQL LIMIT b)あまりポストされていない場合は、すべてを取得してカウントする c)PHPまたはSQLソートの可能性にusortを使用する – Blackbam

0

私は直接SQLを介さずものの、基本的にBlackbamが提案され、同じように私の結果を達成しました。

誰もが今までにこれを見つけた場合、それは(溶液がWP_Queryで'nopaging'たWP_Queryにget_postsを使用するときに私の結果は10に制限された理由を把握するために私に頭痛のビットを与えたとして、私は私の解決策を投稿します。

$ps_ads = new WP_Query(
    array(
     'post_type' => 'ads', 
     'fields' => 'ids', 
     'nopaging' => true, 
     'post_status' => 'publish' 
    ) 
); 
$shop_items = new WP_Query(
    array(
     'post_type' => 'product', 
     'fields' => 'ids', 
     'nopaging' => true, 
     'post__in' => $product_ids, 
     'meta_query' => array(
      array(
       'key' => '_vendor_product', 
       'value' => 1, 
       'compare' => '=' 
      ) 
     ) 
    ) 
); 
} 

// Sum up all IDs 

$ad_ids = $ps_ads->get_posts(); 
$shop_items_ids = $shop_items->get_posts(); 
$ids = array_merge($ad_ids, $shop_items_ids); 

$wp_query = new WP_Query(
    array(
     'post_type' => array('ads' , 'product'), 
     'paged' => $paged, 
     'post__in' => $ids 
    ) 
); 

それがお役に立てば幸いです。

関連する問題