query_posts()实现两个自定义字段meta_key组合查询

 2016-03-20 07:46:47  525 人阅读  17 条评论

投放广告联系   诚邀合作伙伴   赞助我们   公告栏   赞助光荣榜

前天在折腾投稿专题的时候,其中一个投稿文章的点击榜折腾得我欲死欲仙,前前后后试了N种方法,也在网上搜索了很久都未能解决,幸好最终在张戈博主的帮助下,成功实现了这个投稿文章的点击榜。今天,主要就是跟大家分享一下其中的实现办法。

query_posts()实现两个自定义字段meta_key组合查询

问题背景

本站的投稿文章都会添加一个自定义字段tougao,而统计文章阅读数的也有一个自定义字段views,想要实现投稿文章的点击榜必须同时满足两个自定义字段并且以自定义字段views的值来排序才行。

如果是仅仅根据一个自定义字段,并以该字段的值来排序,这个实现起来非常简单,我们现在所用的最火文章或年度文章之类的就是这个情况。代码如下:

  1. query_posts( array(
  2.     'showposts' => 16,
  3.     'ignore_sticky_posts'=> 1,
  4.     'meta_key' => 'views',
  5.     'orderby' => 'meta_value_num'
  6.     )
  7. );
  8.  while (have_posts()) : the_post();
  9. //循环内容
  10. endwhile; wp_reset_query();

但是想要实现同时对两个自定义字段进行排序并以其中一个字段的值来排序就比较麻烦,这个时候就需要用到SQL语句了。

query_posts()以两个自定义字段meta_key进行组合查询的解决办法:

方法一(不推荐):这个办法是我自己想起来的,也是用SQL语句实现,但是效率太低,所以在此不推荐,只说一下实现思路:就是先通过阅读数这个字段views进行从高到低排序,然后在得出的文章列表中进行判断投稿文章字段tougao,如果这个字段存在就输出该篇文章,要不然就跳过,一直等到输出够指定篇数(如16篇)后就跳出这个循环。

方法二(重点推荐):这个方法就比较有效率多了,它是先判断是否为投稿文章,然后再对阅读数进行排序。具体实现代码如下:

  1. $query = "SELECT wposts.*, wpostmeta1.*, wpostmeta2.* 
  2. FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2
  3. WHERE wposts.ID = wpostmeta1.post_id
  4. AND wposts.ID = wpostmeta2.post_id
  5. AND wpostmeta1.meta_key = 'date'
  6. AND wpostmeta2.meta_key = 'time'
  7. ORDER BY wpostmeta1.meta_value ASC,
  8.          wpostmeta2.meta_value ASC";
  9. $results = $wpdb->get_results($query);
  10. foreach ( $results as $result ) {
  11.          //循环内容
  12. }

以上代码来自:模板兔

老实说,对于第二种方法我真的想不到,从未想过一个数据表可以命名为两个表,然后同时进行判断得出自己想要的结果,真的是长知识了。

最后,我想在此再次多谢张戈博主,如果不是他帮忙我都不知道还要折腾到什么时候才能实现这个功能。最重要的是我花在网上搜查资料的时间也非常多,但是未能找到一篇真正有用的文章,还是张戈博主顺便教了一下如何搜索到有用的文章,真的是受益匪浅,再次感谢!

2016年10月10日更新

方法三:利用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;

以上代码来自:知更鸟

如果文章对你有帮助,请赞赏支持boke112导航发展!

本文地址:http://boke112.com/2863.html
文章标签: ,   ,  
关注我们:请关注一下我们的微信公众号:扫描二维码,公众号:aiboke112
版权声明:本文为原创文章,版权归  所有,欢迎分享本文,转载请保留出处!
WordPress/zblogPHP免费响应式博客主题Blogs

 发表评论


  1. 云落
    云落 【小白】 @回复

    我记得好像可以用数组的

    • boke112导航
      boke112导航【村长】2016-04-04 21:43  回复

      @云落有很多例子也是说用数组,不过当初折腾了很久都没有成功,后来才用SQL实现

  2. 静松太极拳
    静松太极拳 【状元】 @回复

    学习了 我也遇到一些超自已能力的问题 有空请教一下张戈博主

  3. TeachCourse
    TeachCourse 【书童】 @回复

    看完后,更加确定自定义字段的好处,方便简单,按照需要定义,不错!!

  4. 星岩博客
    星岩博客 【秀才】 @回复

    学习了,相信以后能够用得着。

  5. 小C博客
    小C博客 【进士】 @回复

    不错!!学习学习!!为以后折腾做基础铺垫!!

  6. 阅读纵横
    阅读纵横 【进士】 @回复

    这篇文章很好,里面的方法可以推广到很多需要自定义(折腾)的地方。自定义主要就是加meta_key,再查数据库。 [强] [强]

    • boke112导航
      boke112导航【村长】2016-03-21 09:27  回复

      @阅读纵横嗯,是的,而且有时候为了需要,一篇文章会出现几个自定义字段,所以掌握相应的查询技术还是有必要的

  7. 新成
    新成 【状元】 @回复

    张戈很厉害

  8. osblog
    osblog 【举人】 @回复

    好久没来了

  9. 玉满斋
    玉满斋 【尚书】 @回复

    支持一下先!

  10. 明月登楼
    明月登楼 【王爷】 @回复

    学习了,不错,这个代码值得收藏的!

  11. 网际电脑
    网际电脑 【状元】 @回复

    没赶上第一了

  12. Koolight
    Koolight 【尚书】 @回复

    技术,越来越看不懂了。