Используйте has_posts () с массивом результатов сообщений, полученных путем $ wpdb-> get_results

Я не знаю, насколько я отставлен, сумасшедший или просто гениальный или нет, но я решил использовать теги как способ связать контент по всему сайту (большой сайт взаимоотношений «много-ко-многим» для архивирования различные аспекты огромного проекта). К сожалению, это означает, что некоторые пользовательские типы сообщений, используемые некоторыми плагинами, не совсем точно соединяются с другими объектами (сообщениями, страницами и т. Д.), Поскольку они используют другие таксономии (а в случае вложений в средствах массовой информации они не используйте таксономии вообще, если я не свичу в плагине, чтобы исправить это – что есть, и я использую его, и он использует другую таксономию …). На самом деле, некоторые типы плагинов имеют специфические таксономии, жестко закодированные, поэтому я не могу пройти через и изменить свой основной код, иначе обновление плагинов уничтожит всю мою тяжелую работу.

Чтобы устранить эту фрагментацию и восприятие долгой, трудной работы по взлому плагинов и / или WordPress, я первоначально использовал материал Advanced Taxonomy с WP_Query и это работало хорошо, пока я не нашел, что мне нужна дополнительная информация с метатегами и даже изменить упорядочивание по умолчанию на основе post_type и meta_values специфичных для post_type . Итак, теперь я иду на более короткий «длинный, трудный» рабочий маршрут и написал собственный собственный SQL-конструктор для извлечения объектов на основе тегов / мета-отношений с пользовательским упорядочением в post_type как того требует проект.

Одна вещь, которую мне бы хотелось сделать, поэтому я могу использовать как этот новый пользовательский запрос, так и существующие методы WP_Query , обнаруживает способ WP_Query результатов пользовательского запроса в класс WP_Query поэтому я могу использовать have_posts и the_post – в основном все хороший материал за стол. $wpdb->get_results только дает мне простой массив результатов, и я не очень WP_Query и $wpdb niggly bits; может WP_Query позволить мне делать некоторые фанки пользовательских выбирает, объединяет, а затем заказывает на основе выбранных столбцов? Могу ли я просто get_posts() SQL-запрос get_posts() чтобы получить оболочку WP_Query и ее великолепную функциональность Loop?

Уже поздно, и я так близок к решению этой загадки, поэтому я буду благодарен за вашу помощь, Оби Ван Кеноби; На данный момент самым простым решением является have_posts() применяемая к have_posts() массиву результатов сообщений, полученных через $wpdb->get_results , чтобы затем легко и без проблем инициировать WP Loop на этом наборе результатов публикации. Если вы знаете какой-либо другой способ сделать это (пользовательские запросы, возможно?) Я все уши.

setup_postdata позволит вам использовать функции цикла с результатами сообщений через get_posts .

другой вариант – использовать различные фильтры, доступные для изменения поведения posts_join , posts_where , posts_orderby .

О, я думаю, я, возможно, понял это; Я просто наткнулся на него, так что еще рано. Я пытаюсь сделать некоторые дерзкие вещи, поэтому в настоящий момент это очень мало, но должно служить в качестве возможной основы:

 function get_posts_custom_query( $query_args ) { global $wpdb; // Do the necessary funky stuff here to build $sql_query from the given $query_args $custom_query = $wpdb->get_results($sql_query); // If you've limited the results returned and using SQL_CALC_FOUND_ROWS in the select query... if ( $query_args['posts_per_page'] > 1 ) { $found_posts = $wpdb->get_var('SELECT FOUND_ROWS()'); $max_num_pages = ceil($found_posts/$query_args['posts_per_page']); } // Sanitise each post result foreach( $custom_query as $i => $post ) { $custom_query[$i] = sanitize_post($post, 'raw'); } // Setup WP_Query object $new_wp_query = new WP_Query(); $new_wp_query->query = $sql_query; $new_wp_query->posts = $custom_query; $new_wp_query->post_count = count($custom_query); if ( isset($found_posts) ) $new_wp_query->found_posts = $found_posts; if ( isset($max_num_pages) ) $new_wp_query->max_num_pages = $max_num_pages; // Set the first post if ( $new_wp_query->post_count > 0 ) $new_wp_query->post = $custom_query[0]; return $new_wp_query; }