Intereting Posts
$ wpdb-> get_results () возвращает хороший результат только в первой итерации foreach Как добавить поддержку моей темы для пользовательских меню? Как фильтровать по slug в зависимости от выбора языка Лучшая практика для удобных для миграции изображений в сообщениях / страницах? Добавление пользовательских значений в Permalinks через пользовательские поля и сообщения wp_nav_menu действие / помощь фильтра Добавить категорию в класс body Шаблон страницы с полной шириной сверху, но контент с правой боковой панелью внизу? Использование WP_Query в mu-plugin У CSS WordPress есть Grids? Сохранение значений текстового поля в базе данных Как проверить дубликат записи перед вставкой с помощью wpdb Как ограничить автора, планируя дату публикации, на максимальный X дней вперед с текущей даты Как зарегистрировать меню на основе условия ACF Включение специального типа сообщений в виджет Архивы

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 на моем сервере, но я уверен, что это правильно. По крайней мере, вы должны получить от вас большую часть пути.