Intereting Posts
Содержимое WordPress 3.1 .htaccess продолжает исчезать? Как вставить локальное изображение с нестандартным размером Отображение категории WooCommerce на пользовательской странице Как найти сообщение с помощью post_excerpt? Как выделить правильный элемент на панели навигации Лучший способ узнать, является ли комментарий от пользователя? Использование current_user_can () Отобразить самую глубокую категорию детей из категории X (в цикле) Получать все изображения из содержимого сообщений Параметры apache_mod_loaded могут подключаться к плагинам? Как установить плагин для automattic-разработчика под локальным хостом для мампа, когда есть ошибка, не рекомендуется? добавление ajax-нагрузки больше для отображения изображений из мета-окна Пользовательские комментарии WP комментариев Запрос с вложенными комментариями возможен? (Иерархия / глубина) Короткое обозначение из виджета обернуто в нежелательный элемент <p> Перезаписать файл темы из плагина

WP_query: meta_key с настраиваемым правилом для определенного значения

Я немного застрял в коде WP_Query. Вот :

$args = array( 'post_type' => 'post', 'meta_query'=> array( 'key' => 'karma', 'compare' => '>=', 'value' => 0, 'type' => 'numeric'), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); 

Что я хочу сделать :

Показать все сообщения с karma> = 0 (отлично работает с этим кодом). НО если есть сообщения с кармой = 100, то только 3 из них + остальные сообщения.

Примеры: 9 сообщений с кармой = 150, 133, 100, 100, 100, 100, 100, 33, 11.

Я хочу показать: 150, 133, 100, 100, 100, 33, 11. (Разрешено только 3 сообщения с кармой = 100).

Вы знаете, как это достичь? Возможно, add_filter('posts_where'); ?

UPDATE: Хорошо, я работал, основываясь на ответе @s_ha_dum. Это немного сложно, но результат работает;)

 $args = array( // Check for 9 last posts with karma = 100 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '=', 'value' => 100, 'type' => 'numeric' ) ), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); $karma_qry = new WP_Query($args); if (!empty($karma_qry->posts)) { $i = 0; foreach ($karma_qry->posts as $p) { $i++; // Check for more than 3 posts with karma = 100 // Add them in the $dont_show_me array if($i > 3){ $dont_show_me[] = $p->ID; } } } // Setup the final query that excluded addional posts with karma = 100 $args['meta_query'][0]['compare'] = '>='; $args['meta_query'][0]['value'] = 0; $args['post__not_in'] = $dont_show_me; $wp_query = new WP_Query($args); 

Solutions Collecting From Web of "WP_query: meta_key с настраиваемым правилом для определенного значения"

meta_query – массив массивов. Посмотрите на примеры в Кодексе .

  $args = array( 'post_type' => 'my_custom_post_type', 'meta_key' => 'age', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'age', 'value' => array(3, 4), 'compare' => 'IN', ) ) ); $query = new WP_Query($args); 

У вас есть только массив. Это может вызвать проблемы. Что вы хотите сделать, так это:

 $args = array( 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '>=', // limit to "karma value = 100" 'value' => 0, // limit to "karma value = 100" 'type' => 'numeric' ) ), 'posts_per_page' => 9, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); 

Однако, чтобы добраться до самого вопроса, вы не можете делать логику сложной, как вам нужно …

Показать все сообщения с karma> = 0 (отлично работает с этим кодом). НО если есть сообщения с кармой = 100, то только 3 из них + остальные сообщения.

… с одним WP_Query . Похоже, вы хотите вытащить 3, и только 3, посты с кармой, превышающей 100, и заполните все остальное. Это было бы сложно с чистым SQL. Я думаю, что это возможно в SQL, но я должен был бы думать много, чтобы быть уверенным, а тем более, чтобы заставить его работать.

Я бы предложил два запроса: один, чтобы получить «больше 100» и секунду, чтобы получить остальное.

 $dont_show_me = array(1); $args = array( 'post_type' => 'post', 'meta_query'=> array( array( 'key' => 'karma', 'compare' => '>=', 'value' => 100, 'type' => 'numeric' ) ), 'posts_per_page' => 3, 'meta_key' => 'karma', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'post__not_in' => $dont_show_me ); $karma_qry = new WP_Query($args); if (!empty($karma_qry->posts)) { $args['posts_per_page'] = 9 - $karma_qry->found_posts; $args['meta_query'][0]['value'] = 0; foreach ($karma_qry->posts as $p) { // assuming $dont_show_me is an array $dont_show_me[] = $p->ID; } $args['post__not_in'] = $dont_show_me; } else { $args['posts_per_page'] = 9; $args['meta_query'][0]['value'] = 0; } $the_rest_qry = new WP_Query($args); 

Я не могу проверить это, так как у меня нет данных karma на моем сервере, но я уверен, что это правильно. По крайней мере, вы должны получить от вас большую часть пути.