WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

Здравствуйте.
Для получения необходимых данных из БД сделал запрос:

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. Помогите решить эту задачу.

0
Александр
4.7 лет назад
  • 1
    Glum697

    Я бы изменил запрос

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

    второй вариант заметно увеличит количество запросов к бд что не есть гуд...

    Александр 4.7 лет назад

    Подсказали более элегантное и оптимальное решение – объеденить таблицы (я к сожалению с БД могу проводить элементарные операции и с 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;
    }
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация