Запрос Wordpress, отображающий сообщение в пустом столбце?

У меня есть следующие аргументы WP_Query:

$posts = new WP_Query(array(
        'post__in' => $postids,
        'meta_key' =>'ratings_average',
        'orderby'=>'meta_value_num',
        'order' =>'DESC',
    ));

$postids - это массив идентификаторов, который извлекается из другого WP_Query. Моя проблема в том, что даже если $postids пуст, цикл Wordpress показывает сообщения. Как я могу управлять этим, чтобы он не показывал сообщения, если $postids пуст.

Ответ 1

Это напрямую не устраняет проблему с помощью post__in, но я не понимаю, почему это не сработает.

if(!empty($postids)){
    $posts = new WP_Query(array(
        'post__in' => $postids,
        'meta_key' =>'ratings_average',
        'orderby'=>'meta_value_num',
        'order' =>'DESC',
    ));
} else {
    //Do something else or nothing at all..
}

как вы можете видеть, вызов WP_Query произойдет, только если $postids имеет значение /s. если это не так, то вызов WP_Query не выполняется, и цикл никогда не произойдет, как если бы ваш запрос вернул 0 сообщений.

Ответ 2

Как отмечалось, wp devs не хотят исправлять это. Сказав это, вы можете передать непустой массив недопустимых идентификаторов, например:

if(empty($postids)) {
    $postids = ['issue#28099'];
}

$posts = new WP_Query(array(
    'post__in' => $postids,
    'meta_key' =>'ratings_average',
    'orderby'=>'meta_value_num',
    'order' =>'DESC',
));

Плохая практика, которую вы говорите? Да, я не уверен, с чьей стороны, хотя...

Ответ 3

Чтобы поток был корректным с WP_Query. Используйте его так:

    $postIdArray = array(
        1, 2, 3
    );

    $queryArgs = array(
        'post_type' =>  'any',
        'post_status' => 'published',
        'post__in' => ((!isset($postIdArray) || empty($postIdArray)) ? array(-1) : $postIdArray)
    );

Таким образом, вы все равно сможете кодировать объект WP_Query.

Например:

    $postIdArray = array(
        1, 2, 3
    );

    $queryArgs = array(
        'post_type' =>  'any',
        'post_status' => 'published',
        'post__in' => ((!isset($postIdArray) || empty($postIdArray)) ? array(-1) : $postIdArray)
    );

    $postQuery = new \WP_Query($queryArgs);
    $postCount = $postQuery->post_count;
    $totalCount = $postQuery->found_posts;

Ответ 4

Может быть, у вас есть липкие сообщения. В этом случае WordPress добавит эти сообщения в ваш запрос.

Решение состоит в установке 'ignore_sticky_posts' => 1. Применяя это к вашему коду:

$posts = new WP_Query(array(
    'post__in' => $postids,
    'ignore_sticky_posts' => 1,
    'meta_key' =>'ratings_average',
    'orderby'=>'meta_value_num',
    'order' =>'DESC',
));

Ответ 5

Просто возникла та же проблема, лучше всего проверить, является ли массив пустым, а затем передать ему неверный идентификатор:

if(empty($postids)){
    $postids[]= 0;
}

Добавьте это перед запросом, и проблема будет решена.