これは興味深い問題です。WordPressには現在、組み込みメソッドを使用して 1 つのクエリでサムネイル付きの投稿とサムネイルなしのすべての投稿を取得する方法がありませんWP_Query
。しかし、私たちはそのためのハックを行うことができます.おそらく私が思う最高のものではありませんが、うまくいくでしょう:)
この関数をテーマのfunctions.phpファイルに追加します
function remove_metakey ($where) {
global $wpdb;
$where = str_replace("AND (".$wpdb->postmeta.".meta_key = '_thumbnail_id' )", "", $where);
return $where;
}
new WP_Query
Objectを呼び出す直前に、このフィルターを追加します。
add_filter ('posts_where_request', 'remove_metakey');
したがって、完全なものは次のようになります。
add_filter ('posts_where_request', 'remove_metakey');
$the_query = new WP_Query(array(
'post_type' => 'veiculos',
'posts_per_page'=> -1,
'meta_key' => '_thumbnail_id',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'categoria-veiculo',
'field' => 'id',
'terms' => 5
)
)
));
WP_QUEry オブジェクトを呼び出す前にフィルターを追加する必要があります。そうしないと機能しません。また、このフィルターを functions.php ファイルに追加しないでください。これposts_where_request
は、作成されるたびにレンダリングされるためです。
WP_Query
これが何をするかというと、オブジェクトでクエリを実行しているときに、 posts_where_request
. 独自の関数を でフックしていますposts_where_request
。したがって、posts_where_request
が呼び出されると、関数がレンダリングされます。この関数ではstr_replace
、値の meta_key 部分を置き換えて返すために使用し$where
ています。これにより、クエリの where 部分の meta_key 条件が削除されます。
アップデート :
WordPress フックを使用して where 条件からメタ キーを削除する正しい方法を見つけました。これは、はるかに優れたクリーンな方法です。
WP_Query オブジェクトを呼び出す前に、このフックを追加してください。以前のフックの代わりにこれを使用します。
add_filter ('get_meta_sql', 'remove_metakey');
以前の関数を次のように置き換えます。
function remove_metakey ($array) {
$array['where'] = ''; //you can also use unset, but setting the value to null is better to avoid warnings
return $array;
}
完全なものは次のようになります。
add_filter ('get_meta_sql', 'remove_metakey');
$the_query = new WP_Query(array(
'post_type' => 'veiculos',
'posts_per_page'=> -1,
'meta_key' => '_thumbnail_id',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'categoria-veiculo',
'field' => 'id',
'terms' => 5
)
)
));
これが正しい方法です。where
値をに設定してnull
、SQL クエリで追加のメタ キー条件を防止します。
このフィルタは、必要な場合にのみ追加してください。また、これを functions.php に追加しないでください。そうすると、get_meta_sql 関数が呼び出されるたびに実行されます。
これがお役に立てば幸いです:)