wake-up-neo.com

Wie erstelle ich eine WP_Query-Suche mit benutzerdefinierten Beitragstypen?

Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen "node" registriert.

Wenn ich eine einfache WP_Query erstelle, um Beiträge dieses Typs zu erhalten, funktioniert das einwandfrei. Beispiel:

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

$query = new WP_Query($args);       

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

Sobald ich dies jedoch mit einer Suche verbinde, 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 Posts vom Typ 'node' 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)
...

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

Wie kann ich das beheben?

7
Sebastian

Du hast recht, ich habe es in einer sauberen Wordpress-Installation versucht und es funktioniert.

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

Vielen Dank!

4
Sebastian

Bei einer Standard-WordPress-Installation 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_type-Argument hinzuzufügen, das auf 'any' gesetzt ist. Auf diese Weise sucht WordPress automatisch zwischen allen Typen, mit Ausnahme von Revisionen und Typen, bei denen exclude_from_search auf true gesetzt ist. Problem Standardmäßig werden Anhänge nicht von der Suche ausgeschlossen. Solange Sie kein post_status-Argument auf 'inherit' gesetzt haben, sollten Sie sich nicht ärgern, da für Anhänge immer post_status auf 'inherit' gesetzt ist.

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 des folgenden 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;
}
1