编程语言
首页 > 编程语言> > PHP-如何在WordPress中按缩略图的顺序排序?

PHP-如何在WordPress中按缩略图的顺序排序?

作者:互联网

客户要求我按缩略图顺序对帖子排序,因此我需要先按缩略图对帖子进行排序,然后再按不按缩略图的顺序对帖子进行排序.

这是我的代码:

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

在调用新的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挂钩从其中条件中删除元密钥的正确方法.这是一种更好,更清洁的方法:

在调用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函数时执行.

希望这对您有所帮助:)

标签:thumbnails,wordpress,php
来源: https://codeday.me/bug/20191031/1972448.html