回答:
試してみる
'post__in' => array(0)
シンプルで要点。
post__in
は、空の配列を渡されたときに投稿を返すというバグを解決しました... array(0)
素晴らしい作品です!これは奇妙ですが、WPコアでバグとして出てきた問題にたどり着くことができますが、テーマ/プラグインの開発者が多すぎてその周辺に機能を構築したため、そのまま残されました-_- core.trac.wordpress.org/チケット/ 28099
奇妙なことに、短絡するクリーン/明示的な方法はありませんWP_Query
。
それが主なクエリである場合WP->parse_request()
、何かを解決するかもしれませんが、そこには比較的最近の(3.5)do_parse_request
フィルタがあるようです。
ただし、フィルタWP_Query
をAND 1=0
介して追加することでSQLクエリを短絡させるなど、ダーティハック自体が通常は適切ですposts_where
。
"post_type" => "break_loop"
、存在しない投稿タイプであるような汚いハックをすることになりました。
クエリパラメータを存在しない値に設定する場合の問題は2です。
'posts_*'
フィルターフック('posts_where'
、'post_join'
など)があり、それらがクエリに作用するため、クエリに存在しないパラメーターを設定しても結果が返されないこと、OR
フィルターによって返される単純な句が何かを返すことを確認することはできません。クエリが結果を返さず、パフォーマンスの問題がない(または非常に少ない)ことを確認するには、少し筋金入りのルーチンが必要です。
そのルーチンをトリガーするには、すべてのメソッドを使用できます。技術的にWP_Query
は、存在しないイベント引数に引数を渡すことができます。
のようなものが好きなら、次のように'force_no_results' => true
使うことができます:
$a = new WP_Query( array( 's' => 'foo', 'force_no_results' => true ) );
そして'pre_get_posts'
、ハードワークを実行するコールバックを追加します:
add_action( 'pre_get_posts', function( $q ) {
if (array_key_exists('force_no_results', $q->query) && $q->query['force_no_results']) {
$q->query = $q->query_vars = array();
$added = array();
$filters = array(
'where', 'where_paged', 'join', 'join_paged', 'groupby', 'orderby', 'distinct',
'limits', 'fields', 'request', 'clauses', 'where_request', 'groupby_request',
'join_request', 'orderby_request', 'distinct_request','fields_request',
'limits_request', 'clauses_request'
);
// remove all possible interfering filter and save for later restore
foreach ( $filters as $f ) {
if ( isset($GLOBALS['wp_filter']["posts_{$f}"]) ) {
$added["posts_{$f}"] = $GLOBALS['wp_filter']["posts_{$f}"];
unset($GLOBALS['wp_filter']["posts_{$f}"]);
}
}
// be sure filters are not suppressed
$q->set( 'suppress_filters', FALSE );
$done = 0;
// use a filter to return a non-sense request
add_filter('posts_request', function( $r ) use( &$done ) {
if ( $done === 0 ) { $done = 1;
$r = "SELECT ID FROM {$GLOBALS['wpdb']->posts} WHERE 0 = 1";
}
return $r;
});
// restore any filter that was added and we removed
add_filter('posts_results', function( $posts ) use( &$done, $added ) {
if ( $done === 1 ) { $done = 2;
foreach ( $added as $hook => $filters ) {
$GLOBALS['wp_filter'][$hook] = $filters;
}
}
return $posts;
});
}
}, PHP_INT_MAX );
このコードは'pre_get_posts'
、できるだけ遅く実行されます。引数 'force_no_results'がクエリに存在する場合:
SELECT ID FROM wp_posts WHERE 0 = 1
すべてのフィルターが削除されると、このクエリが変更される可能性はなく、クエリは非常に高速で、確実な結果はありません
WP_Query()
は結果を返さないようにすることや、その質問に答えるための最良の方法であってもなくてもよいです。また、クエリ不可能にしたい検索パターンを記述する場合にも役立ちます。検索パターンを知ることは、解決策を見つけるのに役立つかもしれません。