Статьи

Освоение API категорий WordPress

В предыдущей статье SitePoint я представил введение в API категорий WordPress благодаря функции wp_list_categories() . Как мы видели, эта функция полна различных опций, и поэтому неплохо использовать ее, если мы хотим отобразить список наших категорий.

WordPress

Однако он не может охватить все возможные случаи, и именно поэтому мы находим другие функции в API категорий. Эти функции позволяют нам получать необработанные данные: вместо HTML-списка наших категорий мы можем получить массивы, содержащие эти же категории.

В результате проще (и правильнее!) Отображать эти данные особым образом, что бы вы ни представляли в виде дерева DOM. Мы начнем здесь с функций, которые возвращают объекты, содержащие все данные, относящиеся к нашим категориям. Затем нас заинтересуют функции, которые возвращают только конкретную информацию.

Получение некоторых категорий как объектов

Как и ссылки в Менеджере ссылок , мы можем извлекать наши категории как объекты, которые содержат все их свойства. Мы начнем с описания этих объектов благодаря функции, которая возвращает только одну категорию. Затем мы будем использовать наши новые знания, чтобы играть со всеми категориями, которые мы хотим!

Извлечение данной категории с ее идентификатором

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

 $cat = get_category(14); 

Затем $cat содержит искомый объект. Теперь мы опишем некоторые из его свойств, которые представляют для нас интерес.

ID категорий

Во-первых, идентификатор категории, которую мы хотели. Вы можете найти это значение в свойстве cat_ID .

 $id = $cat->cat_ID; 

Обратите внимание, что это значение здесь не очень полезно, так как мы уже знали идентификатор (мы передали его как параметр функции!). Но ниже мы увидим, что есть и другие способы получения категории: в этом случае может быть полезно знать, как получить идентификатор в объекте категории.

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

Получить ВСЕ данные!

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

 <h1><?php echo $cat->cat_name; ?></h1> <p><?php echo $cat->category_description; ?></p> 

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

Наконец, вы также можете увидеть, сколько сообщений содержится в этой категории благодаря свойству category_count . Обратите внимание, что этот счетчик не учитывает количество постов, которые мы можем найти в дочерних категориях.

Я соврал тебе

Название этой части — ложь. Фактически, объекты — не единственное доступное представление наших категорий. Вы также можете выбрать получение их в массивах благодаря второму аргументу, заданному для get_category() .

 // Get an object (default behavior) $cat = get_category(15, OBJECT); // Get an associative array $cat = get_category(15, ARRAY_A); // Get an numbered array $cat = get_category(15, ARRAY_N); 

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

Получение категории без ее идентификатора

Как мы уже говорили выше, ID не является единственным идентификатором категории, и порция категории также может использоваться для получения ее информации. Это может быть достигнуто с помощью функции get_category_by_slug() . Как вы можете догадаться, он принимает слаг в качестве параметра.

 $cat = get_category_by_slug('my-goldfish'); 

Мы не будем описывать возвращаемый объект, так как он такой же, как у нас с get_category() . Однако здесь у вас нет выбора: объект является единственным доступным типом, и вы не сможете получить массив с помощью этой функции. Наконец, обратите внимание, что get_category_by_slug() возвращает false если нет категории с указанным слагом.

Получение нескольких категорий

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

Получить все категории, которые вы хотите

Если вы прочитаете предыдущую часть, вы не будете дезориентированы возвращаемыми значениями get_categories() , так как он возвращает массив, в котором перечислены все требуемые категории, каждая из которых представлена ​​объектом, который в точности соответствует описанному выше.

Без аргументов эта функция возвращает все категории, которые вы создали. Если вы напишите строку ниже:

 $cats = get_categories(); 

затем $cats — это массив, содержащий все ваши категории в алфавитном порядке. Например, если я хочу получить имя второй категории, все, что мне нужно написать, это $cats[1]->cat_name (дополнительную информацию см. В предыдущей части об объекте категории).

Если вы сделали print_r() для переменной $cats , возможно, вы заметили что-то странное: в некоторых случаях в этом массиве есть «дыры». Например, мы можем напрямую перейти от индекса 0 к 4 , не видя 1 , 2 и 3 . Что произошло? Что это за странный способ считать?

Ну, на самом деле, это не странно: если вы действительно заметили эту «ошибку», возможно, вы также заметили, что отсутствующие категории — это именно те, которые являются пустыми: по умолчанию WordPress скрывает пустые категории. Ура, это не ошибка!

Мы можем изменить это поведение, наряду с некоторыми другими вещами, которые мы можем настроить благодаря аргументу, который мы можем отправить get_categories() . Как обычно, этот уникальный аргумент представляет собой массив, содержащий все нужные нам параметры.

Я рекомендую вам прочитать нашу предыдущую статью об API категорий , где мы описали wp_list_categories() . Фактически, (почти) все доступные опции для get_categories() — это опции, которые мы видели для wp_list_categories() , поэтому мы не будем описывать, что они делают дважды.

Что касается wp_list_categories() вы можете выбрать wp_list_categories() порядок с помощью orderby и order , ограничить количество возвращаемых категорий number или снова выбрать получить пустые категории с помощью hide_empty . У вас также есть доступ к опциям include и exclude чтобы получить правильные категории.

Возможно, hierarchical опция заслуживает объяснения: установив по умолчанию значение 1 , вы можете отменить его эффекты, установив значение 0 . При hide_empty 1 эта опция может возвращать некоторые пустые категории, даже если для hide_empty задано значение 1 . Однако вы увидите только пустые категории с дочерними категориями, которые не являются пустыми (таким образом, вы можете построить все дерево).

Опция pad_counts все еще здесь, как и child_of . Но здесь есть новая опция: parent похожий на child_of , с той разницей, что parent возвращает только прямых потомков выбранной категории: если у этих потомков есть дочерние категории, они не будут возвращены.

Получить категории, связанные с сообщением

Вы можете связать более одной категории с сообщением. Когда вы используете get_the_category() , вы можете получить список массивов всех категорий, которые вы установили для данного сообщения.

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

 // Get the categories of the post with ID 139 $cats = get_the_category(139); 

Получение некоторых конкретных данных

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

Получение идентификатора категории

Всегда проще запомнить название категории вместо ее идентификатора (который после установки не совпадает). Хорошей новостью является то, что вы можете получить идентификатор категории, если вы знаете ее название. Для этого мы можем использовать get_cat_ID() : вы передаете ей имя категории, а она возвращает ее ID. Если категория не найдена, возвращается значение 0 .

 // Yes, I love this category $cat_id = get_cat_ID('My goldfish'); 

Если у вас уже есть идентификатор категории, но вы не знаете идентификаторов ее родителей, вы также можете использовать get_ancestors() . Возвращает массив, содержащий идентификаторы всех предков, от ближайшего к дальнему.

Пример будет понятнее. Предположим, что у нас есть « Моя золотая рыбка » (с ID 15) в качестве детской категории « Моя жизнь » (с ID 14). Теперь мы добавляем ребенка к « Моей золотой рыбке »: « Корм моей золотой рыбки » (с ID 16). Тогда следующая строка:

 $cats_id = get_ancestors(16, 'category'); 

возвращает это:

 Array ( [0] => 15 [1] => 14 ) 

Обратите внимание, что мы должны указать get_ancestors() что мы говорим о категориях. На самом деле, эта функция более общая и может включать больше полей, чем категорий (но это не то, что нас интересует).

Получение некоторых строк

Мы можем извлечь идентификатор категории из ее имени, но мы можем сделать и обратное: вот что get_cat_name() .

 // Returns the name of the category with ID 15 $cat_name = get_cat_name(15); 

То же самое можно сделать с описанием категории, благодаря category_description() .

 // Returns the description of the category with ID 15 $cat_desc = category_description(15); 

Вы заметили, что с начала этой статьи мы не говорили об URL категории? Это интересная тема, так как ее форма может измениться после установки (перезапись URL? Перезапись URL?). Если честно, я не понимаю, почему эта информация не содержится в объекте, который мы описали выше. Тем не менее, мы можем получить URL-адрес категории благодаря get_category_link() .

 // I want to display a link to my favorite category $cat_id = get_cat_ID('My goldfish'); $cat_link = get_category_link($cat_id); 

Тогда все, что мне нужно сделать, это использовать $cat_link которая содержит правильный URL.

 <a href="<?php echo $cat_link; ?>">My goldfish</a> 

Короткие списки

Если вы разрабатывали темы WordPress, скорее всего, вы уже знаете the_category() . Эта функция позволяет отображать список категорий, используемых текущим сообщением (или любым другим). Этот список представляет собой строку со всеми ссылками, расположенными одна за другой, разделенными нужной вам строкой (указанной в первом параметре).

 // Get a comma-separated list of the used categories the_category(', '); 

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

Он позволяет контролировать способ отображения отношений между родителями и детьми и полезен только в том случае, если соответствующий пост находится в категории, в которой есть родительская категория. По умолчанию для этого параметра задана пустая строка, и отображается только дочерняя категория. Если вы измените его на single , то имя родительской категории также будет отображаться в той же ссылке его дочернего элемента. Наконец, вы также можете выбрать multiple : с этим значением родительская и дочерняя категории отображаются в двух отдельных ссылках.

Если вы предпочитаете сохранить результат в переменной перед его get_the_category_list() , вы можете использовать вместо него get_the_category_list() (его можно использовать так же, как the_category() ).

Вывод

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

Фактически, я решил описать некоторые из наиболее часто используемых функций, но этот API содержит большое количество других. Например, есть функция, чтобы проверить, находится ли сообщение в категории. Также есть функция, которая отображает список, состоящий из флажков для каждой категории (полезно для панелей администрирования).

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