获取自定义帖子类型的最流行术语

时间:2012-04-14 作者:Dan

我在当前项目中遇到了另一个小麻烦!

我正在尝试列出(并链接)到存档页面,查找自定义帖子类型中最常用的4个术语。我有这个;

get_terms(\'trade\',array(\'orderby\'=>\'count\',\'order\'=>\'DESC\',\'number\'=>4))
。。这是正确的,但我似乎找不到一种方法将其与特定的帖子类型联系起来。网站上有6种自定义帖子类型的“交易”分类法,我需要找出每种类型的前4名。我开始查看这些表,发现我可能可以按post类型进行查询,并按wp\\U term\\U分类表中的“count”列进行排序。然而,这确实是对MySQL的限制,因为我不知道如何高效地编写如此复杂的查询。

我已经这样做了4个多小时了,我认为没有任何帮助,一分钱是不会贬值的!

谢谢你看。。。

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

如果我是你,我有两个选择。两者都取决于这样一个事实,即thsi是一个固有的昂贵计算,mysql的任何欺骗都不会减少您所拥有数据的负载。

所以

Option 1, do it the expensive way and store the data for a rainy day

你将不得不吞下计算这个的成本,但你不必一次又一次地这样做。以漫长而昂贵的方式进行计算,并将post ID保存在一个具有较长过期时间的瞬态中。你将有一次命中,然后它以超快的速度运行,直到瞬变结束。

对于奖励积分,请每天在wp cron任务中计算一次,并将到期时间设置为两天,

Option 2, create helper data

您有1个分类法和6个帖子类型。要解决这个问题,请创建另一个分类法,一个没有GUI的隐藏分类法。此分类法将仅附加到所需的帖子类型。

然后,钩住术语创建/删除/分配钩子,并使用它们复制分类数据,但仅针对该帖子类型。这样,当您想要创建列表时,您可以查询第二个隐藏的分类法,它充当排序缓存。在你做出改变的过程中,你要做的所有艰苦的工作就是找出哪个术语有多少个

仅仅因为您不知道如何有效地处理现有数据,并不意味着有解决方案,但更改提供给您的数据有时会带来很大的不同,这并不总是意味着添加更多缓存。

下面是一个克隆分类法的粗略示例:

class Clone_Taxonomy {
    public $from = \'\';
    public $to = \'\';
    public function __construct($from, $to){
        $this->from = $from;
        $this->to = $to;
        add_action( \'set_object_terms\', array(&$this,\'sync_set_object_terms\'),100,6);
    }

    public function sync_set_object_terms($object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids){
        if($taxonomy == $this->from){
            // duplicate to ovum_research_authors taxonomy
            //$terms2 = array();
            $r = wp_set_object_terms( $object_id, $terms, $this->to, $append );
            if(!is_array($r)){
                // things failed for whatever reason
            }
        }

    }
}

$clone_tax = new Clone_Taxonomy(\'taxonomy1\',\'taxonomy2\');
在检查分类法后再进行一次检查,以确定它是哪种帖子类型,如果帖子类型匹配,请克隆该术语,否则不匹配。

SO网友:Dan

所以,在花了很多时间之后,我似乎找到了一种适合我的方法。我采纳了Tom的克隆想法和他的建议,制定了第二个分类法,这一分类法在我们看来很重要,但仍然可以被质疑。

这是我在插件文件中注册的唯一分类法,使用一个链接到包含各种数据位的数组的循环;

foreach($all_post_types as $trade){
    $cpt = $trade[\'post_type_name\'];
    $tax_args = array(
       \'query_var\' => $cpt,
       \'public\' => 0,
       \'labels\' => array( // set up the labels for this 
          \'name\' => $trade[\'plural\'].\' Hidden\'
        )
);
register_taxonomy($cpt.\'_tax\',$cpt,$tax_args);
}
完成后,我添加了这是我的函数。php文件,以便我可以通过复制(或按照Tom的建议克隆)主分类法中的术语来向新分类法添加额外的数据。可能有一种更有效的方法来编写其中的一些内容,但这似乎是我的PHP目前所能做到的。。。

function add_hidden_tax($post_ID) {
global $wpdb;
$post_type = get_post_type($post_ID);
//print_r( $post_type );
if($post_type == \'pt_builders\' 
|| $post_type == \'pt_carpenters\'
|| $post_type == \'pt_decorators\'
|| $post_type == \'pt_electricians\'
|| $post_type == \'pt_gardeners\'
|| $post_type == \'pt_plumbers\'
){
    $current_terms = get_the_terms($post_ID,\'trade\');
    //make an array to hold the terms to be cloned...
    $to_be_cloned = array();
    if($current_terms){
        foreach($current_terms as $key){
            $to_be_cloned[] =  $key->name;  
        }
    }
    wp_set_object_terms($post_ID,$to_be_cloned,$post_type.\'_tax\',0);//the false statement overriddes the current terms with each save, instead of just adding to them.  
} 
}
add_action(\'save_post\', \'add_hidden_tax’);
这对我来说很好,因为这些术语是自动编写的,并随任何自定义的后期发布或修订而更新。

最后,我可以查询我的前4个术语并链接到存档页面;

$term_args = array(
                        \'number\' => 4,
                        \'orderby\' => \'count\',
                        \'order\' => \'DESC\'
                        );
                        $terms = get_terms(array(\'pt_carpenters_tax\'),$term_args);
                        if($terms != \'\'){
                            echo \'<ul class="green_arrows">\';
                            foreach($terms as $skill){
                                echo \'<li><a href="/trade/\'. $skill->slug .\'">\'. $skill->name .\'</a></li>\';
                            }
                            echo \'</ul>\';
                        }
也许我可以用一种更好的方法,但不管怎样,它是有效的:D

非常感谢汤姆的反复输入。

结束

相关推荐

添加_重写_规则和分页(PAGE和PAGE QUERY_VAR)的问题

我有一个名为location 我想为每个术语添加“新闻”和“市场”等部分,所以我的url看起来像/location/montreal/news/在我尝试添加分页之前,它工作得非常好。这是我的代码:add_action( \'init\', \'region_rewrite\' ); function region_rewrite() { global $wp; $wp->add_query_var( \'section\' );