求助:修改$wpdb get_results代码仅获取分类ID为2的文章
解决只获取分类ID为2的文章问题
你直接加AND term_taxonomy_id = 2无效的原因很明确:你的查询只关联了posts和postmeta表,而term_taxonomy_id字段属于wp_term_taxonomy表,同时文章与分类的关联还需要通过wp_term_relationships表来建立,必须把这两个表加入查询关联才能生效。
修改后的SQL查询代码
<?php // 仅获取分类ID为2的发布状态文章 $my_query = $wpdb->get_results (" SELECT DISTINCT {$table_prefix}posts.*, {$table_prefix}postmeta.meta_value FROM `{$table_prefix}posts` JOIN {$table_prefix}postmeta ON {$table_prefix}posts.ID = {$table_prefix}postmeta.post_id JOIN {$table_prefix}term_relationships ON {$table_prefix}posts.ID = {$table_prefix}term_relationships.object_id JOIN {$table_prefix}term_taxonomy ON {$table_prefix}term_relationships.term_taxonomy_id = {$table_prefix}term_taxonomy.term_taxonomy_id WHERE {$table_prefix}posts.post_status = 'publish' AND {$table_prefix}postmeta.meta_key = 'wpcf-data-nuo' AND {$table_prefix}term_taxonomy.term_taxonomy_id = 2 AND {$table_prefix}term_taxonomy.taxonomy = 'category' -- 确保筛选的是文章分类,排除标签等其他分类法干扰 ORDER BY IF({$table_prefix}postmeta.meta_value = '' OR {$table_prefix}postmeta.meta_value IS NULL, 1, 0), {$table_prefix}postmeta.meta_value ASC LIMIT 12 "); foreach($my_query as $post) { setup_postdata($post); // 这里编写你的文章输出逻辑 } wp_reset_postdata(); // 别忘了重置postdata,避免影响后续查询 ?>
关键修改点说明
- 新增
wp_term_relationships表关联:用来连接文章ID(object_id)和分类关联ID(term_taxonomy_id) - 新增
wp_term_taxonomy表关联:用来精准筛选指定分类ID(term_taxonomy_id = 2),同时通过taxonomy = 'category'确保我们筛选的是文章分类,而非标签、自定义分类法等 - 使用
DISTINCT:避免同一篇文章属于多个分类时被重复查询返回
更推荐的WP_Query方案(无需直接操作数据库)
在WordPress中,更规范的做法是使用WP_Query类来实现查询,这样不需要手动编写SQL,也更兼容WordPress版本更新:
<?php $args = array( 'post_status' => 'publish', 'posts_per_page' => 12, 'category__in' => array(2), // 指定目标分类ID为2 'meta_key' => 'wpcf-data-nuo', 'orderby' => array( // 实现和原SQL一致的排序逻辑:空值/Null排后面,其余按meta_value升序 'meta_value' => 'ASC', 'meta_query' => array( 'position' => 'DESC' ) ), 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'wpcf-data-nuo', 'value' => '', 'compare' => '=' ), array( 'key' => 'wpcf-data-nuo', 'value' => null, 'compare' => 'IS NULL' ), array( 'key' => 'wpcf-data-nuo', 'compare' => 'EXISTS' ) ) ); $query = new WP_Query($args); if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); // 编写你的文章输出逻辑 } wp_reset_postdata(); } ?>
这个方案无需关心底层数据库表结构,WordPress会自动处理关联逻辑,后期维护更省心。
内容的提问来源于stack exchange,提问作者modeman
相关产品推荐
相关产品推荐

