Intereting Posts
Публиковать сообщения автора только с разрешения редактора? Ошибка перенаправления поискового URL-адреса Как отобразить открытый профиль пользователя с двумя дополнительными полями? (Включая исходный код GitHub) Каков самый простой способ создания перенаправления Сортировка по количеству сообщений в админ-области Возможность создания страницы / новой страницы пользователя Плагин MOLPay WooCommerce – Идентификатор заказа Добавление большего количества на esc_url tiny_mce_before_init: 'exact' => true не влияет Получить миниатюру сообщения в виде массива Использование wp_insert_post с сетью WP в сценарии cron Какая функция wordpress – это короткий код подписи, связанный с? Предложить плагин для mp3-плеера для веб-сайта группы? Как использовать post_title пользовательского типа сообщения как таксономии Функция, которая возвращает true, когда автор является определенной ролью is_author (admin)?

Как набрать запрос 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!

Вы не можете сделать это в одном запросе, это слишком сложно для того, что 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 );