web-dev-qa-db-ja.com

Wp_postsからカテゴリを取得するためのMySQLクエリ

このクエリを使用して、特定のpost_typeを持つすべての投稿を取得します

SELECT *
FROM wp_posts
WHERE post_type = 'product';

説明したように ここ カテゴリはwp_postsテーブルではなくタームテーブルにありますwp_termswp_term_relationshipswp_term_taxonomy

私が考えていたカテゴリのためにすべてのテーブルを検索して、私が見つけることができたカテゴリの唯一のインスタンスは以下のカラムを含むwp_termsテーブルにありました

  • term_id
  • ナメクジ
  • term_group

他のテーブルでこれとの相互参照を探し、どういうわけかそれらをwp_postsに関連付けると、複雑な問題が発生します。

私の考えはterm_idそれが外部キーのように見えるので探しているべきですが、その唯一の例はwp_term_taxonomyにあり、私が私のカテゴリに関連する表で見つけることができる唯一の情報(またはむしろterm_id)は

  • term_taxonomy_id
  • term_id
  • 分類学
  • 説明
  • カウント

ですから私がここから得られる唯一の情報は私のterm_idtaxonomyproduct_catであることを私に知らせることです。そしてcountにはこの特定のカテゴリーについての投稿がいくつあるかを教えてくれます。

MySQLについて少し知っていれば、これを実行する希望があるかどうかはわかっています。クエリを変更してJOINを実行する必要があります。

しかし、私は正確に私が縛り付けることができるものに関する非常に限られた情報を見つけるだけです。

これがwp_postsの構造です。

 `wp_posts` (
 `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
 `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_content` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish',
 `comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
 `ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
 `post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_content_filtered` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
 `guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `menu_order` int(11) NOT NULL DEFAULT '0',
 `post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post',
 `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `comment_count` bigint(20) NOT NULL DEFAULT '0',
 PRIMARY KEY (`ID`),
 KEY `post_name` (`post_name`(191)),
 KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
 KEY `post_parent` (`post_parent`),
 KEY `post_author` (`post_author`)
 )

特定のカテゴリのwp_postsテーブル行のみを取得するようにクエリを変更することさえ可能ですか?

1
bbruman

理解した。あなたがWordPressの中でこれをやろうとしているならば、@ belinusはおそらくあなたのための解決策です。

生のSQLクエリだけで遊ぶことができますが、これを少し修正して、特定のカテゴリのすべての製品を返します。

これを行うには、3つのテーブルが必要です。wp_postswp_term_relationshipsおよびwp_term_taxonomy

SELECT *
FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE wp_term_taxonomy.term_id IN (307)
GROUP BY wp_posts.ID

307を結果を取得したいカテゴリのterm_idに置き換えるだけです。 wp_termsname列を検索するとこれを見つけることができ、それは関連する用語idを返します。

必要に応じて複数のカテゴリを返すこともできます。たとえば、WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99)のようにWHERE句でカンマで区切るだけです。

5
bbruman

これはWP_Queryクラスを使って行うことができます。あなたが探しているのがカテゴリに基づいてすべての投稿をつかむことだけであるならば、あなたはそれをIDまたはスラッグを使ってすることができます。

$args = array(
   'cat' => 1,
);

$new_query = new W_Query( $args );

OR

$args = array(
   'cat_name' => 'news',
);

$new_query = new W_Query( $args );

そこから、1つの例外を除いて、通常通りループを修正します。

<?php if ( $new_query->have_posts() ) : ?>
   <?php while ( $new_query->have_posts() ) : $new_query->the_post(); ?>
      // Post Code Goes Here
   <?php endwhile; ?>

   <?php wp_reset_postdata(); ?>

<?php else : ?>
    // No Posts Found
<?php endif; ??

グローバルな$ postをメインのクエリの値にリセットするwp_reset_postdata();関数呼び出しを含める必要があります。

1
Cedon

クエリを作成しました。これを使用して、関連するすべてのカテゴリを検索できます

SELECT *  FROM wpra_term_relationships 
INNER JOIN wpra_term_taxonomy ON (wpra_term_taxonomy.term_taxonomy_id=wpra_term_relationships.term_taxonomy_id AND wpra_term_taxonomy.taxonomy='category')
INNER JOIN wpra_terms ON (wpra_terms.term_id=wpra_term_taxonomy.term_id )
WHERE object_id='273960'

273960をPOST IDに置き換えるだけです

0
Deepak Sharma