Verwenden Sie have_posts () mit einem Array von Post-Ergebnissen, die von $ wpdb-> get_results abgerufen wurden

Ich weiß nicht, ob ich zurückgeblieben bin, verrückt oder einfach genial oder nicht, aber ich habe beschlossen, Tags zu verwenden, um Inhalte auf der ganzen Site zu verlinken (eine große alte Viele-zu-Viele-Beziehungswebsite zur Archivierung) verschiedene Aspekte eines großen Projekts). Leider bedeutet dies, dass einige benutzerdefinierte Post-Typen, die von einigen Plugins verwendet werden, nicht genau mit anderen Objekten (Posts, Pages usw.) verbunden sind, da sie andere Taxonomien verwenden (und im Falle von Medien-Anhängen nicht benutze Taxonomien überhaupt, außer ich schweine in einem Plugin das zu beheben – was da ist und ich benutze es und es benutzt eine andere Taxonomie …). Tatsächlich haben einige Plugin-Typen spezielle Taxonomien, die fest programmiert sind, so dass ich nicht wirklich durchgehen und ihren corecode ändern kann, sonst würde ein Plugin-Upgrade meine ganze harte Arbeit zunichte machen.

Um diese Fragmentierung und Wahrnehmung der langen, mühevollen Arbeit des Hackens der Plugins und / oder WordPress zu WP_Query , verwendete ich anfangs das Advanced Taxonomy-Zeug mit WP_Query und das funktionierte gut, bis ich fand, dass ich zusätzliche Informationen mit Meta-Tags benötigte und sogar änderte Die Standardreihenfolge basiert auf den post_type meta_values spezifischen post_type und post_type . So, jetzt gehe ich die kürzere “lange, mühsame” Arbeitsroute und habe meinen eigenen benutzerdefinierten SQL-Builder geschrieben, um die Objekte basierend auf den Tag / Meta-Beziehungen mit der benutzerdefinierten Bestellung per post_type wie vom Projekt benötigt, zu holen.

Eine Sache, die ich gerne machen würde, so dass ich sowohl diese neue benutzerdefinierte Abfrage als auch die vorhandenen WP_Query Methoden verwenden kann, ist eine Möglichkeit, die benutzerdefinierten Abfrageergebnisse in eine WP_Query class zu WP_Query , sodass ich have_posts und the_post – im Grunde alle das nette $post Zeug. $wpdb->get_results gibt mir nur eine einfache Reihe von Ergebnissen und ich bin nicht so auf WP_Query und $wpdb ‘s niggly Bits $wpdb ; WP_Query ich WP_Query einige funky benutzerdefinierte WP_Query , Joins und dann auf der Grundlage der ausgewählten Spalten WP_Query lassen? Kann ich einfach eine SQL-Abfrage an get_posts() , um den WP_Query Wrapper und seine glorreichen Loop-functionen zu erhalten?

Es ist spät und ich bin so nah dran, dieses Rätsel zu lösen, also würde ich deine Hilfe, Obi Wan Kenobi, sehr schätzen; Im Moment have_posts() die einfachste Lösung die have_posts() -functionalität zu sein, die auf ein einfaches Array von Post-Ergebnissen angewendet wird, die über die function $wpdb->get_results abgerufen werden, um dann einfach und nahtlos eine WP-Schleife für diese Menge von Post-Ergebnissen zu initiieren. Wenn Sie eine andere Möglichkeit kennen, dies zu tun (Benutzerdefinierte Abfragen, vielleicht?) Ich bin ganz Ohr.

Solutions Collecting From Web of "Verwenden Sie have_posts () mit einem Array von Post-Ergebnissen, die von $ wpdb-> get_results abgerufen wurden"

Mit setup_postdata können Sie Schleifenfunktionen mit Post-Ergebnissen über get_posts .

Eine weitere Option besteht darin, die verschiedenen verfügbaren Filter zu verwenden, um das Verhalten von posts_join zu ändern WP_Query posts_join , posts_where , posts_orderby .

Ooh, ich denke, ich habe es herausgefunden. Ich bin gerade darüber gestolpert, also ist es noch früh. Ich versuche, etwas freches zu machen, also ist es im Moment ziemlich minimal, aber sollte als eine mögliche Grundlage dienen:

 function get_posts_custom_query( $query_args ) { global $wpdb; // Do the necessary funky stuff here to build $sql_query from the given $query_args $custom_query = $wpdb->get_results($sql_query); // If you've limited the results returned and using SQL_CALC_FOUND_ROWS in the select query... if ( $query_args['posts_per_page'] > 1 ) { $found_posts = $wpdb->get_var('SELECT FOUND_ROWS()'); $max_num_pages = ceil($found_posts/$query_args['posts_per_page']); } // Sanitise each post result foreach( $custom_query as $i => $post ) { $custom_query[$i] = sanitize_post($post, 'raw'); } // Setup WP_Query object $new_wp_query = new WP_Query(); $new_wp_query->query = $sql_query; $new_wp_query->posts = $custom_query; $new_wp_query->post_count = count($custom_query); if ( isset($found_posts) ) $new_wp_query->found_posts = $found_posts; if ( isset($max_num_pages) ) $new_wp_query->max_num_pages = $max_num_pages; // Set the first post if ( $new_wp_query->post_count > 0 ) $new_wp_query->post = $custom_query[0]; return $new_wp_query; }