yaleksandr89
@yaleksandr89
PHP developer

Как убрать посты с статусом (удалены или черновик) общего списка?

Здравствуйте.
Для получения необходимых данных из БД сделал запрос:
function get_events()
{
    global $wpdb;
    $events = $wpdb->get_results(
    "
            SELECT post_id, meta_value
            FROM $wpdb->postmeta
            WHERE meta_key = 'data-provedeniya'
          "
    );
    return $events;
}

После чего полученные данные передаю в другую функцию, которая кодируе тв json формат для дальнейшей работы с этими данными.
function get_json_for_calendar($arr)
{
    $data = '';
    foreach ($arr as $item) {
        $calendarEvent = get_the_term_list($item->post_id, 'calendars', '<div>Категория мероприятия «', ' • ', '»</div>');
        $jsonData = json_encode($calendarEvent);
        $timeElement = $item->meta_value;
        $date = DateTime::createFromFormat('Ymd', $timeElement);
        $data .= '{ 
                    "date": "' . $date->format('Y-m-d') . '", 
                    "title": "' . get_the_title($item->post_id) . '", 
                    "description": ' . $jsonData . ', 
                    "url": "' . get_permalink($item->post_id) . '" 
                  },';
    }
    $json = substr($data, 0, -1);
    return $json;
}


Заметил, что удаленные (в корзину) посты или черновики попадают в общий список, чего быть не должно.

Мое предположение, что функция get_events(); передает в функцию get_json_for_calendar($arr) все ID постов, без разницы какой у них post_type.

Соответственно посты никак не фильтруются и в общий список попадают (get_the_title($item->post_id)) все опубликованные, удаленные записи, а так же записи с другими статусами (на утверждение, черновик и т.д.).

Не могу составить проверку, что бы исключить все записи, кроме publish. Помогите решить эту задачу.
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Вы выборку делаете по таблице wp_postmeta. В этой таблице хранится только ID записи. Чтобы узнать (и отфильтровать) по ID статус этой записи, используйте JOIN с таблицей wp_posts:
SELECT post_id, post_status, meta_value
FROM wp_postmeta
JOIN wp_posts
ON wp_postmeta.post_id=wp_posts.id
WHERE meta_key = 'data-provedeniya' AND post_status = 'publish'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы