Теплота сгорания компонентов природного газа согласно ГОСТЭнтальпия образованияТермодинамика солнечных панелей: можно ли солнечными лучами нагрВ каких единицах измеряется ядерная энергия и энергетические харНовые производства России, открытые в 2020 годуХотите зарабатывать 200 000? Вам уже поздно, но есть шанс у ваших детеСлучай на экзамене: как вместо 5 получилось 2Кидок Google – бесплатный объем для фото-видео ограничат 15ГБ. СамоНаше будущее – распределенная генерация, но все новое – хороНиконовы: Прадед Василий и прабабушка ПелагеяЗайцевы: Прадед Михей, его брат Архип и дед ПавелАльткотельная: что это такое и где обманываютБлаготворительность: за и противПроблемы современного образованияДо властей дошло – снижения ставки по ипотеке не делает жилье дАдекватность школьного курса математикиМожно ли увеличить мощность передаваемую по кабелюКак продолжительный карантин скажется на здоровьеСроки эпидемииКак наблюдать взаимное сокращение длины в обычной жизни, без всякЕГЭ по математике в дурдомеНидерланды: вход в закон евро, выход дваПутешествие бутылки из России в ГерманиюВызов России в Нагорный КарабахТеплота сгорания метана, бутана и пропанаНавальный стал совсем плохЭкспериментальная проверка парадокса близнецовВласти борются с анонимностью в интернете путем арестовСберМаркет: какое будущее нас ждетСравнение зависимости бюджета России от нефти 2011 и в 2021 годуНавальный обходит ПутинаСША: убийственные данные по эпидемииСоздателя Nexta будут судить?Парадокса близнецов нет: объяснение на школьном уровнеСкладывается впечатление, что пенсию скоро вообще отменятКак бухают американцыКак “прямо” проверить постоянство скорости светаВ чем суть парадокса “Парадокс близнецов”Мы говорим навальный, подразумеваем Скрипаль. Мы говорим Скрипал�Как сделать видеонаблюдение на даче?ОСАГО: кто виноват и что делатьСтраховые компании мошенничают с ОСАГО?Половина американцев не имеют свободных 100 долларовИмеют ли США право вводить санкции?Сколько платят за ЖКХ в США50% американцев получают от правительства больше денег, чем отдаютРаковая опухоль БелоруссииВельмі верагоднаКак отравили НавальногоЧто делать со старыми блоками питания?Кто ответит за карантин?Сила тяжести на поверхности классической черной дырыСравнение стоимости кВт⋅ч от солнечных панелей и ТЭСДоходы и расходы американцевПосле Лукашенко хоть потоп!

Как исключить записи, входящие в некоторые категории, из ленты и постов WordPress.

Иногда возникает необходимость исключить некоторые посты/записи из ленты постов/записей. Это может потребоваться для записей которые не “ложатся” в основное направление сайта. Например, на этом сайте, посвященном самостоятельным путешествиям, да еще в режиме дневника, когда следующая запись это следующий отрезок путешествия, будет странно выглядеть, например, такая последовательность постов.

День 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.

Результат работы двух плагинов и кода вы можете видеть в конце этой статьи!))

Ну а если вы сможете предложить более “правильное” решение – пишите!!

Это моя статья с моего старого сайта о путешествиях selftrips.ru. Тогда у меня не было другого сайта, и я публиковал там совершенно не тематические статьи.Теперь переношу сюда. Дата оригинальной статьи.
© Копирование и перепечатка материалов только с разрешения автора

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: