Intereting Posts
Пользовательская функция для шаблона архива портфеля с условным тегом Как я могу разместить всплывающую страницу и перенаправить все ссылки на WordPress на эту страницу? Создать редактор сообщений Выберите количество столбцов в 1 по умолчанию Google не может выполнять поиск на моем сайте использование html в качестве атрибута shortcode Как отображать виджеты внутри содержимого страницы без плагина? offset и max_num_pages в галерее пагинации Лучший способ отключить боковые панели на сообщениях (только)? Кнопка WordPress для пользователей отображать сообщения из категории в рамках пользовательской таксономии Две петли в одной функции show div только если есть связанная запись внутри код внезапно появляется из моего второго временного цикла Различные стили сообщений в зависимости от категории Переименование wp-admin без жесткого кодирования. Это действительно возможно?

WP_Query с двумя типами сообщений, но требующий категорию только для одного из этих типов сообщений

У меня простой WP_Query:

$loop = new WP_Query(array( 'post_type' => array('image', 'video'), 'category_name' => $cat, 'meta_key'=>'total_votes', 'orderby'=>'date meta_value_num' )); 

Как я могу изменить это так, чтобы он возвращал только видео с помощью editor-pick тегов, все еще возвращая все изображения независимо от тегов?

Я ищу фильтр для добавления в запрос MySQL, чтобы порядок и разбивка на страницы оставались неповрежденными.

Мне довелось сегодня работать над чем-то подобным, и просто вспомнил, что вы искали что-то подобное, поэтому позвольте мне поделиться им с вами.

Вот как можно использовать фильтр posts_where чтобы ограничить WP_Query , сообщениями в некоторых пользовательских типах сообщений cpt1 ИЛИ другом типе post cpt2, который привязан к некоторому таксономическому термину.

Вот пример:

 add_filter( 'posts_where', 'wpse_posts_where' ); $loop = new WP_Query( $args ); 

где

 /** * Restrict WP_Query to ( cpt1 OR cpt2 attached to a given term in some taxonomy). * * @see http://wordpress.stackexchange.com/a/173889/26350 */ function wpse_posts_where( $where ) { global $wpdb; // Run this filter callback only once: remove_filter( current_filter(), __FUNCTION__ ); // Modify this to your needs: $cpt1 = 'image'; $cpt2 = 'video'; $taxonomy = 'post_tag'; // Related to cpt2 $term_slug = 'editor-pick'; // Related to cpt2 // Get the term info for the term_taxonomy_id: $term = get_term_by( 'slug', $term_slug, $taxonomy ); // Modify the SQL query: if( ! is_wp_error( $term ) ) { $where .= " AND ( {$wpdb->posts}.post_type = '{$cpt1}' OR {$wpdb->posts}.post_type = '{$cpt2}' AND {$wpdb->posts}.post_status = 'publish' AND {$wpdb->posts}.ID IN ( SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN ( {$term->term_taxonomy_id} ) ) ) "; } return $where; } 

где вам, возможно, придется изменить его в соответствии с вашими потребностями.

К сожалению, вы не можете. По крайней мере, не с одним WP_Query , то есть. Однако вы можете выполнить два отдельных запроса – по одному для каждого типа сообщений, а затем объединить результаты. Вот так:

 $args = array( 'post_type' => 'image', 'category_name' => $cat, 'meta_key' => 'total_votes', 'orderby' => 'date meta_value_num', ); $loop = new WP_Query( $args ); $args = array( 'post_type' => 'video', 'category_name' => $cat, 'tag' => 'editor-pick', 'meta_key' => 'total_votes', 'orderby' => 'date meta_value_num', ); $loop2 = new WP_Query( $args ); $loop->posts = array_merge( $loop->posts, $loop2->posts ); $loop->found_posts += $loop2->found_posts; $loop->max_num_pages = ceil( $loop->found_posts / $loop->query_vars[ 'posts_per_pages' ] ); 

Примечание. Это непроверенный код. Я надеюсь, что это может помочь вам.

 // tell WordPress about our new query var function wpse52480_query_vars( $query_vars ){ $query_vars[] = 'my_special_query'; return $query_vars; } add_filter( 'query_vars', 'wpse52480_query_vars' ); // check if our query var is set in any query function wpse52480_pre_get_posts( $query ){ if( isset( $query->query_vars['my_special_query'] ) ) // do special stuff return $query; } add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' ); 

и в шаблоне:

 // set the query var (along with whatever others) to trigger the filter $args = array( 'my_special_query' => true ); $my_secondary_loop = new WP_Query( $args ); 

Вы можете использовать параметры таксономии для достижения этого https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters