Иногда возникает необходимость исключить некоторые посты/записи из ленты постов/записей. Это может потребоваться для записей которые не “ложатся” в основное направление сайта. Например, на этом сайте, посвященном самостоятельным путешествиям, да еще в режиме дневника, когда следующая запись это следующий отрезок путешествия, будет странно выглядеть, например, такая последовательность постов.
День 55-56 : Орландо — Галтинберг. Great Smokey Mountains. Восточное США и Карибы!
День 42 — 54: Две недели в Орландо. Апартаменты Club Orlando. Восточное США и Карибы!
Что противопоставить нефтедоллару.
День 41: Круиз по Багамам завершён, едем в Орландо. Восточное США и Карибы!
Я пробовал для таких “нетипичных” записей использовать страницы. Но страницы имеют множество ограничений по функционалу, например, их нельзя группировать в рубрики, у страницы нет предыдущей/следующей страницы и тд.
Публиковать такие посты/зписи где то в другом месте, тоже не совсем логично (конечно если у вас не несколько блогов разной тематики!)) ).
Для исключения постов/записей из ленты есть простое решение – плагин Ultimate Category Excluder. В нем просто отмечаете какие категории/рубрики нужно исключить из ленты и все. Конечно посты/записи, которые необходимо исключить, должны находиться в отдельных категориях/рубриках.
Подчеркну, что это не “прятание” постов/записей и их категорий/рубрик. Например, они остаются видны и доступны в виджете категорий/рубрик (если конечно вы не настроили их исключение и там, некоторые виджеты это позволяют).
Так же есть решения не на основе плагина, а на основе кода.
Но у все этих решений есть один существенный недостаток.
При чтении поста/записи, внизу отображаются следующий/предыдущий пост/запись. И все эти плагины/решения это никак не исправляют.
В интернете я нашел решение в виде кода как удалить посты/записи из “исключенных” категорий/рубрик. Но оно полностью удаляет посты/записи из исключенных категорий/рубрик, даже когда читается пост/запись из исключенной категории/рубрики. А это не совсем логично, например если кто-то читает пост про Парадокс близнецов, логично будет показать что есть предыдущий пост/запись из этой категории/рубрики Легенды и мифы детонационных двигателей, и следующий – О теориях относительности.
С помощью rikitikitari я модифицировал код так, что бы работал по принципу – при просмотре кода из “исключенных” категорий/рубрик, в блоке предыдущий следующий пост/запись отображались и посты из категорий/рубрик в которые входит этот пост/запись.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | function exclude_cat_from_previous_next_JOIN( $join = null, $in_same_cat = false, $excluded_categories = '' ) { if ( is_admin() ) { return $join; } else { global $wpdb; // NOTE: The p in p.ID is assigned from $wpdb->posts in the get_adjacent_post function. return $join." INNER JOIN $wpdb->term_relationships ON (p.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)"; } } add_filter( 'get_next_post_join', 'exclude_cat_from_previous_next_JOIN', 10, 3 ); add_filter( 'get_previous_post_join', 'exclude_cat_from_previous_next_JOIN', 10, 3 ); function exclude_cat_from_previous_next_WHERE( $where = null, $in_same_cat = false, $excluded_categories = '' ) { if ( is_admin() ) { return $where; } else { global $wpdb;; $exclude = '681, 682, 683, 684'; //The IDs of the categories to exclude. // Разобьем строку на массив $exclude_array = explode( ',', $exclude ); // Уберем пробелы в каждом элементе $exclude_array = array_map( 'trim', $exclude_array ); // Тут получим текущий пост global $post; // массив объектов его категорий $my_post_id=get_the_ID( ); $cats = get_the_category( $post->ID ); // Создадим массив для id категорий $cats_array = array(); // Заполним массив id foreach( $cats as $category ) { array_push( $cats_array, $category->cat_ID ); } // Удаляем из массива "сключенных категорий" категории в которых содержится текущий пост $result = array(); $result = array_diff ($exclude_array, $cats_array); //создаем строковую переменную из элементов массива $result, с разделенными точкой и пробелами элементами $result2=''; foreach ($result as &$value) { $result2 .= "$value"; $result2 .= ', '; } $result2 = rtrim($result2, ", "); $result2 = apply_filters( 'exclude_cat_from_previous_next_WHERE_filter', $result2 ); return $where." AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id NOT IN ($result2)"; } } add_filter( 'get_next_post_where', 'exclude_cat_from_previous_next_WHERE', 10, 3); add_filter( 'get_previous_post_where', 'exclude_cat_from_previous_next_WHERE', 10, 3); |
Этот код, чтобы он не слетал при каждом обновлении, я вставил на сайт с помощью плагина Add Shortcodes Actions And Filters.
Результат работы двух плагинов и кода вы можете видеть в конце этой статьи!))
Ну а если вы сможете предложить более “правильное” решение – пишите!!