Рубрики с Awesome Icons на Wordpress

Использование Awesome Icons в качестве значков списка рубрик в Wordpress.

Дисклеймер

Не претендую на абсолютную правильность подхода, однако это единственный способ, которым я смог добиться внедрения awesome icons в виджет рубрик.

 

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

Несомненно, существует огромное множество плагинов, для прикрепления к рубрикам картинок, однако, я не хочу кучу картинок, я хочу иконочный шрифт. Путем гугления, набрел на этот тред. Хорошо, как засунуть в поток генерации иконки разобрались, но проблема в том, что я хотел, чтобы у разных рубрик были разные иконки, либо их не было, поэтому и отправился на поиски инструментов, подобных Drupal Field UI, чтобы создать хранимое поле, и как-то присобачить его к рубрикам.

 

Fields Framework

Поиски привели меня к плагину  Fields Framework ( Github)

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

 

Первым делом, лезем в Builder и создаем новую секцию для элементов таксономии ( Builder -> Sections -> Taxonomy -> Create New). Тут нужно придумать идентификатор для секции (я назвал RubricsWithFAIconsSection), этот UID затем понадобится для связывания. В поле Taxonomies выбираем Рубрики.

 

После того, как секция сохранена, создаем новое поле ( Fields -> Text -> Create New), тут тоже нужно указать UID (я назвал RubricsWithAIconsField).

Все, основные элементы готовы, теперь снова лезем в Builder. В первом текстовом поле видим сгенерированный плагином PHP код:

ff_create_section('RubricsWithAIconsSection', 'taxonomy', array(
        'taxonomies' => array('category'),
    )
);
ff_create_field('RubricsWithAIconsField', 'text', array(
        'label' => 'FA Icon',
    )
);

Этот код нужно будет вставить в хуке widgets_init (Файл /wp-content/themes/<Название темы>/functions.php).

 

Находим реализацию хука или пишем новую. Мой код:

function blogkenfin_widgets_init() {
    // проверка на установленный Fields Framework, чтобы не ронять сайт при отсутствии плагина
    if(defined('FF_INSTALLED')) {
        ff_create_section('RubricsWithAIconsSection', 'taxonomy', array(
                'taxonomies' => array('category'),
            )
        );
        ff_create_field('RubricsWithAIconsField', 'text', array(
                'label' => 'FA Icon',
            )
        );
        // добавляем поле в секцию
        ff_add_field_to_section('RubricsWithAIconsSection', 'RubricsWithAIconsField');
    }
}
add_action( 'widgets_init', 'blogkenfin_widgets_init' );

Теперь для проверки можно попробовать создать/отредактировать рубрику. Видим:

 

 

Наше текстовое поле появилось, отлично! Но чтобы иметь с этого какой-то толк, нужно это поле как-то отображать. Лично я для этого использовал еще два хука - get_terms для редактирования списка элементов и wp_list_categories в качестве дополнительного костыля.

 

Обработчик get_terms

Наш первый шаг состоит в определении функции-обработчика для хука get_terms:

add_filter('get_terms', 'blogkenfin_get_terms');
// добавляем значки font-awesome к заголовкам!
function blogkenfin_get_terms($links) {
    foreach($links as $link) {
        $field = ff_get_field_from_section('RubricsWithAIconsSection', 'RubricsWithAIconsField','options','taxonomy',$link->term_taxonomy_id);
        if($field != NULL) {
            $link->name = $field .' ' . $link->name;
        }
    }
    return $links;
}

 

Функция ff_get_field_from_section(<SECTION_UID>, <FIELD_UID>, <SOURCE>, <SOURCE_TYPE>, <OBJECT_ID>) возвращает значение поля. В документацииэта функция и ее параметры подробно описаны, поэтому я не буду заострять на этом внимание.

 

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

 

Однако, если оставить код как есть, мы наблюдаем следующее:

 

Обработчик wp_list_categories

В обработчик хука wp_list_categories попадает готовый html для вывода в виджете рубрикатора, поэтому для решения этой проблемы я прибегнул к такому костылю:

add_filter( 'wp_list_categories' , 'blogkenfin_list_categories' );
function blogkenfin_list_categories($html) {
    return html_entity_decode($html);
}

 

Вуаля, все работает как надо:

 

Два предыдущих фильтра, чтобы гарантировать нормальную работу, нужно также обернуть в условие:

// !is_admin() - использован чтобы не портить заголовки в таблице редактирования рубрик.
if(defined('FF_INSTALLED') && !is_admin()) {
    add_filter('get_terms', 'blogkenfin_get_terms');
    // ... code
}