Intereting Posts
Отображение greyed out nav link, когда нет следующего или предыдущего сообщения как изменить роли пользователей для пользователей, у которых их нет. (около 8000 пользователей) Меню не видны при появлении после регистрации is_home () возвращает false на домашней странице! Когда домашняя страница НЕ является домашней страницей? Как отключить Добавление новых пользователей на дочерних сайтах в Multisite? Организация шаблона архива типа персонализированного сообщения Присоединитесь к запросу wpdb .. смутитесь! Добавить класс в текущую должность в query_post Как устранить префикс permalink в WordPress Multisite Различные цвета для панели навигации Как создать таблицу в wordpress без плагина? Отменить регистрацию nextgen на страницах shopp Как отправить почту с помощью пользовательских данных формы с помощью WordPress захватить или загрузить текст по запросу Короткие замыкания на метаблоках

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

Вопрос

Как сначала выводить теги, связанные с тегами, тогда, если есть меньше, чем 4 сообщения, связанные с тегами, заполните остальные 4 места заголовками, относящимися к категории?

сценарий

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

Чтобы решить эту проблему, было бы неплохо показывать сообщения из связанных категорий, если для сообщений posts_per_page => X недостаточно сообщений, связанных с posts_per_page => X .

Итак, что-то вроде этого:


Сценарий A – если существует более 4 сообщений, связанных с тегами, то:

 Related Posts: Show the below posts: 1. tag-related post #1 2. tag-related post #2 3. tag-related post #3 4. tag-related post #4 Do Not show the below posts: 5. tag-related post #5 6. tag-related post #6 7. tag-related post #7 ... 

Сценарий B – если существует только 2 сообщения, связанные с тегами, то:

 Related Posts: Show the below posts: 1. tag-related post #1 2. tag-related post #2 3. category-related post #1 4. category-related post #2 Do Not show the below posts: 5. category-related post #3 6. category-related post #4 7. category-related post #5 ... 

Что я пробовал

Налоговый запрос, который я использую:

 // start of the tax_query arguments $args = array( 'posts_per_page'=>4, 'post__not_in' => array($post->ID), 'tax_query' => array( 'relation' => 'OR' ) ); // get current post tags $tags = wp_get_object_terms( $post->ID, 'post_tag', array( 'fields' => 'ids' ) ); if ( !empty( $tags ) ) { $args['tax_query'][] = array( 'taxonomy' => 'post_tag', 'field' => 'id', 'terms' => $tags ); } // get current post categories $categories = wp_get_object_terms( $post->ID, 'category', array( 'fields' => 'ids' ) ); if ( !empty( $categories ) ) { $args['tax_query'][] = array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => $categories ); } // the query $related_query = new WP_Query( $args ); 

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

Тем не менее он сначала выводит заголовки категорий (из которых их много), которые удовлетворяют 4 сообщениям в правиле экранов и не содержат наиболее важные сообщения, связанные с тегами. Я пробовал перемещать код, используя AND вместо OR , который не работал и не имел никакого смысла для меня.

Я также видел эти сообщения: WordPress – создание списка сообщений, отфильтрованных по тегам, а затем по категориям и сообщениям WordPress по тегам и категориям , но они выводят список сообщений, отфильтрованных по тегу AND category. Мне нужны сообщения, которые сначала связаны с тегом, а если 4 или более, то просто выводят те, которые находятся в верхней части 4. Если меньше 4, то выводятся до такого количества должностей, связанных с категорией, чтобы соответствовать критериям четырех должностей.

Ясно, что я не понимаю вопрос и / или проблему, поэтому любая помощь будет оценена.

РЕШЕНИЕ

Решение Питера отлично работает – спасибо, Питер!

Я еще немного поработал над этим для своих целей и, используя ваш замечательный код, я также смог исключить «Недавние сообщения» из этого запроса – woohoo!

Solutions Collecting From Web of "Как набрать запрос X количество сообщений, связанных по тегу, сначала, а затем по категории, если этого недостаточно, связанных с тегами"

Вы не можете сделать это в одном запросе, это слишком сложно для того, что WP_Query может сделать в этот момент времени. Нам нужно будет запустить как минимум два ( я собираюсь использовать 3 ) запросы здесь, чтобы достичь того, что вы хотите

ПЕРВЫЙ ЗАПРОС

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

ВТОРОЙ ЗАПРОС

Этот запрос будет обрабатывать сообщения о заполнении, которые будут поступать из таксономии category . Чтобы этот запрос был успешным, нам понадобится следующее

  • Исключить текущую запись и сообщения из первого запроса, чтобы избежать дублирования сообщений

  • Получите количество сообщений в первом запросе, вычтите из 4, а затем используйте это различие, чтобы установить количество сообщений, которые должны быть получены этим запросом

Мы также просто получим почтовый идентификатор здесь

ТРЕТИЙ ЗАПРОС

Чтобы сохранить целостность объекта запроса, мы объединим все идентификаторы из предыдущего запроса и запросим окончательные объекты сообщения. Вы можете подумать, что это дорого, но это не так. Поскольку первые два запроса используют get_posts() и получают только идентификаторы сообщений, они действительно очень быстрые. При запросе только идентификаторов мы также не обновляем кеши, что делает эти запросы еще быстрее

РЕШЕНИЕ

Я предпочитаю создавать функцию для таких больших частей, как код, поскольку он сохраняет мои шаблоны в чистоте. Обратите внимание: следующее не проверено и требует PHP 5.4

 function get_max_related_posts( $taxonomy_1 = 'post_tag', $taxonomy_2 = 'category', $total_posts = 4 ) { // First, make sure we are on a single page, if not, bail if ( !is_single() ) return false; // Sanitize and vaidate our incoming data if ( 'post_tag' !== $taxonomy_1 ) { $taxonomy_1 = filter_var( $taxonomy_1, FILTER_SANITIZE_STRING ); if ( !taxonomy_exists( $taxonomy_1 ) ) return false; } if ( 'category' !== $taxonomy_2 ) { $taxonomy_2 = filter_var( $taxonomy_2, FILTER_SANITIZE_STRING ); if ( !taxonomy_exists( $taxonomy_2 ) ) return false; } if ( 4 !== $total_posts ) { $total_posts = filter_var( $total_posts, FILTER_VALIDATE_INT ); if ( !$total_posts ) return false; } // Everything checks out and is sanitized, lets get the current post $current_post = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() ); // Lets get the first taxonomy's terms belonging to the post $terms_1 = get_the_terms( $current_post, $taxonomy_1 ); // Set a varaible to hold the post count from first query $count = 0; // Set a variable to hold the results from query 1 $q_1 = []; // Make sure we have terms if ( $terms_1 ) { // Lets get the term ID's $term_1_ids = wp_list_pluck( $terms_1, 'term_id' ); // Lets build the query to get related posts $args_1 = [ 'post_type' => $current_post->post_type, 'post__not_in' => [$current_post->ID], 'posts_per_page' => $total_posts, 'fields' => 'ids', 'tax_query' => [ [ 'taxonomy' => $taxonomy_1, 'terms' => $term_1_ids, 'include_children' => false ] ], ]; $q_1 = get_posts( $args_1 ); // Count the total amount of posts $q_1_count = count( $q_1 ); // Update our counter $count = $q_1_count; } // We will now run the second query if $count is less than $total_posts if ( $count < $total_posts ) { $terms_2 = get_the_terms( $current_post, $taxonomy_2 ); // Make sure we have terms if ( $terms_2 ) { // Lets get the term ID's $term_2_ids = wp_list_pluck( $terms_2, 'term_id' ); // Calculate the amount of post to get $diff = $total_posts - $count; // Create an array of post ID's to exclude if ( $q_1 ) { $exclude = array_merge( [$current_post->ID], $q_1 ); } else { $exclude = [$current_post->ID]; } $args_2 = [ 'post_type' => $current_post->post_type, 'post__not_in' => $exclude, 'posts_per_page' => $diff, 'fields' => 'ids', 'tax_query' => [ [ 'taxonomy' => $taxonomy_2, 'terms' => $term_2_ids, 'include_children' => false ] ], ]; $q_2 = get_posts( $args_2 ); if ( $q_2 ) { // Merge the two results into one array of ID's $q_1 = array_merge( $q_1, $q_2 ); } } } // Make sure we have an array of ID's if ( !$q_1 ) return false; // Run our last query, and output the results $final_args = [ 'ignore_sticky_posts' => 1, 'post_type' => $current_post->post_type, 'posts_per_page' => count( $q_1 ), 'post__in' => $q_1, 'order' => 'ASC', 'orderby' => 'post__in', 'suppress_filters' => true, 'no_found_rows' => true ]; $final_query = new WP_Query( $final_args ); return $final_query; } 

Теперь вы можете использовать эту функцию в своем единственном шаблоне

 $query = get_max_related_posts(); if ( $query ) { while ( $query->have_posts() ) { $query->the_post(); echo get_the_title() . '</br>'; } wp_reset_postdata(); } 

ПОСЛЕДНИЕ ПРИМЕЧАНИЯ

  • Значения по умолчанию уже установлены для post_tag , category и 4 для трех параметров соответственно, поэтому вам необходимо передать любые значения функции при вызове

  • Если вам нужно обменивать таксономии вокруг или устанавливать разные таксономии или устанавливать посты на страницу на что-либо еще, кроме 4, просто передайте их в правильном порядке функции

     $query = get_max_related_posts( 'tax_1', 'tax_2', 6 );