Бдительный categories php. Критические части кода в приложении php? #4 Древовидная проверка принадлежности к термину

В статье описан функционал, который доступен в PHP (актуально для 5.3.х) для обработки ошибок всех типов, включая ошибки интерпретации кода (E_ERROR, E_PARSE, E_WARNING, etc). Эта обработка поможет вам для управляемого отображения страницы в случае возникновения таких проблем. В статье присутствует множество описаний и рабочих примеров(архитектуры) для того, что бы сразу воспользоваться в своем программном продукте. В конце концов, ну немного сломали сайт, ну надо же, об этом сообщить поисковику с заголовком 4хх или 5хх и повеселить пользователя, вместо возврата белого экрана (или что хуже экрана со священной информацией, для хакеров) с ответом 200 Ok.

Идея написать этот топик возникла, когда я на храбре задал 2 вопроса:

  • Вопрос о перехвате предупреждений и вывод ошибок в указанное место шаблона
  • Вопрос о перехвате критических ошибок, заставляющие выполнение скрипт только остановиться
По моей карме и добавление в избранное я понял, что они оказались интересные для PHP хабрасообщества. По этой причине я решил оформить решения этих вопросов в виде статьи, да бы людям и поисковикам было проще и комплексно находить нужную информацию.

Если заинтересовались, то подробности под катом…

Причины использования

Пользователю/поисковику, требуется внятно ответить, что на сервере проблемы. Без использования определенного фен-шуя, этого добиться достаточно трудно, а порой невозможно. Тут я проливаю свет на все это, ну и себе заметочку оставляю, так как еще неделю назад я не знал за что взяться, и, наверное, многие новички тоже будут обескуражены.

Описания функций

Данный функционал доступен в PHP для того, что бы обрабатывать ошибки и контролировать вывод. Вот описание их вкусностей и недостатков. Документацию я приводить не буду, я только сошлюсь её страницы и опишу свое мнение. Все что будет приведено это только малая доля, ссылки на соответствующие разделы документации я приведу в конце статьи. Итак встречаем:

- Контроль некритических ошибок: замечания, предупреждения, пользовательские ошибки. В общем все то, что не завершает интерпретацию аварийно.
set_error_handler - Задает определенный пользователем обработчик ошибок.
Нужен для того, что бы писать в лог все такие ошибки. Если её не задать, то в лог это не пишется, а мне вот всегда хочется узнать при каких боевых ситуациях могут вызываться замечания и предупреждения. То есть позволяет автоматически тестировать продукт пользователем и он даже не будет замечать этого.
Если функция не задана, то PHP лишь пытается вывести данные на экран, а если ему и это не дают, то вообще никаких признаков жизни от этих типов ошибок не возникает.

- Контроль, исключений: является ошибкой типа E_ERROR.
set_exception_handler - Задает пользовательский обработчик исключений
Ну не знаю, зачем это вообще было придумано, когда есть то, что описано ниже и просто обработка ошибки типа Exception. Так что сообщаю что оно просто существует. Она перехватывает критическую ошибку «исключение» и позволяет что-то с ней делать. В любом случае скрипт завершается. Её работы по умолчанию лично для меня достаточно (пишет в логи, пытается вывести на экран). Я бы её вообще не переопределял, а то придется в логи о случившимся исключении самому писать.

- Функции контроля вывода: Тут я опишу 3 функции, которые следует знать по разным причинам. Например, для проблем производительности или для проблем вывода заголовков. В нашем случае требуется выводить заголовки ошибок.

Условия
Есть файл с кодом, который запускается первым или перед кодом в котоом может появиться ошибка и этот файл и все файлы до него 100% отлаженные с невозможностью появления ошибки. Вот такое вот условие, что бы было проще - без ошибок до того пока не пройдут все регистрации вышеизложенных функций. В данном файле описаны данные методики контроля ошибок в комплексе. Контролируется буфер, если ошибка, то сбросить буфер и вывести ошибку.
Код с комментариями
От себя добавлю, что код не тестировал, так как это упрощенная схема того, что у меня в коде, замечания принимаются
Государственный Эрмитаж в данный момент занимает семь строений: Зимний дворец, Большой Эрмитаж (или Старый Эрмитаж), Малый Эрмитаж, Новый Эрмитаж, Эрмитажный театр, Меншиковский дворец и бывшее здание Главного штаба. Два последних архитектурных ансамбля вошли в состав Государственного Эрмитажа сравнительно недавно.

Эрмитаж - один из самых больших и известных художественных музеев в мире. Каждый посетивший Санкт-Петербург турист начинает свое знакомство с городом прогулки по набережной вдоль пять зданий Эрмитажа. Каждый житель Петербурга просто уверен, что если ты не посетил Эрмитаж, значит не проникся духом Петербурга. В настоящее время Эрмитаж является еще и культурно-образовательным учреждением. Тут читают лекции на самые разнообразные темы преподаватели различных ВУЗов. В школьную программу учащихся Санкт-Петербурга входит посещение Эрмитажа. Эрмитаж тесно сотрудничает со школьным и молодежным центром.

Главным зданием Эрмитажа считают Зимний дворец. Дворец был построен в середине 18 века по приказу Елизаветы Петровны. На его месте стоял другой Зимний дворец, показавшийся императрице недостаточно пышным и просторным для царских апартаментов. Новое здание, достойное называться императорским дворцом, строилось под руководством архитектора Бартоломео Франческо Растрелли, но ни Елизавете, ни вступившему после нее на престол Петру III, пожить в нем не удалось. В законченный Зимний дворец, который позже стал символом Эрмитажа, торжественно въехала после коронации в Москве Екатерина II. Впрочем, ей новое место жительства не понравилось: сначала она распорядилась здесь кое-что перестроить, а потом и вовсе решила возвести рядом с Зимним дворцом другое здание, которое было названо впоследствии - Малый Эрмитаж. Над его проектом работали архитекторы Юрий Матвеевич Фельтен и Валлен-Деламот Жан Батист Мишель. Когда здание Малого Эрмитажа было завершено, Екатерина стала проводить в нем значительную часть своего времени.

Малый Эрмитаж стал для Екатерины II местом где она смогла разместить свою коллекцию живописи, которая легла в основу будущего музея. Коллекция постоянно пополнялась новыми картинами, скульптурами, изделиями из поделочных камней и другими предметами искусства. И в конце концов в Малом Эрмитаже не осталось свободного места для их размещения. В 1771-1787 годах к нему было пристроено еще одно здание - Большой Эрмитаж, которое специально предназначалось для хранения живописных и скульптурных произведений. Большой Эрмитаж, построенный под руководством архитектора Ю. М. Фельтена, отличался от Зимнего дворца и Малого Эрмитажа очень строгим, без каких-либо украшений, внешним обликом.

В моду вошло участие в театрализованных представлениях. Примерно в те же годы, что и Большой Эрмитаж, на Дворцовой площади был возведен Эрмитажный театр, созданный по проекту Джакомо Кваренги. Императрица Екатерина II приглашала на спектакли так много гостей, что Малый Эрмитаж не вмещал всех приглашенных. Новый Эрмитаж стал необходим когда в Малом и Большом Эрмитаже закончилось свободное место. Разработка проекта Нового Эрмитажа была поручена немецкому архитектору Лео фон Кленце, а осуществляли его российские зодчие Василий Петрович Стасов и Николай Ефимович Ефимов. Удивительно красивый Эрмитажный театр, в настоящее время является местом проведения массовых мероприятий городского уровня.
(Просмотров папки: 78464)

Найдено: 188 фотографий 16 страницах. Показано: с 13 по 24.



Эрмитаж
Смотрели:2939. Комменты:0


Эрмитаж
Смотрели:2659. Комменты:0


Эрмитаж
Смотрели:2027. Комменты:0


Эрмитаж
Смотрели:2227. Комменты:0


Эрмитаж
Смотрели:2542. Комменты:0


Эрмитаж
Смотрели:2531. Комменты:0


Эрмитаж
Смотрели:3068. Комменты:0


Эрмитаж
Смотрели:2737. Комменты:0


Эрмитаж
Смотрели:2945. Комменты:0

Возвращает массив объектов содержащих информацию о категориях.

Параметры передаваемые этой функции очень похожи на параметры передаваемые функции wp_list_categories() и могут быть переданы как в виде массива, так и в виде строки запроса: type=post&order=DESC .

✈ 1 раз = 0.005625с = очень медленно | 50000 раз = 11.98с = медленно | PHP 7.1.11, WP 4.9.5

Использование

$categories = get_categories($args);

Шаблон использования

$categories = get_categories(array("taxonomy" => "category", "type" => "post", "child_of" => 0, "parent" => "", "orderby" => "name", "order" => "ASC", "hide_empty" => 1, "hierarchical" => 1, "exclude" => "", "include" => "", "number" => 0, "pad_counts" => false, // полный список параметров смотрите в описании функции http://wp-kama.ru/function/get_terms)); if($categories){ foreach($categories as $cat){ // Данные в объекте $cat // $cat->term_id // $cat->name (Рубрика 1) // $cat->slug (rubrika-1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->taxonomy (category) // $cat->description (Текст описания) // $cat->parent (0) // $cat->count (14) // $cat->object_id (2743) // $cat->cat_ID (4) // $cat->category_count (14) // $cat->category_description (Текст описания) // $cat->cat_name (Рубрика 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) } } taxonomy(строка) Название таксономии, которую нужно обрабатывать. Добавлено с версии 3.0.
По умолчанию: "category" type(строка)
  • post - категории для постов (по умолчанию);
  • link - разделы ссылок.
    По умолчанию: "post"
child_of(строка) Получить дочерние категории (включая все уровни вложенности), указанной категории. В параметре указывается ID родительской категории (категория, вложенные категории которой нужно показать). parent(число) Получает категории родительская категория которых равна указанному в параметре ID. Отличие от child_of в том, что будет показан один уровень вложенности.
По умолчанию: "" orderby(строка)

Сортировка полученных данных по определенным критериям. Например, по количеству постов в каждой категории или по названию категорий. Доступны следующие критерии:

  • ID - сортировка по ID;
  • name - сортировка по названию (по умолчанию);
  • slug - сортировка по алт. имени (slug);
  • count - по количеству записей в категории;
  • term_group - по группе.

По умолчанию: "name"

Order(строка)

Направление сортировки, указанной в параметре "orderby":

  • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
  • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).

По умолчанию: "ASC"

Hide_empty(логический)

Получать или нет пустые категории (не имеющие записей):

  • 1 (true) - не получать пустые,
  • 0 (false) - получать пустые.

По умолчанию: true

Hierarchical(логический) Если параметр установлен в true , то в результат будут включены пустые дочерние категории, дочерние категории которых имеют записи (непустые).
По умолчанию: true exclude(строка/массив) Исключить какие-либо категории из списка. Нужно указывать ID категорий через запятую или в массиве. Если этот параметр указан, параметр child_of будет отменен.
По умолчанию: "" include(строка/массив) Вывести списком только указанные категории. Указывать нужно ID категорий через запятую или в массиве.
По умолчанию: "" number(число) Лимит. Число категорий, которые будут получены. По умолчанию без ограничений - будут получены все категории. pad_counts(логический) Если передать true, то число которое показывает количество записей в родительских категориях будет суммой своих записей и записей из дочерних категорий.
По умолчанию: false

Примеры

#1 Выпадающий список

Для того, чтобы создать выпадающий список из категорий мы можем воспользоваться другой специальной для этой цели, функцией wp_dropdown_categories() :

Wp_dropdown_categories(array("hide_empty" => 0, "name" => "category_parent", "orderby" => "name", "selected" => $category->parent, "hierarchical" => true, "show_option_none" => __("None")));

однако с таким подходом мы лишимся определенной гибкости в настройке списка, так как мы получи уже полностью сформированный список.

Поэтому, в некоторых случаях будет логичнее создать выпадающий список с помощью функции get_categories() . Вот пример (предполагается что нам нужно вывести подкатегории (дочерние) категории 10):

#2 Список категорий и их описание

Этот пример покажет нам как можно вывести списком ссылки на категории, где сразу после каждой ссылки будет идти описание категории (указывается при создании/редактировании категории):

"name", "order" => "ASC")); foreach($categories as $category){ echo "

Category: term_id) . "" title="" . sprintf(__("View all posts in %s"), $category->name) . "" " . ">" . $category->name."

"; echo "

Description:". $category->description . "

"; echo "

Post Count: ". $category->count . "

"; } ?>

Код get categories : wp-includes/category.php WP 5.2.2

"category"); $args = wp_parse_args($args, $defaults); $taxonomy = $args["taxonomy"]; /** * Filters the taxonomy used to retrieve terms when calling get_categories(). * * @since 2.7.0 * * @param string $taxonomy Taxonomy to retrieve terms from. * @param array $args An array of arguments. See get_terms(). */ $taxonomy = apply_filters("get_categories_taxonomy", $taxonomy, $args); // Back compat if (isset($args["type"]) && "link" == $args["type"]) { _deprecated_argument(__FUNCTION__, "3.0.0", /* translators: 1: "type => link", 2: "taxonomy => link_category" */ sprintf(__("%1$s is deprecated. Use %2$s instead."), "type => link", "taxonomy => link_category")); $taxonomy = $args["taxonomy"] = "link_category"; } $categories = get_terms($taxonomy, $args); if (is_wp_error($categories)) { $categories = array(); } else { $categories = (array) $categories; foreach (array_keys($categories) as $k) { _make_cat_compat($categories[ $k ]); } } return $categories; }

Приветствую всех читателей блога WordPress Inside в 2011 году, поздравляю с наступившими и наступающими праздниками, желаю много здоровья, счастья и радости на следующие 360 дней. Как и обещал в своей статье про планы на будущий 2011 год занимаюсь по чуть-чуть улучшением всех своих основных блогов — обновляю системы, ставлю последние версии плагинов и копаюсь в шаблонах ради оптимизации и исправления ошибок. Работал это крайне сложная, я бы даже сказал очень кропотливая — находишь одну неточность, решаешься ее исправить и перед тобой 5 отдельных проектов, для каждого из которых нужно внести правки. Ну, раз я уже запланировал все это сделать, назад дороги нет, заодно в процессе получаю дополнительный опыт и уже нашел штук 5-6 тем для новых постов в блог:) Сегодня поговорим о категориях и функциях для их отображения.

В одной из прошлых статей блога я публиковал хак который помогает . Данное решение использовалось для функции вывода списка категорий в сайдбаре с помощью функции wp_list_categories. На выходе вы получали записи вроде этой:

Безопасность

Если уж для seo атрибут title имеет хоть какое-то значение, то куда полезнее там было бы разместить просто название категории, а не весь этот ненужных текст. Собственно, указанная выше ссылка на хак помогала решить эту проблему. Но вот ни задача, все это было справедливо (работало) для , которая позволяла предварительно обработать полученный список не выводя его сразу же. Но что делать с другими функциями для вывода категорий? — вот в чем вопрос.

Например, я сегодня совершенно случайно обнаружил, что куча ненужного текста в атрибут title ссылки пишется и при отображении списка категорий для конкретного поста.

Вся проблема заключалась в том, что здесь используется функция the_category , для которой, к сожалению, нельзя задать параметр, чтобы результат ее вызова не отображался сразу. Зато в вордпресс есть еще одна функция get_the_category, которая возвращается массив объектов категорий для конкретного поста.

Функция get_the_category

Синтаксис функции get_the_category достаточно прост:

cat_name; ?>

Программисты знают, что нулевой параметр массива выводит первый элемент, собственно это и объясняет принцип работы данного кода.

ID ) ; var_dump ($categories ) ; ?>

ID); var_dump($categories); ?>

Для этого в качестве параметра функции нужно передавать id поста, что и происходит в коде.

Кстати, данную функцию я использую в некоторых сайтах, чтобы выводить название категории поста, но без активной ссылки — так просто дополнительный полезный текст на странице. В таком случае можно применить код:

cat_name . " " ; } ?>

cat_name . " "; } ?>

Ну, и напоследок, немного поразмыслив получился хак для вывода списка категории для поста без использования функции the_category, которую мы успешно заменяем на get_the_category. Если вы хотите добавить код непосредственно в то место шаблона, где выводятся категории, например, файл archive.php, то пишем что-то вроде:

Можно, в принципе разместить код для отображения категорий в файле функций, а потом в файлах шаблона поменять the_category на новую функцию, например, под названием my_thecat(). Конечно, не забудьте предварительно перед заменой добавить соответствующий код в файл функций functions.php:

function my_thecat() { global $post ; foreach ((get_the_category($post -> ID ) ) as $category ) { echo " cat_ID ) . "" title="" . $category -> cat_name . "">" . $category -> cat_name . "; " ; } }

function my_thecat() { global $post; foreach((get_the_category($post->ID)) as $category) { echo "cat_ID)."" title="".$category->cat_name."">".$category->cat_name."; "; } }

Потестировал, все работает. Остается лишь один вопрос — насколько это все полезно и крайне необходимо. Если у вас один блог с постоянным дизайном, который вы хотите сделать самым лучшим, то можно потратить пару минут и внести соответствующие изменения. В случае если у вас таких блогов много, думаю, особой seo выгоды манипуляция с title не принесет в плане, проще купить ссылок в Rotapost на все эти проекты — кстати эксперимент по подъему тИЦ в системе успешно и позитивно завершен, скоро будет отчет об этом.

Вывод категорий кастомных записей

В комментариях подсказывают, что примеры, указанные выше, не работают для кастомных (пользовательских) типов записей. Я с этой задачей не сталкивался, поэтому могу вам лишь посоветовать погуглить решение в англоязычных блогах по ключу wordpress custom post type show category или же воспользоваться подсказкой пользователя Stinker (из комментариев). В месте вывода категорий нужно просто вставить код:

Где categoria_video — это таксономия пользовательской записи (она же кастомная). А теперь более подробно от куда и что. Например у нас есть:

// Тип записи Видео if ( ! function_exists ( "video_cp" ) ) { function video_cp() { $labels = array ( "name" => _x( "Видео" , "Post Type General Name" , "video" ) , "singular_name" => _x( "Видео" , "Post Type Singular Name" , "video" ) , "menu_name" => __( "Видео" , "video" ) , "parent_item_colon" => __( "Родительский:" , "video" ) , "all_items" => __( "Все видеоматериалы" , "video" ) , "view_item" => __( "Просмотреть" , "video" ) , "add_new_item" => __( "Добавить новое видео" , "video" ) , "add_new" => __( "Добавить видео" , "video" ) , "edit_item" => __( "Редактировать видео" , "video" ) , "update_item" => __( "Обновить видео" , "video" ) , "search_items" => __( "Найти видео" , "video" ) , "not_found" => __( "Не найдено" , "video" ) , "not_found_in_trash" => __( "Не найдено в корзине" , "video" ) , ) ; $args = array ( "labels" => $labels , "supports" => array ( "title" , "editor" , "excerpt" , ) , "taxonomies" => array ( "categoria_video" ) , // категория, которую мы создадим ниже (она же таксономия) "public" => true , "menu_position" => 5 , "menu_icon" => "dashicons-id-alt" , ) ; register_post_type( "video" , $args ) ; } add_action( "init" , "video_cp" , 0 ) ; // инициализируем } if ( ! function_exists ( "categoria_video" ) ) { // Категории для вакансий function categoria_video() { $labels = array ( "name" => _x( "Категории Видео" , "Taxonomy General Name" , "categoria_video" ) , "singular_name" => _x( "Категория Видео" , "Taxonomy Singular Name" , "categoria_video" ) , "menu_name" => __( "Категории" , "categoria_video" ) , "all_items" => __( "Категории" , "categoria_video" ) , "parent_item" => __( "Родительская категория Видео" , "categoria_video" ) , "parent_item_colon" => __( "Родительская категория Видео:" , "categoria_video" ) , "new_item_name" => __( "Новая категория" , "categoria_video" ) , "add_new_item" => __( "Добавить новую категорию" , "categoria_video" ) , "edit_item" => __( "Редактировать категорию" , "categoria_video" ) , "update_item" => __( "Обновить категорию" , "categoria_video" ) , "search_items" => __( "Найти" , "categoria_video" ) , "add_or_remove_items" => __( "Добавить или удалить категорию" , "categoria_video" ) , "choose_from_most_used" => __( "Поиск среди популярных" , "categoria_video" ) , "not_found" => __( "Не найдено" , "categoria_video" ) , ) ; $args = array ( "labels" => $labels , "hierarchical" => true , "public" => true , ) ; register_taxonomy( "categoria_video" , array ( "video" ) , $args ) ; } add_action( "init" , "categoria_video" , 0 ) ; // инициализируем }

// Тип записи Видео if (! function_exists("video_cp")) { function video_cp() { $labels = array("name" => _x("Видео", "Post Type General Name", "video"), "singular_name" => _x("Видео", "Post Type Singular Name", "video"), "menu_name" => __("Видео", "video"), "parent_item_colon" => __("Родительский:", "video"), "all_items" => __("Все видеоматериалы", "video"), "view_item" => __("Просмотреть", "video"), "add_new_item" => __("Добавить новое видео", "video"), "add_new" => __("Добавить видео", "video"), "edit_item" => __("Редактировать видео", "video"), "update_item" => __("Обновить видео", "video"), "search_items" => __("Найти видео", "video"), "not_found" => __("Не найдено", "video"), "not_found_in_trash" => __("Не найдено в корзине", "video"),); $args = array("labels" => $labels, "supports" => array("title", "editor", "excerpt",), "taxonomies" => array("categoria_video"), // категория, которую мы создадим ниже (она же таксономия) "public" => true, "menu_position" => 5, "menu_icon" => "dashicons-id-alt",); register_post_type("video", $args); } add_action("init", "video_cp", 0); // инициализируем } if (! function_exists("categoria_video")) { // Категории для вакансий function categoria_video() { $labels = array("name" => _x("Категории Видео", "Taxonomy General Name", "categoria_video"), "singular_name" => _x("Категория Видео", "Taxonomy Singular Name", "categoria_video"), "menu_name" => __("Категории", "categoria_video"), "all_items" => __("Категории", "categoria_video"), "parent_item" => __("Родительская категория Видео", "categoria_video"), "parent_item_colon" => __("Родительская категория Видео:", "categoria_video"), "new_item_name" => __("Новая категория", "categoria_video"), "add_new_item" => __("Добавить новую категорию", "categoria_video"), "edit_item" => __("Редактировать категорию", "categoria_video"), "update_item" => __("Обновить категорию", "categoria_video"), "search_items" => __("Найти", "categoria_video"), "add_or_remove_items" => __("Добавить или удалить категорию", "categoria_video"), "choose_from_most_used" => __("Поиск среди популярных", "categoria_video"), "not_found" => __("Не найдено", "categoria_video"),); $args = array("labels" => $labels, "hierarchical" => true, "public" => true,); register_taxonomy("categoria_video", array("video"), $args); } add_action("init", "categoria_video", 0); // инициализируем }

Спасибо пользователю Stinker за подсказку, возможно, вам она пригодится.

P.S. Постовой. В одном из блогов рунета была найдена замечательная подборка тем wordpress портфолио из 17-ти бесплатных качественных шаблонов.

Проверяет принадлежит ли текущий (или указанный) пост к указанной категории (можно указать несколько категорий). Условный тег.

Проверяется прямая принадлежность поста к категории, т.е. содержит ли указанная категория текущий/указанный пост. Если, например, пост принадлежит родительской категории или дочерней к указанной, то функция вернет false.

Чтобы проверить отношение поста к дереву категорий используйте самописную функцию post_is_in_descendant_category() (см. пример ниже).

in_category() можно использовать внутри Цикла WordPress или за пределами Цикла WordPress, но на отдельной странице поста (single.php). Или можно использовать где угодно, если указать какой именно пост нужно проверить.

✈ 1 раз = 0.003672с = очень медленно | 50000 раз = 1.00с = очень быстро | PHP 7.1.5, WP 4.8.1

Хуков нет.

Возвращает

true, если условие выполняется и false, если нет.

Использование

if(in_category($category, $post)){ // ... } $category(строка/массив/число) (обязательный)

ID, название или ярлык (slug) категории, которую нужно проверить принадлежит ли ей пост.

Можно указать несколько параметров в массиве вперемешку.
По умолчанию: нет

$post(число/объект) ID или объект поста. По умолчанию текущий пост определяется автоматически внутри Цикла WordPress или на странице поста.
По умолчанию: нет

Примеры

#1 Проверка текущего поста внутри Цикла WordPress.

in_category часто используется внутри Цикла, чтобы проверить относится ли пост к указанной категории, если "да", то сделать какие-либо действия:

If (in_category("pachyderms")) { // действия, если пост относится к категории "pachyderms" } elseif (in_category(array("Tropical Birds", "small-mammals"))) { // действия, если пост относится к одной из категорий "Tropical Birds", "small-mammals" } else { // если никакие из предыдущих условий не выполнены. }

П.С. Лучше указывать не названия, а ID категории для проверок

#2 Проверка текущего поста за пределами Цикла.

На странице поста (обычно это файл шаблона single.php) проверку можно выполнять за пределами Цикла:

If (in_category("fruit")) { include "single-fruit.php"; } elseif (in_category("vegetables")) { include "single-vegetables.php"; } else { // Ниже начинается Цикл WordPress if (have_posts()) : while (have_posts()) : the_post(); // ... }

#3 Проверка принадлежности поста к текущей или вложенной в текущую категории

Бывают случаи, когда нужно проверить относиться ли пост к дереву категорий. Например, мы указываем в проверке ID категории 60, а пост принадлежит категории 70, которая является дочерней к категории 60. Но in_category() вернет в данном случае false, а иногда нужно чтобы вернула true.

Для того, чтобы проверить принадлежность к дереву категорий, можно последовательно указать в массиве все названия категорий:

If(in_category(array("Малина", "Яблоки", "Бананы", "Груши", "Сливы"))) { // Действие если выполнено условие }

Такой подход проверки, совершенно не гибкий, потому что если мы добавим новую подкатегорию к категории "Фрукты", нам так же нужно будет добавить её и в массив, для проверки.

Чтобы избежать таких сложностей можно воспользоваться такой проверкой:

// Проверка принадлежности поста к категории "Фрукты" или любой вложенной в эту категорию категории. if (in_category(11) || post_is_in_descendant_category(11)) { // Здесь все "фрукты" }

Также, менее желательный, но вариант - указать названия:

Post_is_in_descendant_category(get_term_by("name", "fruit", "category"))

А вот сама функция post_is_in_descendant_category() :

Function post_is_in_descendant_category($cats, $_post = null){ foreach ((array) $cats as $cat) { // get_term_children() accepts integer ID only $descendants = get_term_children((int) $cat, "category"); if($descendants && in_category($descendants, $_post)) return true; } return false; }

#4 Древовидная проверка принадлежности к термину

Проверим входит ли пост в термин произвольной таксономии (будем проверять и дочерние термины к указанному):

If(has_term(11, "taxonomy", $post->ID) || post_is_in_descendant_term(11, "taxonomy", $post->ID)){ // Текущая запись в термине 11 или в его дочернем термине }

Функция post_is_in_descendant_term() :

Function post_is_in_descendant_term($term_ids, $taxonomy = "category", $post = null){ foreach((array) $term_ids as $term_id){ $descendants = get_term_children((int) $term_id, $taxonomy); if ($descendants && has_term($descendants, $taxonomy , $post)) return true; } return false; }