2017-09-19 3 views
0

Ich verwende WordPress, um einige Inhalte mit ein paar Einschränkungen zu suchen. Jedes Mal, wenn ich einen Beitrag speichere, speichere ich in meta ein entsprechendes Posts-Array.Suche mit Meta-Abfrage in WordPress

Dann versuche ich alle Beiträge zu suchen, die einen bestimmten Beitrag als verwandt haben, habe ich die folgende Abfrage. Der ausgewählte Beitrag ist eine ID zu dem gesuchten Post.

Ich überprüfte $selected_post und es hat Werte wie die folgende.

$selected_post = "25"; 

Ich habe die Meta-Wert die folgende Anweisung verwenden, ich bin mit update_post_meta. $related_posts enthält ein Array von Post-IDs, wie im folgenden Beispiel.

  update_post_meta($post->ID, 'related_post', $related_posts); 

Abfrage

  $arg = array(
       'post_type'   => 'post', 
       'posts_per_page' => 5, 
       'meta_query'  => array(
        'relation' => 'OR', 
        array(
         'key'  => 'related_post', 
         'value'  => array($selected_post), 
         'compare' => 'IN', 
         'type'  => 'STRING' 
        ), 
       ), 
      ); 

geprüft ich diese Meta in einigen meiner aktuellen Beiträge, und ich habe so etwas wie dieses.

'related_post' => array('15', '25', '46'); 

Wenn ich diese Abfrage ausführen WP_Query mit es gibt immer mir ein leeres Array. Ich denke, ich brauche etwas mehr in der Abfrage, damit dies funktioniert.

Jede Hilfe wäre willkommen.

+0

Ihr Code ist in Ordnung - Sie sollten nicht '' relation '=>' OR'' da haben, da Sie nur eine Bedingung in Ihrer Meta-Abfrage haben, aber es sollte trotzdem funktionieren. Es muss also mit den Daten selbst zu tun haben. Haben Sie bestätigt, dass '$ selected_post' einen gültigen Einzelwert hat? Wie fügen Sie 'related_post' hinzu (z. B. benutzerdefiniertes Feld. Verwenden Sie add_post_meta. ACF) und welches Format ist das? Wenn Sie nur einen einzelnen Wert abfragen, warum nicht '=' anstelle von 'IN' verwenden? – FluffyKitten

+0

@FluffyKitten Vor allem, vielen Dank für den Kommentar. Ja, ich habe überprüft, dass '$ selected_post' einen einzelnen Wert hat. Ich werde meine Frage aktualisieren und Ihnen die Informationen geben, nach denen Sie fragen. Ich frage, ob mein '$ selected_post' im Array von verwandten_posts ist, es ist kein einzelner Wert. –

Antwort

2

Das Problem ist, dass Sie versuchen, related_posts abzufragen, als ob es ein Array wäre, aber es wird tatsächlich serialisiert, wenn es zur Datenbank hinzugefügt wird.

WP_Query verwenden auf serialisierten Arrays

Wenn Sie ein Array von Post meta hinzuzufügen waren wie folgt:

$fruit_array = array('apple', 'orange', 'banana'); 
update_post_meta($post->ID, 'fruit', $fruit_array); 

... der Wert für fruit in der Datenbank wäre:

a:3:{i:0;s:5:"apple";i:1;s:6:"orange";i:2;s:6:"banana";} 

Daher müssen Sie LIKE verwenden, um die serialisierte Zeichenfolge für den Wert yo zu suchen Du suchst.

Für das obige Beispiel, Ihre $args etwas aussehen würde:

$args = array(
    'post_type'  => 'post', 
    'posts_per_page' => 5, 
    'meta_query' => array(
      array(
        'key'  => 'fruit', 
        'value' => 'apple', 
        'compare' => 'LIKE', 
      ), 
    ) 
); 


Suche nach Zahlen/Post-IDs

In Ihrem Fall wird dies durch die Tatsache erschwert, dass Sie verwenden Post-IDs. Post-IDs oder Nummern sind kein spezifisches Problem, aber das Problem ist, dass LIKE auch teilweise Übereinstimmungen zurückgibt, so dass eine Abfrage für 14 auch 141, 1455 usw. zurückgeben würde.

Basierend auf der Struktur der serialisierten String, glaube ich, die folgende Arbeiten:

$args = array(
    'post_type'  => 'post', 
    'posts_per_page' => 5, 
    'meta_query' => array(
      array(
        'key'  => 'related_post', 
        'value' => '"25"', /* include the double quotes in the search value */ 
        'compare' => 'LIKE', 
      ), 
    ) 
); 

Da die Werte in der serialisierten String wird "25"; einschließlich der doppelten Anführungszeichen in dem Wert, den Sie arbeiten sollte gesucht werden soll .