Похожие сообщения Исключая определенные категории

Я использую связанные сообщения PHP WordPress, но с проблемами, исключая категории. Я пробовал исключать через cat и category__not_in так же, как и не как массив. Что я настраиваю неправильно?

 <?php $orig_post = $post; global $post; $categories = get_the_category($post->ID); if ($categories) { $category_ids = array(); foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id; $args=array( 'cat' => array(-6,-173,-174), 'category__in' => $category_ids, 'category__not_in' => (6, 173, 174), 'post__not_in' => array($post->ID), 'posts_per_page'=> 3, // Number of related posts that will be displayed. 'orderby'=>'rand' // Randomize the posts ); $my_query = new wp_query( $args ); if( $my_query->have_posts() ) { echo '<ul class="realted-article">'; while( $my_query->have_posts() ) { $my_query->the_post(); ?> <li> <a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"> </a> <div class="perfect-related_by-category"> <strong><a href="<? the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></strong> <a href="<?php echo get_permalink();?>"> <?php if(get_field('summary_text')=='') {echo substr(strip_tags(get_the_content()),0,90);} else{echo strip_tags(get_field('summary_text'));}?> </a> </div> </li> <? } echo '</ul>'; } } $post = $orig_post; wp_reset_query(); ?> 

Solutions Collecting From Web of "Похожие сообщения Исключая определенные категории"

Вы можете просто запустить цикл foreach и исключить термины из возвращаемого массива терминов. Всего несколько заметок

  • cat принимает строку или целое значение, а не и массив

  • category__not_in должен быть массивом

Ниже приведена измененная версия связанной функции сообщений, которую я недавно сделал здесь . Пожалуйста, пойдите, проверьте и проверьте, как использовать параметр $args , просто помните, что он перешел на третий параметр в новой функции 😉

Вот код ( я прокомментировал код, чтобы вы могли его отслеживать, он не тестировался и требует PHP 5.4+ )

 function get_related_posts( $taxonomy = '', $exclude = [], $args = [] ) { /* * Before we do anything and waste unnecessary time and resources, first check if we are on a single post page * If not, bail early and return false */ if ( !is_single() ) return false; /* * Check if we have a valid taxonomy and also if the taxonomy exists to avoid bugs further down. * Return false if taxonomy is invalid or does not exist */ if ( !$taxonomy ) return false; $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING ); if ( !taxonomy_exists( $taxonomy ) ) return false; /* * We have made it to here, so we should start getting our stuff togther. * Get the current post object to start of */ $current_post = get_queried_object(); /* * Get the post terms */ $terms = get_the_terms( $current_post->ID, $taxonomy ); /* * Lets only continue if we actually have post terms and if we don't have an WP_Error object. If not, return false */ if ( !$terms || is_wp_error( $terms ) ) return false; // Define our array to hold the term id'saveHTML $term_ids = []; foreach ( $terms as $term ) { // Check if we have terms to exclude and exclude them if ( $exclude ) { if ( in_array( $term->id, $exclude ) ) continue; } else { $term_ids[] = (int) $term->term_id; } /* * Set the default query arguments */ $defaults = [ 'post_type' => $current_post->post_type, 'post__not_in' => [$current_post->ID], 'tax_query' => [ [ 'taxonomy' => $taxonomy, 'terms' => $term_ids, 'include_children' => false ], ], ]; /* * Validate and merge the defaults with the user passed arguments */ if ( is_array( $args ) ) { $args = wp_parse_args( $args, $defaults ); } else { $args = $defaults; } return $q; } 

Вы использовали бы это, как следует, затем

 if ( function_exists( 'get_related_posts' ) ) { $related_posts = get_related_posts( 'my_taxonomy_name', // Taxonomy name, if build in, in should be 'category' [1, 2, 3] // Array of terms to exclude ); if ( $related_posts ) { foreach ( $related_posts as $post ) { setup_postdata( $post ); // Use your template tags and html mark up as normal like the_title(); the_content(); // etc etc } wp_reset_postdata(); } }