web-dev-qa-db-de.com

meta_query Schlüsselwert aus Array

Ich habe einen benutzerdefinierten Beitragstyp namens "Spiel" mit einigen ACF-Feldern. Eines der Felder ist ein Beitragsobjekt (review_link), das Beiträge aus einer Kategorie namens "Bewertungen" akzeptiert. Ein anderes Feld ist ein Taxonomiefeld (Gametags genannt), das nach der post_tag-Taxonomie der 'Posts' sucht.

Das versuche ich zu erreichen:

  1. Wann immer Sie einen Beitrag (post_type = post) in der Kategorie Reviews lesen, um der Seitenleiste Informationen aus dem Spiel (post_type = game) hinzuzufügen, das diesen bestimmten Beitrag im Feld Post Object enthält.

  2. Wann immer Sie einen Beitrag (post_type = post) aus einer beliebigen Kategorie lesen, um die entsprechenden Tags zu erhalten, und in den ACF-Feldern Spiele (post_type = game) und insbesondere im Taxonomiefeld nach passenden Tags suchen, und dann einige Spielinformationen anzeigen.

Mein Code für Fall 1 lautet wie folgt und funktioniert hervorragend:

$reviewID = $post->ID;
if(in_category('reviews') ) {

    $reviewArgs = array(
      'post_type'    => 'game',
      'meta_query' => array(
         array(
           'key' => 'review_link',
           'value' => ''.$reviewID.'',
           'compare' => 'LIKE'
         )
       )
    );

}

Für Fall 2 habe ich nun Folgendes versucht:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

Die $ tag_ids für einen Beispielbeitrag lauten: 818,436,435,43,46,77. Wenn ich die $ tag_ids im obigen Code durch 435 ersetze, stimmt das überein. Aber wenn ich versuche, es wie ein Array hinzuzufügen, tut es das nicht. Ich habe auch versucht, das Array zu serialisieren, das Array zu schleifen usw. Nichts davon funktioniert. Ich könnte eine Reihe von Meta-Abfragen machen, aber die Anzahl der Tags in jedem Beitrag ist zufällig. Ich habe auch versucht, das Array in einen String zu konvertieren und 'LIKE' anstelle von 'IN' und nichts zu verwenden.

Tatsächlich gibt der obige Code eine Warnung aus: Warnung: trim () erwartet, dass Parameter 1 ein String ist, ein Array, das in /.../public_html/wp-includes/class-wp-meta-query.php in Zeile 594 angegeben ist

Ich habe fast alles versucht, um Fall 2 zum Laufen zu bringen und konnte es nicht. Soweit ich weiß, funktioniert die meta_query nicht wie erwartet, wenn der Metawert ein Array ist, obwohl der Codex angibt, dass es sich um ein Array handeln kann. Der gesamte obige Code befindet sich in sidebar.php.

Für Hinweise und Tipps wäre ich dankbar

Danke im Voraus

3
Pantso

Ich weiß nicht, ob Sie ein Array direkt mit dem anderen vergleichen können, aber Sie können eine Schleife erstellen, um ein meta_query-Array einzurichten, das jede der IDs innerhalb des Felds separat überprüft:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$meta_query = array('relation' => 'OR');

foreach ($tags_ids as $tag_id) {
    $meta_query[] = array(
        'key' => 'gametags',
        'value' => $tag_id,
        'compare' => 'IN'
    );
}

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => $meta_query
);

Hinweis: Dies kann zu Fehlern führen, wenn für den Beitrag keine Tags festgelegt wurden. Daher möchten Sie möglicherweise eine alternative Behandlung für diesen Fall hinzufügen.

BEARBEITEN: Versuchen Sie dies, um die genauen Übereinstimmungen später zu testen ...

$review_query = new WP_Query( $reviewArgs ); 
while( $review_query->have_posts() ) { 
    $review_query->the_post(); 
    global $post; $checkmatch = false;
    $gametags = get_post_meta($post->ID,'gametags');
    if (!is_array($gametags)) {$gametags = explode(',',$gametags);}
    foreach ($tags_ids as $tag_id) {
        if (in_array($tag_id,$gametags)) {$checkmatch = true;}
    }
    if ($checkmatch) {
         // echo output
    }
}
1
majick

Da $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) ); ein Array zurückgibt, sollten Sie es wie folgt verwenden können

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

Haben Sie die Metakeys-Gametags für die Post-Type-Spiele? Verwenden Sie auch die WP_Query? Oder get_posts ()?

0
bagpipper