query_posts исключают мета-ключ

<?php query_posts(array('showposts' => 1000, 'post_parent' => $post->ID, 'post_type' => 'page', 'orderby' => 'title', 'order' => 'ASC', 'meta_key' => featured_product, 'meta_value' => 1)); ?> <?php query_posts(array('showposts' => 1000, 'post_parent' => $post->ID, 'post_type' => 'page', 'orderby' => 'title', 'order' => 'ASC')); ?> 

У меня есть 2 запроса, прежде всего, чтобы показать мета-ключ с помощью featured_product eq 1. Поэтому я хочу исключить все признанные продукты во втором запросе. Как я могу это сделать? Благодаря!

Solutions Collecting From Web of "query_posts исключают мета-ключ"

Мне никогда не удавалось получить мета-сравнение с работой, но я придумал обходной путь для этой точной ситуации (с «признаками» в верхней части страницы).

Во-первых, вы, вероятно, не должны использовать query_post для обоих запросов. Вы должны использовать пользовательский запрос, по крайней мере, для первого. Затем, пока вы используете этот цикл, сохраняйте идентификаторы любых «признанных» сообщений в переменной. Когда вы запускаете второй цикл, вы можете использовать аргумент «post__not_in» для исключения избранных. Вот так:

 // Set up a custom query $featured_query = new WP_query(); // Your query args $featured_args=array( 'post_type'=>'post', 'meta_key'=>'featured_product', 'meta_value'=>'1' ); // Run it $featured_query->query($featured_args); if ($featured_query->have_posts()) { while ($featured_query->have_posts()) { $featured_query->the_post(); // Remember the featued ID $featured_post_id = get_the_ID(); // Render your featured post here } } // Set up the args for your main query $args = array( 'post_type' => 'post', 'post__not_in' => array($featured_post_id) // Don't show the featured post ); // Now run your main query and so on... 

Ответ MathSmath в порядке, но он очень неэффективен и не будет масштабироваться на сайте WordPress с 100 000 + сообщениями или тем, что у вас есть. Выполнение WP_Query() для 1000 сообщений будет достаточно медленным.

Вместо использования posts_not_it (который передавал бы длинную строку запроса, если бы у вас было несколько тысяч сообщений здесь), если у вас есть MySQL 4.1+, было бы лучше использовать подзапрос, чтобы исключать сообщения, которые вам не нужны.

Вот немного модифицированный пример, который я использую на сайте с 250 000 + сообщениями.

 // add a filter to 'posts_where' to add the subquery add_filter( 'posts_where', '_exclude_meta_key_in_posts_where' ); // make the query, the below function will be called query_posts(array('showposts' => 1000, 'post_parent' => $post->ID, 'post_type' => 'page', 'orderby' => 'title', 'order' => 'ASC')); function _exclude_meta_key_in_posts_where( $where ) { global $wpdb; return $where . " AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = 'featured_product' AND meta_value > '' )"; } //remove the filter incase we do any more query_posts()s remove_filter( 'posts_where', '_exclude_meta_key_in_posts_where' ); 

Возможно, вы могли бы сделать все это в одном create_function() хотя я не уверен, что это очень эффективно, но будет меньше строк:

 // add a filter to 'posts_where' to add the subquery add_filter( 'posts_where', create_function( '$where', 'global $wpdb; return $where . " AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'featured_product\' AND meta_value > \'\' )";' ) ); 

Я не тестировал create_function() .

Я этого не пробовал, но некоторые исследования позволили мне это сделать. Используя meta_compare, вы можете проверить, не превышает ли meta_value 1 отображение сообщений.

 <?php query_posts(array('showposts' => 1000, 'post_parent' => $post->ID, 'post_type' => 'page', 'orderby' => 'title', 'order' => 'ASC', 'meta_value' => featured_product, 'meta_compare' => '!=', 'meta_value' => 1 )); ?> 

Мое решение состояло в том, чтобы добавить настраиваемое поле с «ложным» значением ко всем существующим сообщениям и связать создание новых сообщений, чтобы добавить к ним поле.

Я не уверен, что это более эффективный способ справиться с этой ситуацией, но я хотел держаться подальше от пользовательских SQL-запросов.

Ниже приведена функция одноразового использования, которую я использовал для добавления поля ко всем существующим сообщениям:

 function unfeature_all() { $args = array( 'numberposts' => -1, ); $posts = get_posts( $args ); foreach ($posts as $post) { $status = get_post_meta($post->ID, 'featured_post', true); if (!$status) { update_post_meta($post->ID, 'featured_post', false); } } } if (current_user_can('manage_options')) unfeature_all();