web-dev-qa-db-de.com

Alle Beiträge und nur bestimmte benutzerdefinierte Beitragstypen mit Metafeldern anzeigen

Ich versuche, alle Beiträge und nur bestimmte benutzerdefinierte Beiträge auf der Startseite anzuzeigen.

Im Wesentlichen: (post_type = post) OR (post_type = exhibition AND featured = 1)

Ich bin jedoch mit der eigentlichen Implementierung festgefahren.

pre_get_posts und $query->set(...); scheinen keine Logik für den post_type zuzulassen, anscheinend können Sie nur (post OR exhibition) AND (featured=1) einstellen.

Ich möchte lieber nicht für jeden einzelnen Beitrag einen featured=1 setzen.

Jede Hilfe dankbar.

Sie können OR oder AND nicht für beliebige WP_Query-Argumente angeben. Mit Meta- und Taxonomie-Abfragen können Sie OR oder AND für diese Abfragen angeben, andere Argumente werden jedoch alle kombiniert (post_type ist eine Eigenschaft des Posts, keine Meta-Abfrage, daher hilft eine Meta-Abfrage nicht). In die Dokumentation finden Sie Informationen zu den möglichen Argumenten und deren Verwendung.

Sie werden feststellen, dass einige Argumente ein Array als Wert unterstützen, wie z. B. post_type, sodass Sie 'post_type' => ['post', 'exhibition'] übergeben können, und es werden sowohl exhibition- als auch post-Posts abgerufen.

Wenn Sie dies tun, können Sie jedoch nicht angeben, dass ein anderes Argument oder eine andere Meta-Abfrage nur für einen der Beitragstypen gelten soll.

Wenn die Posts separat angezeigt werden sollen, können Sie nur zwei Abfragen durchführen. Andernfalls müssen Sie die Datenbank direkt mit wpdb abfragen. Das würde ungefähr so ​​aussehen:

global $wpdb;

$results = $wpdb->get_results(
    "SELECT 
        posts.* 
    FROM 
        $wpdb->posts posts 
    LEFT JOIN 
        $wpdb->postmeta ON 
            ( posts.ID = postmeta.post_id AND postmeta.meta_key = 'featured' )
    WHERE
        posts.post_type = 'post' OR
        ( posts.post_type = 'exhibition' AND postmeta.meta_value = '1' )
    "
);

Ich habe es nicht getestet, aber das ist die grobe Idee. Sie müssten SQL für die Anzahl der Posts und für jede Bestellung hinzufügen.

Es gibt auch die Filter posts_where und posts_join , mit denen Sie modify die vorhandene Abfrage für die Posts bearbeiten können. Das ist ein bisschen komplizierter, aber wenn Sie die Hauptabfrage ändern müssen oder sich auf andere WP_Query-Argumente stützen und ihre SQL nicht neu schreiben müssen, sollten Sie diese Ordner verwenden.

1
Jacob Peattie

Wenn Sie versuchen, benutzerdefinierte Posts zurückzugeben, verwenden Sie diese Option.

$args = array(
          'numberposts'=> -1,
          'post_type' => 'custom post type name'
        );
$results = get_posts( $args ); //get all post data results

foreach ($results as $rel){//sift through data and find relevant meta data
  $ret = get_post_meta($rel->ID,'meta_field',true);
  if(!empty($ret)){
      //do something with this post data
  }

}

Dadurch werden alle Beiträge abgerufen, die unter diesen Beitragstyp fallen. Hoffentlich hilft Ihnen dies beim Einstieg.

0
Cam