WP_Query zum Anzeigen von Post aus einer Kategorie oder einem benutzerdefinierten Feld

Ich suche nach einer Möglichkeit, Beiträge anzuzeigen, die zu einer bestimmten Kategorie gehören oder ein benutzerdefiniertes Feld haben. Wenn ich beide Parameter 'cat' => '9' und 'meta_key' => 'featured' in Abfrageargumenten WP_Query gibt WP_Query Posts zurück, die beide Bedingungen gleichzeitig erfüllen.

Das will ich nicht. Was ich brauche, ist Beiträge zu zeigen, wenn sie Kategorie 9 oder wenn sie ein benutzerdefiniertes Feld featured .

Lass es mich wissen, wenn es keinen Sinn ergibt. Ich werde ein Beispiel zur Erläuterung veröffentlichen.

Solutions Collecting From Web of "WP_Query zum Anzeigen von Post aus einer Kategorie oder einem benutzerdefinierten Feld"

Sie können das benutzerdefinierte _meta_or_tax Argument in WP_Query (PHP 5.4+) ausprobieren:

 $args = [ 'post_type' => 'post', '_meta_or_tax' => true, // < -- our new custom parameter 'tax_query' => [...], // < -- our tax query 'meta_query' => [...], // < -- our meta query ]; $query = new WP_Query( $args ); 

Wo verwenden wir das folgende Plugin, um dieses benutzerdefinierte Argument zu unterstützen:

 /** * Modify WP_Query to support 'meta_or_tax' argument * to use OR between meta- and taxonomy query parts. */ add_filter( 'posts_where', function( $where, \WP_Query $q ) { // Get query vars $tax_args = isset( $q->query_vars['tax_query'] ) ? $q->query_vars['tax_query'] : null; $meta_args = isset( $q->query_vars['meta_query'] ) ? $q->query_vars['meta_query'] : null; $meta_or_tax = isset( $q->query_vars['_meta_or_tax'] ) ? wp_validate_boolean( $q->query_vars['_meta_or_tax'] ) : false; // Construct the "tax OR meta" query if( $meta_or_tax && is_array( $tax_args ) && is_array( $meta_args ) ) { global $wpdb; // Primary id column $field = 'ID'; // Tax query $sql_tax = get_tax_sql( $tax_args, $wpdb->posts, $field ); // Meta query $sql_meta = get_meta_sql( $meta_args, 'post', $wpdb->posts, $field ); // Modify the 'where' part if( isset( $sql_meta['where'] ) && isset( $sql_tax['where'] ) ) { $where = str_replace( [ $sql_meta['where'], $sql_tax['where'] ], '', $where ); $where .= sprintf( ' AND ( %s OR %s ) ', substr( trim( $sql_meta['where'] ), 4 ), substr( trim( $sql_tax['where'] ), 4 ) ); } } return $where; }, PHP_INT_MAX, 2 ); 

Dies ist eine ungeprüfte Vereinfachung meiner Antworten hier .