Как убрать посты с статусом (удалены или черновик) общего списка?
Здравствуйте.
Для получения необходимых данных из БД сделал запрос:
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. Помогите решить эту задачу.
Я бы изменил запрос
$query = "SELECT p.ID, pm.meta_value FROM {$wpdb->posts} as p JOIN {$wpdb->postmeta} as pm ON ( p.ID = pm.post_id ) WHERE p.post_type = 'post' AND p.post_status = 'publish' AND pm.meta_key = 'data-provedeniya'"; $events = $wpdb->get_results( $query );можно еще в цикле проверять post_status
if ( get_post_field( 'post_status', $item->post_id ) != 'publish' ) { continue; }второй вариант заметно увеличит количество запросов к бд что не есть гуд...
Подсказали более элегантное и оптимальное решение – объеденить таблицы (я к сожалению с БД могу проводить элементарные операции и с JOIN ранее не встречался). А оказывается к райне удобно:
function get_events() { global $wpdb; $events = $wpdb->get_results( " SELECT post_id, post_status, meta_value FROM $wpdb->postmeta JOIN $wpdb->posts ON $wpdb->postmeta.post_id=$wpdb->posts.id WHERE meta_key = 'data-provedeniya' AND post_status = 'publish' " ); return $events; }