这是一个有趣的问题。WordPress目前没有一种方法可以使用其内置WP_Query
方法在一个查询中获取所有带有缩略图和没有缩略图的帖子。但是我们可以为此做一个hack,可能不是我认为的最好的,但会起作用:)
在你的主题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
用来替换$where
值中的 meta_key 部分并返回它。这将删除查询中 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函数时都会执行。
希望这可以帮助你:)