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

Как исключить записи, входящие в некоторые категории, из ленты и постов 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. Тогда у меня не было другого сайта, и я публиковал там совершенно не тематические статьи.Теперь переношу сюда. Дата оригинальной статьи.
© Копирование и перепечатка материалов только с разрешения автора

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

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