В цикле: сообщения имеют миниатюру И другие переменные

Я ищу для отображения сообщений, которые отвечают определенным требованиям. Прежде всего, идея состоит в том, чтобы показать посетителям наиболее просматриваемые сообщения. Я реализовал это с некоторой помощью . Итак, я получил эту работу со следующим PHP. У меня это работает для меня, что приятно. Теперь я хочу добавить ограничение, а именно: только сообщения с эскизами должны иметь право на цикл, но вы не можете просто пропустить сообщение, если у него нет миниатюры, и просто придумайте меньше сообщений в фактическом выходе: Мне нужно всего четыре должности! Поэтому, в идеале, мне нужен способ передать аргумент, который говорит «thumbnail» для WP_Query. Однако мне также нужно, чтобы meta_key уже присутствовал. Как я могу сохранить этот мета-ключ и использовать другое: я нашел здесь, что вы можете добавить 'key' => '_thumbnail_id' , но я не уверен, как добавить в этот запрос несколько ключей.

Имейте в виду, что мне нужно использовать orderby , который заказывает сообщения в порядке большинства просмотров.

Для полноты я отправлю весь фрагмент, учитывая ответ Питера Гузена. Я думал, что «30-й день» не изменит ситуацию, но теперь я понимаю, что это возможно. post_date_selection – функция в functions.php которая ограничивает сообщения за последние 30 дней. Я получил это отсюда .

 <?php if (is_home()) : ?> <section class="featured-posts clear"> <?php // restrict loop to 30 last days, see functions.php add_filter('posts_where', 'post_date_selection'); global $query_string; query_posts($query_string); ?> <?php $args = array( 'order' => 'DESC', 'posts_per_page' => 4, 'meta_key' => 'post_views_count', 'orderby' => 'meta_value_num', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'post_views_count', 'compare' => 'EXISTS' ), array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ), ), ); $popularPosts = new WP_Query($args); $counter = 1; ?> <?php while ($popularPosts->have_posts() ) : $popularPosts->the_post(); ?> <article class="box-<?php echo $counter++; ?>"> <a href=" <?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?><span><?php the_title(); ?></span></a> </article> <?php endwhile; ?> <?php wp_reset_postdata(); ?> </section> <?php endif; // is_home ?> <?php remove_filter('posts_where', 'post_date_selection'); // remove restriction from loop ?> 

Наиболее важные функции в functions.php:

 /* * Getting and setting post count */ // Set post count function set_post_views($postID) { $count_key = 'post_views_count'; $count = get_post_meta($postID, $count_key, true); if($count==''){ $count = 0; delete_post_meta($postID, $count_key); add_post_meta($postID, $count_key, '0'); }else{ $count++; update_post_meta($postID, $count_key, $count); } } // To keep the count accurate, lets get rid of prefetching remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0); // Update post count function track_post_views ($post_id) { if ( !is_single() ) return; if ( empty ( $post_id) ) { global $post; $post_id = $post->ID; } set_post_views($post_id); } add_action( 'wp_head', 'track_post_views'); // Only 30 last days, needs in content function post_date_selection ($when = '') { $when .= " AND post_date > '" . date('Ym-d', strtotime('-30 days')) . "'"; return $when; } 

Вы можете использовать параметры настраиваемого поля в WP_Query как и у вас, вам просто нужно немного расширить его

Вы можете выполнить сортировку по post_views_count и использовать meta_query чтобы получить все сообщения, которые имеют наибольшее количество просмотров просмотров и имеют миниатюру сообщения

Вероятно, вы можете попробовать что-то вроде этого

 $args = array( 'order' => 'DESC', 'posts_per_page' => 20, 'meta_key' => 'post_views_count', 'orderby' => 'meta_value_num', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'post_views_count', 'compare' => 'EXISTS' ), array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ), ), ); $popularPosts = new WP_Query( $args ); 

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

РЕДАКТИРОВАТЬ

Только на стороне примечания, вам нужно сбросить свой пользовательский запрос и, если на то пошло, любые и все пользовательские запросы, поскольку они будут влиять и будут влиять на другие запросы. Сразу после <?php endwhile; ?> <?php endwhile; ?> , добавьте <?php wp_reset_postdata(); ?> <?php wp_reset_postdata(); ?>

EDIT 2

Я проверил ваш код, и он сломал содержимое боковой панели. Я изменил код на код ниже. Он работает так, как ожидалось, только записи из последних тридцати извлекаются в соответствии с тем, что у него есть миниатюры сообщений и упорядочены по наибольшему количеству сообщений. Я также тестирую это на localhost. Еще одна вещь, которую вы должны принять к сведению, вам нужно, чтобы WordPress 3.9+ работал

Вам не нужно указывать значение при использовании сравнений «EXISTS» или «NOT EXISTS» в WordPress 3.9 и выше.

 <?php if (is_home()) : ?> <section class="featured-posts clear"> <?php function filter_where($where = '') { //posts in the last 30 days $where .= " AND post_date > '" . date('Ym-d', strtotime('-30 days')) . "'"; return $where; } add_filter('posts_where', 'filter_where'); $args = array( 'order' => 'DESC', 'posts_per_page' => 20, 'meta_key' => 'post_views_count', 'orderby' => 'meta_value_num', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'post_views_count', 'compare' => 'EXISTS' ), array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ), ), ); $popularPosts = new WP_Query( $args ); remove_filter('posts_where', 'filter_where'); $counter = 1; ?> <?php while ($popularPosts->have_posts() ) : $popularPosts->the_post(); ?> <article class="box-<?php echo $counter++; ?>"> <a href=" <?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?> <span><?php the_title(); ?></span> </a> </article> <?php endwhile; ?> <?php wp_reset_postdata(); ?> </section> <?php endif; // is_home ?> 

ИЗМЕНИТЬ 3

Вы также можете использовать подход, описанный в этом ответе на @ialocin, к одному из моих вопросов, чтобы применить и удалить фильтр, используя pre_get_posts . Этот код можно легко адаптировать для использования в пользовательском запросе. Я лично считаю, что это лучший метод для применения и удаления вашего настраиваемого фильтра для пользовательского запроса