Intereting Posts

Связанные записи во всех категориях текущего сообщения (пользовательские типы сообщений)

У моего клиента есть пользовательские типы сообщений, которые они настраивают с помощью плагина, а не определяют их в функции functions.php. (Таким образом, YARPP для решения не будет работать). В этих настраиваемых типах сообщений они имеют разные категории. Каждый пост принадлежит одной или нескольким категориям. После каждого сообщения они хотели бы отобразить 5 сообщений, которые находятся во ВСЕХ одинаковых категориях (может быть одна или много категорий).

Итак, мне нужно сделать способ динамически найти все категории, к которым принадлежит сообщение (я сделал это и настроил его как эхо прямо сейчас, пока не смогу это сделать), а затем запрос, чтобы найти 5 которые принадлежат к тем же категориям (либо они принадлежат всем, либо не должны отображаться).

Вот код, который я придумал, но я не могу понять, как «объединить их», поэтому он не только получает термины (категории), но и заставляет запрос использовать эти термины для фильтрации 5 «связанных» программы.

//get the post's terms (troubleshooting - can be removed once figured out! $category_terms = wp_get_object_terms($post->ID, 'category'); if(!empty($category_terms)){ if(!is_wp_error( $category_terms )){ echo 'Terms <ul>'; foreach($category_terms as $term){ echo '<li><a href="'.get_term_link($term->slug, 'category').'">'.$term->name.'</a></li>'; } echo '</ul>'; } } //get post terms done // get the custom post type's taxonomy terms $custom_taxterms = wp_get_object_terms( $post->ID, 'category', array('fields' => 'ids') ); // arguments $args = array( 'post_type' => 'program_listings', 'post_status' => 'publish', 'posts_per_page' => 5, // you may edit this number 'orderby' => 'rand', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => $custom_taxterms ) ), 'post__not_in' => array ($post->ID), ); $related_items = new WP_Query( $args ); // loop over query if ($related_items->have_posts()) : echo '<h2>Other Programs in this category</h2><ul>'; while ( $related_items->have_posts() ) : $related_items->the_post(); ?> <li style="margin-left:10px;list-style:none;"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?></a></li> <?php endwhile; echo '</ul>'; endif; // Reset Post Data wp_reset_postdata(); 

Итак, получите термины posts & echo them (это будет не эхо, когда оно будет закончено – я делаю это, чтобы убедиться, что он действительно получил категории / термины) отлично работает. Он отображает каждую «категорию», в которой находится сообщение. Но второй бит отображает сообщения из любой из этих категорий, а не записи, которые находятся только во ВСЕХ категориях.

В принципе, мне нужно объединить первую и вторую части, чтобы запрос возвращал результаты сообщений, которые находятся во ВСЕХ категориях текущего сообщения. Если сообщение не во всех одинаковых категориях (точное соответствие для ВСЕХ категорий текущего сообщения), оно не должно быть возвращено. (Например, если сообщение находится в родительской категории «Северная Америка», но не в любой другой категории, в которой находится сообщение, оно НЕ должно быть возвращено в результатах).

Solutions Collecting From Web of "Связанные записи во всех категориях текущего сообщения (пользовательские типы сообщений)"

Вы пытались добавить 'operator' в ваш tax_query :

 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => $custom_taxterms, 'operator' => 'AND' ) ), 

Это код, который необходим для того, чтобы он отображал только сообщения (которые были определенного типа сообщений), которые соответствовали одной и той же дочерней категории (поэтому соответствовали всем другим категориям):

 <!-- other posts --> <?php //this gets the lowest hierarchical child term for current post $categories = get_the_category($post->ID); foreach($categories as $category) : $children = get_categories( array ('parent' => $category->term_id )); $has_children = count($children); if ( $has_children == 0 ) { $current_child = $category->name; } endforeach; //this starts the query for the program listings custom post types $post_type = 'program_listings'; $tax = 'category'; $tax_terms = wp_get_object_terms($post->ID, 'category'); if ($tax_terms == $category_terms) { foreach ($tax_terms as $tax_term) { $args=array( 'post_type' => $post_type, "$tax" => $tax_term->slug, 'post_status' => 'publish', 'operator' => 'AND', 'posts_per_page' => 5,//limits the listing to 5 'caller_get_posts'=> 1, 'post__not_in' => array ($post->ID), 'orderby' => 'ID', //orders by ID, you could also tell it to order by: 'author' 'title''name''date' or 'rand' 'order' => 'ASC', //tells it the display order should be ascending, DSC would indicate a descending order ); $my_query = null; $my_query = new WP_Query($args); if( $my_query->have_posts() && $tax_term->name == $current_child)//now only display categories the current post is in { echo '<h2>Other programs in this category</h2><ul>'; while ($my_query->have_posts() && $tax_term->name==$current_child ) : $my_query->the_post(); ?> <li style="margin-left:15px;list-style:none;"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php endwhile; } wp_reset_query(); } } echo '</ul>'; ?> <!-- end other posts -->