Иногда возникает необходимость исключить некоторые посты/записи из ленты постов/записей. Это может потребоваться для записей которые не “ложатся” в основное направление сайта. Например, на этом сайте, посвященном самостоятельным путешествиям, да еще в режиме дневника, когда следующая запись это следующий отрезок путешествия, будет странно выглядеть, например, такая последовательность постов.
День 55-56 : Орландо — Галтинберг. Great Smokey Mountains. Восточное США и Карибы!
День 42 — 54: Две недели в Орландо. Апартаменты Club Orlando. Восточное США и Карибы!
Что противопоставить нефтедоллару.
День 41: Круиз по Багамам завершён, едем в Орландо. Восточное США и Карибы!
Я пробовал для таких “нетипичных” записей использовать страницы. Но страницы имеют множество ограничений по функционалу, например, их нельзя группировать в рубрики, у страницы нет предыдущей/следующей страницы и тд.
Публиковать такие посты/зписи где то в другом месте, тоже не совсем логично (конечно если у вас не несколько блогов разной тематики!)) ).
Для исключения постов/записей из ленты есть простое решение – плагин Ultimate Category Excluder. В нем просто отмечаете какие категории/рубрики нужно исключить из ленты и все. Конечно посты/записи, которые необходимо исключить, должны находиться в отдельных категориях/рубриках.
Подчеркну, что это не “прятание” постов/записей и их категорий/рубрик. Например, они остаются видны и доступны в виджете категорий/рубрик (если конечно вы не настроили их исключение и там, некоторые виджеты это позволяют).
Так же есть решения не на основе плагина, а на основе кода.
Но у все этих решений есть один существенный недостаток.
При чтении поста/записи, внизу отображаются следующий/предыдущий пост/запись. И все эти плагины/решения это никак не исправляют.
В интернете я нашел решение в виде кода как удалить посты/записи из “исключенных” категорий/рубрик. Но оно полностью удаляет посты/записи из исключенных категорий/рубрик, даже когда читается пост/запись из исключенной категории/рубрики. А это не совсем логично, например если кто-то читает пост про Парадокс близнецов, логично будет показать что есть предыдущий пост/запись из этой категории/рубрики Легенды и мифы детонационных двигателей, и следующий – О теориях относительности.
С помощью rikitikitari я модифицировал код так, что бы работал по принципу – при просмотре кода из “исключенных” категорий/рубрик, в блоке предыдущий следующий пост/запись отображались и посты из категорий/рубрик в которые входит этот пост/запись.
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.
Результат работы двух плагинов и кода вы можете видеть в конце этой статьи!))
Ну а если вы сможете предложить более “правильное” решение – пишите!!
[box type=”note” align=”” class=”” width=””]Это моя статья с моего старого сайта о путешествиях selftrips.ru. Тогда у меня не было другого сайта, и я публиковал там совершенно не тематические статьи.Теперь переношу сюда. Дата оригинальной статьи.[/box]