このクエリを使用して、特定のpost_type
を持つすべての投稿を取得します
SELECT *
FROM wp_posts
WHERE post_type = 'product';
説明したように ここ カテゴリはwp_posts
テーブルではなくタームテーブルにありますwp_terms
wp_term_relationships
wp_term_taxonomy
私が考えていたカテゴリのためにすべてのテーブルを検索して、私が見つけることができたカテゴリの唯一のインスタンスは以下のカラムを含むwp_terms
テーブルにありました
他のテーブルでこれとの相互参照を探し、どういうわけかそれらをwp_postsに関連付けると、複雑な問題が発生します。
私の考えはterm_id
それが外部キーのように見えるので探しているべきですが、その唯一の例はwp_term_taxonomy
にあり、私が私のカテゴリに関連する表で見つけることができる唯一の情報(またはむしろterm_id
)は
ですから私がここから得られる唯一の情報は私のterm_id
taxonomy
がproduct_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
テーブル行のみを取得するようにクエリを変更することさえ可能ですか?
理解した。あなたがWordPressの中でこれをやろうとしているならば、@ belinusはおそらくあなたのための解決策です。
生のSQLクエリだけで遊ぶことができますが、これを少し修正して、特定のカテゴリのすべての製品を返します。
これを行うには、3つのテーブルが必要です。wp_posts
wp_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_terms
name
列を検索するとこれを見つけることができ、それは関連する用語idを返します。
必要に応じて複数のカテゴリを返すこともできます。たとえば、WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99)
のようにWHERE
句でカンマで区切るだけです。
これは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();
関数呼び出しを含める必要があります。
クエリを作成しました。これを使用して、関連するすべてのカテゴリを検索できます
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に置き換えるだけです