Тупик космонавтикиАмериканские баксы для американцев!Единая энергетическая система – фикция!Наш дорогой РоскосмосКонец Роскосмоса? – опубликована стоимость запуска астронавтоУкраина подтасовывает данныеПовышение тарифов на газ для населения РоссииRussian lives matterШведы продолжают умирать от коронавируса, американцы снижают летКонец эпохи офшоров?Карантинные режимы в регионах РоссииГазпром: пир во время чумыСлабость Сибири: расследованиеАнтиглобальный рынок энергоресурсовШвеция: ни карантина ни эпидемииПутин нашел высокодоходный рынок газаВ результате ошибки в США снизилась безработицаАвария в Норильске на ТЭЦ-3: факты, вопросы и дурдомГлава МЧС: я не знал, и губернатор не знал, а слон не догадывался̷Тотальный запрет куренияГермания: коронавирус оказался фейком, но потери реальныеПутин боится бунтаКак улучшить работу Яндекс ОблакаЗакат социальных сетейАнтисоветская ЗулейхаРолик-мечта. Стоп. СнятоСоциальная коммерция Яндекс ДзенКухарка – видеоблогерВыездная виза “пристрелить на границе”После COVID останется только выжженная земляСоюз меча и оралаБоевые учения мировой войныЗачем нужен Морской стартПоследний день АмерикиМикроволновка 5GСледующий шаг – на митинг по электронному пропуску?Как связано распространение коронавируса с сетями 5GЦена нефти WTI упала до -40 долларовПропускной режим в Москве и Московской области. Как получить элекЕврейский вопросБритания: радость пришла откуда не ждалиСоловьев на Вести-ФМ клянчит деньгиНовая сделка ОПЕК+: расширенный список стран и обязательствНефтяная самоизоляция СШАВВП США по секторам экономики в 2019 годуСможем ли мы вернуться к нормальной жизни?Скорость распространения коронавирусаКак сделать голосование в ДзенеГолосование: какие меры должно предпринять правительство?Масса с точки зрения физикиДостаточно ли у России продовольствия?Депозиты и валюта при Путине: что выгоднее?Международных резервов РФ хватит только на 20 недель?Титаник США налетел на айсберг коронавирусаСравнение влияния кризиса на людей в США и России
ГЛАВНАЯ >> Информационные технологии >> Как исключить записи, входящие в некоторые категории, из ленты и постов 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. Тогда у меня не было другого сайта, и я публиковал там совершенно не тематические статьи.Теперь переношу сюда. Дата оригинальной статьи.
© Копирование и перепечатка материалов только с разрешения автора

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

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