php - 我如何根据 Wordpress 中缩略图的存在进行排序?

标签 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 时,没有缩略图的帖子不会显示。

最佳答案

这是一个有趣的问题。 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 Hook 我们自己的函数。因此,当 posts_where_request 被调用时,我们的函数将被渲染。在我们的函数中,我们使用 str_replace 替换 $where 值中的 meta_key 部分并返回它。这将删除查询中 where 部分的 meta_key 条件。

更新:

我找到了使用 WordPress 钩子(Hook)从 where 条件中删除元键的正确方法。这是更好更清洁的方法:

在调用 WP_Query 对象之前添加此 Hook 。使用这个代替早期的钩子(Hook)。

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函数时都会执行。

希望这对你有帮助:)

关于php - 我如何根据 Wordpress 中缩略图的存在进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956135/

相关文章:

php - 在包含的模板 magento 中使用 getChildHtml

python - 使用python从数据库验证wordpress用户登录

wordpress - 如何获得woocommerce价格属性

php - "Break"使用 PHP 的一组带有 H2 的列表项

pdf - 大型pdf文件的高效缩略图生成?

bash - 为文件夹中的每个图像生成缩略图

javascript - 检查缩略图和图像是否存在

Php表单提交-报错

php - CodeIgniter认证系统

javascript - 如何使用 Angular.js、PHP 和 Mysql 实现自动 session 超时