按最近30天的使用频率对分类术语进行排序

时间:2011-09-20 作者:Ján Bočínec

我想知道如何根据过去30天在帖子中的使用频率来对一些分类中的术语进行排序。我要寻找的是如何添加“orderby”参数或在术语列表上应用数组比较或一些智能SQL选择的最佳方法。我知道这将在表中包含一些额外的列来存储计数和上次更改(添加)的时间数据。有什么建议吗?

1 个回复
最合适的回答,由SO网友:Drew Gourley 整理而成

首先,您必须添加该表。

如果要在插件中编写此内容,请按照以下方式执行:

function customtaxorder_init() {
    global $wpdb;
    $init_query = $wpdb->query("SHOW COLUMNS FROM $wpdb->terms LIKE \'term_order\'");
    if ($init_query == 0) {
        $wpdb->query("ALTER TABLE $wpdb->terms ADD `term_order` INT( 4 ) NULL DEFAULT \'0\'");
    }
}
register_activation_hook(__FILE__, \'customtaxorder_init\');
register\\u activation\\u hook只允许在插件被激活时运行,如果不需要,函数中的条件会阻止它发生。现在,您有了一个存储术语顺序的位置。

如果你在你的功能中这样做。主题的php文件,您可以通过add\\u操作将其附加到“init”,运行一次,然后将其注释掉。还有很多其他方法可以做到这一点,但这只是一种快速方便的方法,可以将该字段放入表中。

接下来,我们需要一种方法来应用该顺序。

function customtaxorder_applyorderfilter($orderby, $args) {
    if($args[\'orderby\'] == \'term_order\')
        return \'t.term_order\';
    else
        return $orderby;
}
add_filter(\'get_terms_orderby\', \'customtaxorder_applyorderfilter\', 10, 2);
这使我们能够在任何分类查询的“orderby”子句中使用“term\\u order”。

最后一步是将该数字应用于术语,以便实际排序。

我想我们应该在每次更新帖子时都更新这个,那么“save\\u post”操作挂钩如何呢。

function customtaxorder_update( $id ) {
    global $wpdb;
    $post_count = 0;
    $post_type = get_post_type( $id );
    $taxonomies = wp_get_object_taxonomies( $post_type );
    $args = array(\'fields\' => \'ids\');
    $terms = wp_get_object_terms( $id, $taxonomies, $args );
    $thirtydaysago = date_i18n(\'U\', strtotime(\'-30 days\') );
    foreach( $terms as $term ) :
        $querystr = "SELECT count FROM $wpdb->term_taxonomy, $wpdb->posts, $wpdb->term_relationships WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = $term AND $wpdb->posts.post_status = \'publish\' AND $wpdb->posts.post_date > $thirtydaysago";
        $result = $wpdb->get_var($querystr);
        $post_count = $result;
        $wpdb->query("UPDATE $wpdb->terms SET term_order = \'$post_count\' WHERE term_id =\'$term\'");
    endforeach; 
}
add_action(\'save_post\', \'customtaxorder_update\');
“save\\u post”操作通过它运行post ID,因此我们所要做的就是在函数中利用它,首先获取它的post类型,然后获取与它相关的所有分类法,然后获取适用于该post的所有相关分类法的所有术语。设置wp\\u get\\u object\\u terms为我们提供一个ID数组,并循环遍历它们,从类别中获取post计数,然后将其分配给我们创建的term\\u order字段。

这应该能帮到你。请确保“orderby”=>“term\\u order”和“order”=>“DESC”,因为您希望以较高的数字作为第一位!

享受

Note: I\'ve added the necessary code to make this get the post counts from the last 30 days.

结束

相关推荐

Order posts by years

我的网站上有帖子(自定义帖子类型)。我想创建一个归档页面,显示按年份排序的归档帖子。e、 g:2010年*第3条来了*第2条来了*第1条来了2011年*第3条来了*第2条来了*第1条来了当然还有帖子的链接。我觉得很简单,但是我在网上找不到任何简单的东西。它还需要手工编码,以便我可以轻松地设置样式。非常感谢您的帮助Gil