前天在折腾投稿专题的时候,其中一个投稿文章的点击榜折腾得我欲死欲仙,前前后后试了N种方法,也在网上搜索了很久都未能解决,幸好最终在张戈博主的帮助下,成功实现了这个投稿文章的点击榜。今天,主要就是跟大家分享一下其中的实现办法。
问题背景
本站的投稿文章都会添加一个自定义字段tougao,而统计文章阅读数的也有一个自定义字段views,想要实现投稿文章的点击榜必须同时满足两个自定义字段并且以自定义字段views的值来排序才行。
如果是仅仅根据一个自定义字段,并以该字段的值来排序,这个实现起来非常简单,我们现在所用的最火文章或年度文章之类的就是这个情况。代码如下:
- query_posts( array(
- ‘showposts’ => 16,
- ‘ignore_sticky_posts’=> 1,
- ‘meta_key’ => ‘views’,
- ‘orderby’ => ‘meta_value_num’
- )
- );
- while (have_posts()) : the_post();
- //循环内容
- endwhile; wp_reset_query();
但是想要实现同时对两个自定义字段进行排序并以其中一个字段的值来排序就比较麻烦,这个时候就需要用到SQL语句了。
让query_posts()以两个自定义字段meta_key进行组合查询的解决办法:
方法一(不推荐):这个办法是我自己想起来的,也是用SQL语句实现,但是效率太低,所以在此不推荐,只说一下实现思路:就是先通过阅读数这个字段views进行从高到低排序,然后在得出的文章列表中进行判断投稿文章字段tougao,如果这个字段存在就输出该篇文章,要不然就跳过,一直等到输出够指定篇数(如16篇)后就跳出这个循环。
方法二(重点推荐):这个方法就比较有效率多了,它是先判断是否为投稿文章,然后再对阅读数进行排序。具体实现代码如下:
- $query = “SELECT wposts.*, wpostmeta1.*, wpostmeta2.*
- FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2
- WHERE wposts.ID = wpostmeta1.post_id
- AND wposts.ID = wpostmeta2.post_id
- AND wpostmeta1.meta_key = ‘date’
- AND wpostmeta2.meta_key = ‘time’
- ORDER BY wpostmeta1.meta_value ASC,
- wpostmeta2.meta_value ASC”;
- $results = $wpdb->get_results($query);
- foreach ( $results as $result ) {
- //循环内容
- }
以上代码来自:模板兔
老实说,对于第二种方法我真的想不到,从未想过一个数据表可以命名为两个表,然后同时进行判断得出自己想要的结果,真的是长知识了。
最后,我想在此再次多谢张戈博主,如果不是他帮忙我都不知道还要折腾到什么时候才能实现这个功能。最重要的是我花在网上搜查资料的时间也非常多,但是未能找到一篇真正有用的文章,还是张戈博主顺便教了一下如何搜索到有用的文章,真的是受益匪浅,再次感谢!
2016年10月10日更新
方法三:利用query_posts() 或 wp_query()同时使用多个 meta_key与 meta_value 来查询多个自定义字段与值,调用输出具有相同自定义栏目名称及值的文章,用下面的代码替换默认的主循环,并修改其中的自定义栏目名称及值。
- $args = array(
- ‘posts_per_page’ => 10, // 显示多少条
- ‘paged’ => $paged, // 当前页面
- ‘orderby’ => ‘date‘, // 时间排序
- ‘order’ => ‘desc’, // 降序(递减,由大到小)
- ‘meta_query’ => array(
- array(
- ‘key’ => ‘key1’, // 你的使用的自定义字段1
- ‘value’ => ‘value1’ // 自定义字段1对应的值
- ),
- array(
- ‘key’ => ‘key2’, // 你的使用的自定义字段2
- ‘value’ => ‘key2’ // 自定义字段2对应的值
- )
- )
- );
- query_posts($args);
- while (have_posts()) : the_post();
- // 循环内容;
- endwhile;
以上代码来自:知更鸟