Abfrage, die einen benutzerdefinierten Typ lädt und deren IDs nicht in diesen benutzerdefinierten benutzerdefinierten Feldern stehen

Auf meiner Nachrichten-Website habe ich Beiträge und einen anderen benutzerdefinierten Typ namens “aggregato”. Dieser Typ hat 10 benutzerdefinierte Felder, “link01”, “link02” … “link10”.

Sowohl Posts als auch Aggregato haben einen Metaschlüssel, der “Home” genannt wird, der verwendet wird, um WP zu sagen, um den Post auf die Titelseite zu setzen.

Ich möchte eine Abfrage für die Titelseite erstellen, die die letzten 12 Post-OR-Aggregat lädt, die ein home>0 . Ich möchte auch die Beiträge ausschließen, die im Aggregato verlinkt sind.

Wenn dies eine einfache SQL-Abfrage wäre, würde ich eine Klausel erstellen, die in etwa so aussieht:

 WHERE post.home>0 AND aggregato.home>0 AND post.idaggregato.link01 ... AND post.idaggregato.link10 LIMIT 12 

Eine Problemumgehung könnte eine doppelte Abfrage sein. Der erste Typ des Aggregatotyps und dann der zweite für den Posttyp. Trotzdem würde ich lieber die richtige WP_Query finden.

Solutions Collecting From Web of "Abfrage, die einen benutzerdefinierten Typ lädt und deren IDs nicht in diesen benutzerdefinierten benutzerdefinierten Feldern stehen"

Zunächst einmal: Theoretisch kann man die WordPress-database theoretisch mit Roh-MySQL abfragen.
Siehe wpdb ‘s Methode get_results . Das könnte Ihnen eine zweite Abfrage ersparen, wird aber offensichtlich keine richtigen WP_Post Objekte zurückgeben.

Davon abgesehen, nein, wenn Sie WP_Query verwenden WP_Query , werden Sie nicht mit zwei Abfragen WP_Query . Ich würde es trotzdem weiter empfehlen. Vielleicht weniger effizient, aber sicher weniger mühsam. Wenn Ihre Posts-Tabelle nicht gigantisch massiv ist, sollte das kein Problem sein.

Entscheide dich zuerst für die neuesten 12 Beiträge vom Typ ” Aggregato “, iteriere über die Metadaten und greife danach die 12 zur Anzeige an. Könnte nicht die glatteste aussehen, aber Anyhoo:

 $twelve_aggregatos = new WP_Query( array( 'post_type' => 'aggregato', 'posts_per_page'=> 12, 'meta_query' => array( array( 'key' => 'home', 'value' => 0, 'compare' => '>' ) ) ) ); $linked_posts = array(); if ( $twelve_aggregatos->have_posts() ) { while ( $twelve_aggregatos->have_posts() ) { $twelve_aggregatos->the_post(); $current_ID = get_the_ID(); for ( $i = 1; $i < = 10; $i++ ) { /* The below asumes that the custom fields hold post IDs */ $linked_ID = get_post_meta( $current_ID, 'link'.str_pad( $i, 2, '0', STR_PAD_LEFT ), true ); /* Should they hold URLs, use the following instead */ /* $linked_ID = url to postid( get_post_meta( $current_ID, 'link'.str_pad( $i, 2, '0', STR_PAD_LEFT ), true ) ); */ if ( ! in_array( $linked_ID, $linked_posts ) ) { $linked_posts[] = $linked_ID; } } } } wp_reset_postdata(); $twelve_reults = new WP_Query( array( 'post_type' => array( 'post', 'aggregato' ), 'posts_per_page'=> 12, 'meta_query' => array( array( 'key' => 'home', 'value' => 0, 'compare' => '>' ) ) 'post__not_in' => $linked_posts ) ); /* Loop over results, do something */ wp_reset_postdata(); 
 $exclude_posts = array();//array of id's that are in aggregato custom fields $query = new WP_Query( array( 'post_type' => array( 'post', 'aggregato' ), 'posts_per_page'=> 12, 'posts_not_in' => $exclude_posts, 'meta_query' => array( array( 'key' => 'home', 'value' => '_wp_zero_value', 'compare' => '>' ) ) ) ); 

Sie können WP_Query für weitere Informationen überprüfen

Sie können url_to_postid() , um url_to_postid() zu erhalten