Erhalten Sie die beliebtesten Begriffe für einen benutzerdefinierten Beitragstyp

Ich habe in meinem aktuellen Projekt einen weiteren kleinen Stein getroffen!

Ich versuche, die Archivseite für die Top 4 am häufigsten verwendeten Begriffe für einen benutzerdefinierten Beitragstyp aufzulisten (und zu verlinken). Ich habe das;

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

..wise ist in der richtigen Richtung, aber ich kann nicht scheinen, einen Weg zu finden, um dies auf einen bestimmten Post-Typ festzuhalten. Es gibt eine Taxonomie namens “Trade” über 6 benutzerdefinierte Post-Typen auf der Website, ich muss die Top 4 für jeden herausfinden. Ich fing an, durch die Tabellen zu suchen und fand heraus, dass ich wahrscheinlich nach dem Post-Typ abfragen und nach der “count” -Spalte in der wp_term_taxonomy-Tabelle sortieren konnte. Allerdings stößt dies meine Grenzen mit MySQL an, weil ich keine effiziente Möglichkeit kenne, eine so komplexe Abfrage zu schreiben.

Ich bin jetzt schon 4 Stunden dabei, ich glaube nicht, dass der Penny ohne Hilfe runtergehen wird!

Danke für einen Blick …

Solutions Collecting From Web of "Erhalten Sie die beliebtesten Begriffe für einen benutzerdefinierten Beitragstyp"

Wenn ich Sie wäre, hätte ich zwei Möglichkeiten. Beide hängen von der Tatsache ab, dass dies eine inhärent teure Berechnung ist und keine Mysql-Tricks die Last mit den Daten reduzieren, die Sie haben.

Damit

Option 1, machen Sie es teuer und speichern Sie die Daten für einen regnerischen Tag

Du wirst die Kosten dafür bezahlen müssen, aber du musst es nicht immer und immer wieder tun. Berechnen Sie den langen teuren Weg und speichern Sie die Post-IDs in einem Transient mit einer langen Ablaufzeit. Du wirst einen einmaligen Treffer haben, gefolgt von einem superschnellen Lauf, bis der Übergang vorüber ist.

Für Bonuspunkte führen Sie die Berechnung in einer wp-Cron-Aufgabe einmal täglich aus und legen Sie die Ablaufzeit auf zwei Tage fest.

Option 2, erstellen Sie Hilfsdaten

Sie haben 1 Taxonomie und 6 Beitragstypen besetzt. Um dies zu umgehen, erstellen Sie eine weitere Taxonomie, eine versteckte Taxonomie ohne GUI. Diese Taxonomie wird nur an den gewünschten Posttyp angehängt.

Dann haken Sie sich in die Term-Erstellungs- / Lösch- / Zuweisungs-Hooks ein und verwenden Sie diese, um die Taxonomiedaten zu duplizieren, jedoch nur für diesen Post-Typ. Wenn Sie Ihre Liste bearbeiten möchten, fragen Sie die zweite versteckte Taxonomie ab, die als Cache fungiert. All die harte Arbeit, herauszufinden, welcher Begriff wie viele hat, wenn Sie die Änderungen vornehmen

Nur weil Sie nicht wissen, wie Sie mit den Daten, die Sie performant haben, umgehen können, bedeutet das nicht, dass es eine Lösung gibt, aber die Änderung der Ihnen zur Verfügung gestellten Daten kann manchmal eine große Differenz bewirken, was nicht immer mehr bedeutet Zwischenspeicher.

Hier ist ein einfaches Beispiel für das Klonen einer Taxonomie:

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

Platzieren Sie eine zweite Überprüfung, nachdem Sie die Taxonomie überprüft haben, um herauszufinden, um welchen Posttyp es sich handelt, und wenn der Post-Typ übereinstimmt, klonen Sie den Begriff, sonst nicht.

Nach langer Zeit scheint mir eine Methode gefunden zu haben, die für mich funktioniert. Ich nahm Toms Klon-Idee und seinen Ratschlag und machte eine zweite Taxonomie, die unserem Standpunkt entspricht, aber immer noch abgefragt werden kann.

Ich registriere die einzigartigen Taxonomien in meiner Plugin-Datei mit einer Schleife, die mit einem Array mit verschiedenen Datenbits verknüpft ist.

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

Sobald das gemacht ist, fügte ich hinzu, dass dies meine functions.php-Datei ist, so dass ich die zusätzlichen Daten zu den neuen Taxonomien hinzufügen könnte, indem ich die Begriffe aus der Haupttaxonomie kopieren (oder als Tom Suggested klonen) würde. Es gibt wahrscheinlich eine effizientere Möglichkeit, etwas davon zu schreiben, aber das scheint so weit zu sein, wie mein PHP gerade läuft …

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

Das funktioniert gut für mich, da die Begriffe automatisch mit jeder benutzerdefinierten Veröffentlichung oder Revision geschrieben und aktualisiert werden.

Schließlich kann ich meine Top 4 Begriffe abfragen und auf die Archivseiten verlinken;

 $term_args = array( 'number' => 4, 'orderby' => 'count', 'order' => 'DESC' ); $terms = get_terms(array('pt_carpenters_tax'),$term_args); if($terms != ''){ echo ''; } 

Vielleicht könnte ich das besser machen, aber was auch immer – es funktioniert: D

Vielen Dank an Tom für seine wiederholte Eingabe.