【问题标题】:WordPress Query: Orderby number of matched rows?WordPress查询:按匹配行数排序?
【发布时间】:2015-08-02 17:27:19
【问题描述】:

每当帖子被点赞时,我的插件都会在 wp_postmeta 表中添加一行:

meta_id | post_id | meta_key | meta_value
27526   | 179     | liker    | 177
27527   | 182     | liker    | 343
27528   | 182     | liker    | 360
...

(meta_value 存储了喜欢这篇文章的用户的 ID)。

如何使用 WP_Query 查询所有帖子,按点赞数排序?

编辑:这是在 SQL 中执行此操作的方法,但我需要 WP_Query 等效项。

SELECT post_id, COUNT(*) AS likes
FROM wp_postmeta
WHERE meta_key='liker'
GROUP BY post_id
ORDER BY likes DESC

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    Check Wordpress Documentation

    您可以使用参数 orderby: 与字符串 meta_key

    <?php
    
    $args = array(
        'post_type' => 'your_post_type',
        'orderby'   => 'meta_value_num',
        'meta_key'  => 'liker',
    );
    $query = new WP_Query( $args );
    
    ?>
    

    【讨论】:

    • 这没有帮助。它只是按正常的时间顺序返回结果。
    • 您是否添加了“订单”键(ASC 或 DESC)?
    • 所有要做的就是按时间倒序排列它们。
    【解决方案2】:

    我有 3 页...

    ID | post_title
    ---+------------
    6  | Home
    65 | Contact   
    74 | Blog
    

    然后……

    meta_id | post_id | meta_key | meta_value
    --------+---------+----------+-----------
    403     | 6       | likes    | 100
    454     | 65      | likes    | 140
    478     | 74      | likes    | 50
    

    如果我跑...

    $args = array(
        'post_type' => 'page',
        'orderby'   => 'meta_value_num',
        'meta_key'  => 'likes',
        'order'     => 'DESC'
    );
    $query = new WP_Query( $args );
    
    while ( $query->have_posts() ) {
        $query->the_post();
        echo get_the_title() . "<br>";
    }
    

    输出是:

    Contact
    Home
    Blog
    

    如果我跑...

    $args = array(
        'post_type' => 'page',
        'orderby'   => 'meta_value_num',
        'meta_key'  => 'likes',
        'order'     => 'ASC'
    );
    $query = new WP_Query( $args );
    
    while ( $query->have_posts() ) {
        $query->the_post();
        echo get_the_title() . "<br>";
    }
    

    输出是:

    Blog
    Home
    Contact
    

    【讨论】:

    • 请阅读问题:the meta_value stores the ID of the user which liked this post。在您的示例中,您使用元字段来存储帖子的点赞数
    【解决方案3】:

    我想你可能会使用 SQL...

    SELECT post_id, COUNT(*) AS likes
    FROM wp_postmeta
    WHERE meta_key='liker'
    GROUP BY post_id
    ORDER BY likes DESC
    

    只有 ID:

    $your_ids = wp_list_pluck($your_sql_result, 'ID');
    

    然后像这样查询:

    $args = array(
        'post_status' => 'publish',
        'post__in' => $your_ids,
        'orderby' => 'post__in',
        'post_type' => 'page',
        'posts_per_page' => -1
    );
    $posts = get_posts($args);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 2015-08-13
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多