web-dev-qa-db-ja.com

カスタム投稿タイプの最も人気のある用語を入手する

現在のプロジェクトでもう1つ小さな岩を打ったことがあります。

カスタム投稿タイプで最も使用されている上位4つの用語のアーカイブページに一覧表示(およびリンク)しようとしています。私はこれを持っています。

get_terms('trade',array('orderby'=>'count','order'=>'DESC','number'=>4))

正しい方向に沿っていますが、これを特定の投稿タイプに固定する方法を見つけることができないようです。 Webサイト上の6つのカスタム投稿タイプにまたがって「トレード」と呼ばれる1つの分類があります。それぞれの上位4つを見つける必要があります。テーブルを調べてみたところ、おそらく投稿タイプでクエリし、wp_term_taxonomyテーブルの“ count”列で並べ替えることができるとわかった。しかし、そのような複雑なクエリのようなものを書くための効率的な方法を私は知らないので、それは本当に私のMySQLの限界を押し上げています。

私は4時間かそこらのためにこれに取り組んできました、今、私はペニーがいくらかの助けなしで下がることになるとは思わない!

ご覧いただきありがとうございます。

1
Dan

私があなただったら、私は2つの選択肢があると思います。事実thsiに左右される両方とも本質的に高価な計算であり、MySQLトリックがあなたが持っているデータによる負荷を減らすことはありません。

そう

オプション1、それを高価な方法で行い、雨の日のデータを保存する

あなたはこれを計算するコストを飲み込む必要があるでしょう、しかしあなたはそれを何度も何度もする必要はありません。費用のかかる方法で計算し、有効期限の長い一時IDで投稿IDを保存します。あなたは一過性の打撃を持ち、それに続いてトランジェントがなくなるまで超高速で走ります。

ボーナスポイントについては、1日1回wp-cronタスクで計算を行い、有効期限を2日に設定します。

オプション2、ヘルパーデータを作成する

1つの分類法と6つの投稿タイプがあります。これを回避するには、別の分類法、GUIなしの隠し分類法を作成します。この分類法は、希望する投稿タイプにのみ添付されます。

次に、「作成/削除/割り当て」という用語にフックし、それらを使用して分類データを複製しますが、その投稿の種類のみを表します。そうすることで、リストを作成したいときに、2つ目の隠された分類法を照会します。これは、ソートのキャッシュとして機能します。どの用語がどれだけあるかを判断するのに苦労するのは、変更を加えるたびに何が行われるかです。

自分が持っているデータの処理方法がわからないからといって、解決策があるわけではありませんが、利用可能になったデータを変更しても時々違いが出ることがあります。キャッシュ。

分類のクローンを作成する際の大まかな例を示します。

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');

分類をチェックした後に2番目のチェックを付けて、どの投稿タイプであるかを調べ、投稿タイプが一致する場合は用語を複製し、それ以外の場合は一致しません。

2
Tom J Nowell

それで、これに多くの時間を費やした後、私は私のために働く方法を見つけたようです。私はトムのクローンのアイデアと彼のアドバイスを受けて、私たちの見解に沿うがまだ問い合わせることができる2番目の分類法を作りました。

これは、さまざまなビットのデータを含む配列にリンクされたループを使用して、プラグインファイルに独自の分類法を登録することです。

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);
}

それが追加されたら、これが私のfunctions.phpファイルになるので、メインのタクソノミーからタームをコピー(またはTom Suggestedとして複製)して新しいタクソノミーに追加データを追加できます。もっと効率的にこれを書く方法があるかもしれませんが、これは私の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

彼の繰り返しの入力に対してTomに感謝します。

1
Dan