Wie erstelle ich eine WP_Query-Suche mit benutzerdefinierten Beitragstypen?

8

Ich habe einen benutzerdefinierten Beitragstyp namens "Knoten" registriert.

Wenn ich eine einfache WP_Query erstelle, um Beiträge dieses Typs abzurufen, funktioniert dies einwandfrei. Beispiel:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node');

$query = new WP_Query($args);       

Dadurch werden alle veröffentlichten Beiträge vom Typ "Knoten" abgerufen.

Sobald ich dies jedoch mit einer Suche kombiniere, wird nichts zurückgegeben. Beispiel:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node',
's' => 'My search term');

$query = new WP_Query($args);

Dies wird nichts bekommen, obwohl es mehrere Beiträge vom Typ 'Knoten' bekommen sollte, die 'Mein Suchbegriff' enthalten.

Soweit ich sehen kann, werden die Beitragstypen automatisch auf "Beitrag" und "Seite" gesetzt, sobald ich den Parameter "s" in $ args einbinde. Wenn ich einen var_dump von $ query ausdrucke, wird Folgendes angezeigt:

Ohne "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=63)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
...

Mit "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=66)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => 
        array (size=2)
          0 => string 'post' (length=4)
          1 => string 'page' (length=4)
...

Wordpress scheint also die Beitragstypen zu überschreiben, sobald eine Suche durchgeführt wird.

Wie kann ich das beheben?

Sebastian
quelle
1
Ich kann das nicht bestätigen. Ich habe gerade etwas sehr Ähnliches getestet - erfolgreich. Haben Sie es ohne Plugin und / oder mit einem Standarddesign versucht? Sogar die Suche (dh die Hauptsuche unter Verwendung des Suchformulars) umfasst alle benutzerdefinierten Beitragstypen, die nicht explizit von der Suche ausgeschlossen sind.
Anfang
2
Ich habe heute Morgen tatsächlich eine Suche geschrieben, die post_type (ein cpt), post_status (veröffentlichen) und s verwendet, und es funktioniert gut. Sie haben mit ziemlicher Sicherheit einen Filter oder etwas in einem Plugin / Theme, wie von @tf vorgeschlagen.
Andrew Bartel
Ich konnte dies nicht testen, bin mir aber zu 95% sicher, dass ich etwas Ähnliches angezogen habe und es funktionieren ließ. Ich stimme der Spekulation über die Wirkung von Filterstörungen zu.
s_ha_dum
1
Sie haben Recht, ich habe es in einer sauberen Wordpress-Installation versucht und es funktioniert. Es scheint, als würde sich eines der Plugins, die ich in meiner Umgebung verwende, in eines der Ereignisse vor der Abfrage einbinden. Vielen Dank!
Sebastian

Antworten:

4

Sie haben Recht, ich habe es in einer sauberen Wordpress-Installation versucht und es funktioniert.

Es scheint, als würde sich eines der Plugins, die ich in meiner Umgebung verwende, in eines der Ereignisse vor der Abfrage einbinden.

Vielen Dank!

Sebastian
quelle
2
Wissen Sie, welches Plugin dieses Problem verursacht hat?
stefano1
1

Bei einer Standardinstallation von WordPress ist WP_Query standardmäßig post_type= 'post'.

Betrachten Sie dieses einfache Beispiel:

$args = array(
  "posts_per_page"=>5,
  "ignore_sticky_posts"=>true
);

$itposts = new WP_Query( $args );

Es wird die folgende Abfrage ausgeführt:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

DIE BESTE LÖSUNG

Die Lösung besteht darin, ein post_typeArgument hinzuzufügen , das auf gesetzt ist 'any'. Auf diese Weise sucht WordPress automatisch zwischen allen Typen mit Ausnahme von Revisionen und Typen, auf die exclude_from_searchgesetzt ist true. Problem Standardmäßig werden Anhänge nicht von der Suche ausgeschlossen. Solange Sie kein post_statusArgument auf gesetzt haben 'inherit', sollten Sie sich nicht ärgern, da Anhänge immer auf post_statusgesetzt sind 'inherit'.

Auf diese Weise ändert sich die Abfrage in:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

Bei Bedarf können Sie Anhänge mithilfe dieses Codes von der Suche ausschließen:

add_action('init', 'exclude_attachments_from_search');

function exclude_attachments_from_search() {
  global $wp_post_types;

  $wp_post_types['attachment']->exclude_from_search = true;
}
Tristan CHARBONNIER
quelle
-1

Ich weiß, dass dies eine sehr alte Frage ist, aber ich bin darauf gestoßen, weil ich das gleiche Problem hatte. Ich kann wegen des guten Rufs keine Kommentare abgeben, aber ich möchte Leuten wie @Stefano helfen, damit Sie nicht alle Plugins durchgehen und prüfen müssen, welches die Änderung an der Abfrage verursacht.

Für mich war es ein Plugin namens " Custom Search by BestWebSoft ". Aber es war nicht der Fehler des Plugins, ich hatte das Kästchen für meinen benutzerdefinierten Beitragstyp in den Einstellungen einfach nicht angekreuzt.

NoLoHo
quelle