找回密码
 免费注册

让query_posts() 或 wp_query()同时使用多个 meta_key与 meta_value 来...

[复制链接]
admin 发表于 2021-6-11 18:39:27 | 显示全部楼层 |阅读模式
我有很多文章,他们同时使用了同样的自定义字段与对应的值,现在我想输出使用了同样的自定义字段与其值来做全局循环,查了很久,都没找到方法,还是google给力。

让query_posts() 或 wp_query()同时使用多个 meta_key与 meta_value 来查询多个自定义字段与值。

  1. $args = array(
  2.     'posts_per_page' => 10,      // 显示多少条
  3.     'paged' => $paged,           // 当前页面
  4.     'orderby' => 'date',         // 时间排序
  5.     'order' => 'desc',           // 降序(递减,由大到小)     
  6.     'meta_query' => array(
  7.         array(
  8.             'key' => 'key1',     // 你的使用的自定义字段1
  9.             'value' => 'value1'  // 自定义字段1对应的值
  10.         ),
  11.         array(
  12.             'key' => 'key2',     // 你的使用的自定义字段2
  13.             'value' => 'key2'    // 自定义字段2对应的值
  14.         )
  15.     )
  16. );
  17. query_posts($args);
  18. while (have_posts()) : the_post();
  19.     // 循环内容;
  20. endwhile;

复制代码



回复

使用道具 举报

 楼主| admin 发表于 2021-6-11 18:43:36 | 显示全部楼层
  1. $ongoingSoon = array(
  2.         'category_name' => 'event',
  3.         'meta_key' => 'End Date',
  4.         'orderby' => 'meta_value',
  5.         'order' => 'ASC',
  6.         'meta_query' => array(
  7.             'relation' => 'AND',
  8.             array(
  9.                 'key' => 'Start Date',
  10.                 'value' => $today,
  11.                 'compare' => '>='
  12.             ),
  13.             array(
  14.                 'key' => 'End Date',
  15.                 'value' => $nexttwoweeks,
  16.                 'compare' => '<='
  17.             ),
  18.             array(
  19.                 'key' => 'Ongoing',
  20.                 'value' => 'Yes'
  21.             )
  22.         )
  23.     );
复制代码


回复

使用道具 举报

 楼主| admin 发表于 2021-6-11 19:44:52 | 显示全部楼层
原理是先把所有数据的ID查出来,再把限制条件的ID查出来,最后根据条件只返回限制的ID(经初步分析wordresss在得到ids集后 又会调用post方法去array_map的方式循环调用post数据,不知道有什么用意)

  1. string(217) "SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_date DESC LIMIT 0, 10"

  2. string(645) "SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )  INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id ) WHERE 1=1  AND (
  3.   ( wp_postmeta.meta_key = 'key1' AND wp_postmeta.meta_value = 'value1' )
  4.   AND
  5.   ( mt1.meta_key = 'key2' AND mt1.meta_value = 'key2' )
  6.   AND
  7.   ( mt2.meta_key = 'term_tpl' AND mt2.meta_value = 'index' )
  8. ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10"

  9. string(176) "SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.ID IN (5) AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish'))  ORDER BY wp_posts.post_date DESC "
复制代码

关键就是纵表竖表查询的语句
  1. SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) WHERE 1=1  AND (
  2.   ( wp_postmeta.meta_key = 'term_tpl' AND wp_postmeta.meta_value = 'index' )
  3.   AND
  4.   ( mt1.meta_key = 'term_hook' AND mt1.meta_value = 'abcd' )
  5. ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date ASC LIMIT 0, 4
复制代码

网上资料参考
  1. SELECT wp.*, wpm1.meta_value AS `propert_type`,
  2. wpm2.meta_value AS `property_amount`
  3. FROM
  4. wp_posts  wp
  5. LEFT JOIN wp_postmeta wpm1 ON (wp.ID = wpm1.post_id)
  6. LEFT JOIN wp_postmeta wpm2 ON (wp.ID = wpm2.post_id)
  7. INNER JOIN wp_term_relationships wptr ON (wp.ID = wptr.object_id)
  8. INNER JOIN `wp_term_taxonomy` wptt ON (wptr.term_taxonomy_id = wptt.term_taxonomy_id)
  9. INNER JOIN wp_terms wpt ON (wptt.term_id = wpt.term_id)

  10. WHERE wpt.term_id = '12' AND wptr.term_taxonomy_id = '12'
  11. AND  wp.post_type = 'property' AND wp.post_status = 'publish'
  12. AND wpm1.meta_key = 'property_land_type'
  13. AND wpm2.meta_key = 'property_amount'
  14. AND REPLACE( REPLACE(wpm2.meta_value, ',', ''), '"', '' ) >= 1
  15. AND wpm1.meta_value IN ('L','H','C') AND  wpm1.meta_value IS NOT NULL AND  wpm2.meta_value IS NOT NULL
  16. GROUP BY wp.ID ORDER BY REPLACE( REPLACE(wpm2.meta_value, ',', ''), '"', '' ) DESC
  17. LIMIT 0, 10
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|Archiver|手机版|小黑屋|信息共享网

GMT+8, 2024-5-16 10:00 , Processed in 0.118695 second(s), 35 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表