web-dev-qa-db-ja.com

カスタム投稿タイプでWP_Queryを検索する方法

"node"というカスタム投稿タイプを登録しました。

そのタイプの投稿を取得するための基本的なWP_Queryを作成すると、それはうまく機能します。例:

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

$query = new WP_Query($args);       

これにより、 "node"タイプのすべての公開された投稿が取得されます。

しかし、これを検索と組み合わせるとすぐに、何も返されません。例:

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

$query = new WP_Query($args);

これは何も得られませんが、 'My search term'を含む 'node'タイプの投稿がいくつかあるはずです。

私の知る限りでは、$ argsに "s"パラメータを含めるとすぐに、投稿タイプは自動的に "post"と "page"に設定されます。 $ queryのvar_dumpを出力すると、次のようになります。

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

"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は検索が行われるとすぐに投稿タイプを上書きするようです。

どうすれば修正できますか?

7
Sebastian

あなたは正しいです、私はきれいなWordpressのインストールでそれを試してみました、そして、それは働きます。

私の環境で使用しているプラ​​グインの1つが、クエリ前イベントの1つにフックしているようです。

ありがとうございます。

4
Sebastian

標準のWordPressインストールでは、WP_Queryはデフォルトでpost_type = 'post'になります。

この簡単な例を見てください。

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

$itposts = new WP_Query( $args );

その結果、次のクエリが実行されます。

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

ベストソリューション

解決策は、post_type引数セットを'any'に追加することです。このようにしてWordPressはリビジョンとexclude_from_searchtrueに設定されているタイプを除くすべてのタイプの中から自動的に検索します。デフォルトでは、添付ファイルは検索から除外されません。 post_status引数が'inherit'に設定されていない限り、添付ファイルは常にpost_status'inherit'に設定されているため、煩わしくないようにしてください。

これにより、クエリは次のように変わります。

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

必要に応じて、次のコードを使用して添付ファイルを検索から除外することができます。

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