web-dev-qa-db-ja.com

特定の分類用語を使った投稿をデータベースに問い合わせる方法

分類用語food-and-beverageに関連付けられている投稿のみのデータを返すように選択クエリを作成したい

SELECT wp_postmeta . * , wp_posts.post_name
FROM wp_posts, wp_postmeta, wp_terms, wp_term_relationships
WHERE wp_posts.post_type =  'projects'
AND wp_posts.post_status =  'publish'
AND wp_posts.ID = wp_postmeta.post_id
AND wp_term_relationships.object_id = wp_posts.ID
AND wp_term_relationships.term_taxonomy_id = wp_terms.term_id
AND wp_terms.slug =  'food-and-beverage'
ORDER BY wp_posts.ID DESC 

私には未知の理由で、これはfood-and-beverageが選択されていない投稿を返しています

以下の答えで証明されているように、これは理想的なアプローチではありませんが、コードのリファクタリング(これはSQLの生成であり、それ以上のものがあります)は永遠にかかると私は確約しました。

編集


私のやり方は間違っているということは誰もが(私も含めて)合意しているように思われるので、しぶしぶリファクタリングを試みるつもりです。

しかし、誰かが私のために手っ取り早い解決策をまとめることができる場合に備えて、当分の間質問を未解決のままにするつもりです(私は喜んであなたにいくつかの賞金ポイントを落とします)。

大胆/狂気のために、ここにソースの大きな塊を持つ要旨があります。 https://Gist.github.com/2950395

私はajaxにそれをPOST変数として "フィルタ"するいくつか渡します。

1
Zach Lysobey

(私はあなたがこれから傾いていることを理解しています、しかしあなたがそれを動かすことができるなら多分それは価値があります。WP_Queryのための3.4の最近の性能改善でこれは価値があるかもしれません。

これが二次ループである場合、WP_Queryが正しい判断です。そうでなければ、 pre_get_posts のようになるでしょう。

WP_Queryを使うときは、次のことを確認してください。

  1. 新しいクエリを保存するために予約されたグローバル変数を使用しません。 (たとえば、多くの人が新しいクエリを$wp_queryとして保存することで問題を引き起こし、その後既存のクエリオブジェクトを上書きします。
  2. あなたは正しいループフォーマットを使います。 $my_custom_query->have_posts();
  3. 最後に、tagtax var(非推奨)を使用するのではなく、tax_queryを使用します。

あなたの例を見て、これは提案されたループです:

$food_query_args = array(
    'post_type' => 'projects',
    'tax_query' => array(
        array(
            'taxonomy' => 'post_tag', // or the name of your custom taxonomy
            'field' => 'slug',
            'terms' => 'food-and-beverage' // FYI, it's more stable imho to use the ID if you can. If you do, that switch 'slug' in the preceding line to 'id'
        )
    )
);

$food_query = new WP_Query( $food_query_args );

if( $food_query->have_posts() ) : while( $food_query->have_posts() ) : $food_query->the_post();

    // STUFF

endwhile; endif; wp_reset_postdata();
3
mrwweb

これらのSQLクエリを書く必要はありません。あなたはWP_Query APIを利用することができます。

以下は、タグに「飲食物」という用語が含まれている投稿を表示します。

$query = new WP_Query( array( 'tag' => 'food-and-beverage' ) );

別の分類法を使用している場合は、tagの代わりにそれを使用してください。

他のオプションを使用して投稿をフィルタリングする必要がある場合は、WP_QueryのAPIドキュメント全体をここで確認できます。 http://codex.wordpress.org/Class_Reference/WP_Query

それはあなたがSQLを書くことからあなたを救うでしょう。

2
HungryCoder