如何通过Wordpress中的缩略图来订购?

时间:2013-04-11 18:26:53

标签: php wordpress thumbnails

我的客户要求我按缩略图订购帖子,所以我需要先用缩略图对帖子进行排序,然后在没有缩略图的情况下排序。

这是我的代码:

$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
                 )
               )
           ));

但是当我把meta_key放在没有缩略图的帖子时,会发生什么。

2 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。 WordPress 目前没有一种方法可以使用内置的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对象

之前添加此过滤器
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部分并返回它。这将删除查询中部分的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函数时都会执行它。

希望这可以帮助你:)

答案 1 :(得分:0)

为什么不进行两次查询:第一次只返回带有缩略图的帖子,按照您的喜好排序,第二次只返回没有缩略图的帖子,也按您喜欢的方式排序。

换句话说,您的第一个查询将包含带缩略图的帖子,第二个查询将包含使用has_post_thumbnail函数在循环内使用条件语句的所有帖子。

我认为这种方法会让您获得时间,因为您希望解决的问题需要更多时间来搜索查找具有一个查询的解决方案。

祝你好运