web-dev-qa-db-fra.com

Comment faire une recherche WP_Query avec des types d'article personnalisés?

J'ai enregistré un type de message personnalisé appelé "noeud".

Lorsque je crée un WP_Query de base pour obtenir des publications de ce type, cela fonctionne parfaitement. Exemple:

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

$query = new WP_Query($args);       

Cela obtiendra tous les articles publiés de type "noeud".

Cependant, dès que je combine ceci avec une recherche, rien n'est retourné. Exemple:

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

$query = new WP_Query($args);

Cela n'obtiendra rien, même s'il devrait contenir plusieurs posts de type 'noeud' contenant 'Mon terme de recherche'.

Autant que je sache, les types de publication sont automatiquement définis sur "publication" et "page" dès que le paramètre "s" est inclus dans $ args. Si j'imprime un var_dump of $ query, les éléments suivants sont affichés:

Sans "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)
...

Avec "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)
...

Donc, Wordpress semble remplacer les types de publication dès qu'une recherche est impliquée.

Comment puis-je résoudre ce problème?

7
Sebastian

Vous avez raison, je l'ai essayé dans une nouvelle installation de Wordpress et cela fonctionne.

On dirait que l'un des plugins que j'utilise dans mon environnement se branche dans l'un des événements de pré-requête.

Merci!

4
Sebastian

Sur une installation WordPress standard, WP_Query utilisera par défaut post_type = 'post'.

Considérons cet exemple simple:

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

$itposts = new WP_Query( $args );

La requête suivante sera exécutée:

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

LA MEILLEURE SOLUTION

La solution consiste à ajouter un argument post_type défini sur 'any'. De cette façon, WordPress recherchera automatiquement tous les types, à l'exception des révisions et des types pour lesquels exclude_from_search est défini sur true. Problème, par défaut, les pièces jointes ne sont pas exclues de la recherche. Tant que vous n'avez pas défini d'argument post_status à 'inherit', vous ne devriez pas être ennuyé car les pièces jointes ont toujours post_status défini sur 'inherit'.

De cette façon, la requête deviendra:

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

Si nécessaire, vous pouvez exclure les pièces jointes de la recherche en utilisant le code suivant:

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