Order by most used tag

时间:2016-12-14 作者:Chris J Allen

是否可以按“最常用”标记排序标记页?

例如:

假设我有三个标签:苹果、橙色、香蕉和100条帖子。

这些帖子中有90个贴上了苹果标签,50个贴上了橙色标签,20个贴上了香蕉标签。(有些标记有多个标记。)

因此,我想先订购Apple tags在标签页上列出的帖子。

现在,我使用下面的查询按上次修改排序,但希望按所有帖子中使用最多的标记排序。

 $args = array(
            \'posts_per_page\' => 10, // Get 10 posts
            \'paged\' => $paged,
            \'post_type\' => \'post\',
            \'tag\' => $tag->slug,
            \'orderby\' => \'modified\'
        );

2 个回复
最合适的回答,由SO网友:CodeMascot 整理而成

恐怕orderby 分类术语后计数不可能通过WP_Query. See this answer. 因此,这里我为您编写了一个基于SQL的函数。它会根据帖子数量对你的帖子进行排序。

function the_dramatist_order_posts_by_tag_count( $args = \'\' ) {
    global $wpdb;
    $param = empty($args) ? \'post_tag\' : $args;
    $sql = $wpdb->prepare("SELECT posts.*, terms.name AS tag, count 
                            FROM {$wpdb->posts} AS posts
                                 LEFT JOIN {$wpdb->term_relationships} AS t_rel
                                            ON (t_rel.object_id = posts.ID)
                                 LEFT JOIN {$wpdb->term_taxonomy} AS t_tax
                                            ON (t_rel.term_taxonomy_id = t_tax.term_taxonomy_id)
                                 LEFT JOIN {$wpdb->terms} AS terms
                                            ON (terms.term_id = t_tax.term_id)
                            WHERE taxonomy LIKE \'%s\'
                            ORDER BY t_tax.count DESC, terms.name",
        array( $param )
    );

    return $wpdb->get_results($sql);
}
它将返回posts表中的所有数据post_tag 术语名称和此术语后计数。但是它有一个简单的限制,那就是如果你在多篇文章中有一个标签,那么每一篇文章都会出现多次post_tag 它所附加的术语。您可以使用GROUP BY posts.ID 删除重复的帖子,但它不会给你所有的条款和条款计数。因此GROUP BY posts.ID 功能如下所示-

function the_dramatist_order_posts_by_tag_count( $args = \'\' ) {
    global $wpdb;
    $param = empty($args) ? \'post_tag\' : $args;
    $sql = $wpdb->prepare("SELECT posts.*, terms.name AS tag, count 
                            FROM {$wpdb->posts} AS posts
                                 LEFT JOIN {$wpdb->term_relationships} AS t_rel
                                            ON (t_rel.object_id = posts.ID)
                                 LEFT JOIN {$wpdb->term_taxonomy} AS t_tax
                                            ON (t_rel.term_taxonomy_id = t_tax.term_taxonomy_id)
                                 LEFT JOIN {$wpdb->terms} AS terms
                                            ON (terms.term_id = t_tax.term_id)
                            WHERE taxonomy LIKE \'%s\'
                            GROUP BY posts.ID
                            ORDER BY t_tax.count DESC, terms.name",
        array( $param )
    );
    return $wpdb->get_results($sql);
}
使用更适合您需要的。

此功能适用于post_tag 默认情况下的分类。如果要将其用于其他分类法,只需将其作为参数传递,如the_dramatist_order_posts_by_tag_count( \'category\' )

你最好做一个print_r 在将此函数用于生产之前,了解其数据结构。

希望这有帮助。

SO网友:VINICIUS HENRIQUE MAGALHAES

这段简单的代码就是您想要的。

$tags = get_tags( array(\'orderby\' => \'count\', \'order\' => \'DESC\') );

foreach ( (array) $tags as $tag ) {
  echo \'<li><a href="\' . get_tag_link ($tag->term_id) . \'" rel="tag">\' . $tag->name . \' (\' . $tag->count . \') </a></li>\';
}

相关推荐

Category tags with comma's

我的代码中有以下变量来调用类别的标题。<?php $categories = get_the_terms($custom_args->ID, \'veranstaltungen-category\'); foreach ($categories as $category) { $cats .= $category->name . \', \'; echo rtrim($ca