webentwicklung-frage-antwort-db.com.de

WP_Query um Beiträge aus einer Kategorie anzuzeigen OR benutzerdefinierte Feld

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

Das will ich nicht. Ich muss nur Posts anzeigen, die eine Kategorie 9 oder ein benutzerdefiniertes Feld featured haben.

Lass es mich wissen, wenn es keinen Sinn ergibt. Ich werde ein Beispiel posten, um es zu erklären.

5
Robert hue

Sie können das benutzerdefinierte Argument _meta_or_tax 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 );

wobei wir das folgende Plugin verwenden, 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 .

6
birgire