На работе для управления нашей Базой знаний раньше мы использовали KBPublisher. Это решение стоило нам денег, было запутано в стилизации, код был зашифрован с помощью ion cube и тому подобное, короче говоря, было трудоемко и затратно. WordPress может делать то же самое, но лучше и удобней.
Это руководство покажет, как использовать собственную таксономию для разделов базы знаний и собственные посты для статей базы знаний.

| Демо |
Шаг 1. Администрирование
Разделами и статьями базы знаний нужно управлять. WordPress делает такое управление простым с помощью собственной таксономии и собственных типов постов.
Просто зарегистрируйте новую таксономию и тип поста. Добавьте следующее в файл functions.php вашей темы.
Чтобы узнать больше об этом функционале, прочитайте другие статьи о собственных типах постов и собственной таксономии.
function register_kb() {
register_post_type( 'knowledgebase',
array(
'labels' => array(
'name' => 'Knowledge Base',
'menu_name' => 'Knowledge Base',
'singular_name' => 'Article',
'all_items' => 'All Articles'
),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'menu_position ' => 20,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'post-formats', 'revisions' ),
'hierarchical' => false,
'taxonomies' => array( 'section' ),
'has_archive' => true,
'rewrite' => array( 'slug' => 'knowledgebase', 'hierarchical' => true, 'with_front' => false )
)
);
register_taxonomy( 'section', array( 'knowledgebase' ),
array(
'labels' => array(
'name' => 'Sections',
'menu_name' => 'Sections',
'singular_name' => 'Section',
'all_items' => 'All Sections'
),
'public' => true,
'hierarchical' => true,
'show_ui' => true,
'rewrite' => array( 'slug' => 'knowledgebase-section', 'hierarchical' => true, 'with_front' => false ),
)
);
}
add_action( 'init', 'register_kb' );
function kb_rewrite_rules( $wp_rewrite ) {
$new_rules = array( 'knowledgebase/(.*)/(.*)' => 'index.php?post_type=knowledgebase&section=' . $wp_rewrite->preg_index( 1 ) . '&knowledgebase=' . $wp_rewrite->preg_index( 2 ) );
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'kb_rewrite_rules' );
Он запустится после того, как WordPress загрузится, но до того, как будут отправлены какие-либо заголовки, регистрируя тип поста и таксономию. Также он добавит правила перезаписи для постоянных ссылок таксономии и типа поста.
- register_post_type регистрирует собственный тип поста, который будет использоваться для статей базы знаний.
- register_taxonomy регистрирует собственную таксономию, которая используется для разделов базы знаний.
Статьи не будут в порядке иерархии, но разделы будут, так что это дает возможность создать древовидную структуру.
Также было бы хорошо показать разделы, к которым принадлежит статья.
function kb_columns( $defaults ) {
$defaults['section'] = 'Sections';
return $defaults;
}
add_filter( 'manage_knowledgebase_posts_columns', 'kb_columns' );
function kb_custom_column( $column_name, $post_id ) {
$taxonomy = $column_name;
$post_type = get_post_type( $post_id );
$terms = get_the_terms( $post_id, $taxonomy );
if ( !empty( $terms ) ) {
foreach ( $terms as $term ) {
$post_terms[] = "<a href='edit.php?post_type={$post_type}&{$taxonomy}={$term->slug}'> " . esc_html(sanitize_term_field('name', $term->name, $term->term_id, $taxonomy, 'edit')) . '</a>';
}
echo join( ', ', $post_terms );
}
else echo '<i>No terms.</i>';
}
add_action( 'manage_knowledgebase_posts_custom_column', 'kb_custom_column', 10, 2 );

Теперь добавьте какие-то разделы и статьи, чтобы было что показывать.
Шаг 2. Отображение разделов
Добавьте следующий код в файл functions.php вашей темы.
function kb_sections( $sections = array(), $active_section = null ) {
$taxonomy = 'section';
$link_class = '';
if ( empty( $sections ) ) {
$link_class = 'root';
$sections = get_terms( $taxonomy, array( 'parent' => 0, 'hide_empty' => 0 ) );
$active_section = kb_active_section();
echo '<ul id="kb-sections" class="unstyled">';
}
if ( empty( $active_section ) ) {
$active_section = '';
}
foreach ( $sections as $section ) {
$toggle = '';
$section_children = get_terms( $taxonomy, array( 'parent' => $section->term_id, 'hide_empty' => 0 ) );
if ( !empty( $section_children ) && $link_class != 'root' ) {
$toggle = '<i class="toggle"></i>';
}
echo '<li class="' . ( $section->term_id == $active_section ? 'active' : '' ) . '">';
echo '<a href="' . get_term_link( $section, $taxonomy ) . '" class="' . $link_class . '" rel="' . $section->slug . '">' . $toggle . $section->name . '</a>';
if ( !empty( $section_children ) ) {
echo '<ul id="' . $section->slug . '" class="children">';
kb_sections( $section_children, $active_section );
}
echo "</li>";
}
echo "</ul>";
}
function kb_active_section() {
$taxonomy = 'section';
$current_section = '';
if ( is_single() ) {
$sections = explode( '/', get_query_var( $taxonomy ) );
$section_slug = end( $sections );
if ( $section_slug != '' ) {
$term = get_term_by( 'slug', $section_slug, $taxonomy );
} else {
$terms = wp_get_post_terms( get_the_ID(), $taxonomy );
$term = $terms[0];
}
$current_section = $term->term_id;
} else {
$term = get_term_by( 'slug', get_query_var( $taxonomy ), get_query_var( 'taxonomy' ) );
$current_section = $term->term_id;
}
return $current_section;
}
В папке темы создайте файл под названием sidebar-sections.php, где будет вызываться функция kb_sections, которая выдает неупорядоченный список разделов.
<?php kb_sections(); ?>
В таком виде разделы базы знаний можно показать где угодно путем включения их в сайдбар.
<?php get_sidebar( 'sections' ); ?>
Шаг 3. Отображение статей
Добавьте следующий код в файл functions.php вашей темы.
function kb_article_permalink( $article_id, $section_id ) {
$taxonomy = 'section';
$article = get_post( $article_id );
$section = get_term( $section_id, $taxonomy );
$section_ancestors = get_ancestors( $section->term_id, $taxonomy );
krsort( $section_ancestors );
$permalink = '<a href="/knowledgebase/';
foreach ($section_ancestors as $ancestor):
$section_ancestor = get_term( $ancestor, $taxonomy );
$permalink.= $section_ancestor->slug . '/';
endforeach;
$permalink.= $section->slug . '/' . $article->post_name . '/" >' . $article->post_title . '</a>';
return $permalink;
}
Обратите внимание: этот метод обязателен, так как статья может быть привязана к нескольким разделам. Это сгенерирует иерархическую структуру постоянных ссылок.
Например:
/knowledgebase/section-slug/sub-section-slug/another-sub-section-slug/article-slug
В папке темы затем создайте следующие файлы: archive-knowledgebase.php, single-knowledgebase.php, content-knowledgebase.php, taxonomy-section.php.
В archive-knowledgebase.php для отображения разделов и недавно добавленных статей добавьте следующее:
<?php get_header(); get_sidebar( 'sections' ); while ( have_posts() ) : the_post(); $terms = wp_get_post_terms( $post->ID, 'section' ); $term = $terms[0]; echo kb_article_permalink( $post->ID, $term->term_id ); endwhile; get_footer(); ?>
В single-knowledgebase.php добавьте следующий код:
<?php get_header(); while ( have_posts() ) : the_post(); get_template_part( 'content', 'knowledgebase' ); endwhile; get_footer(); ?>
В content-knowledgebase.php добавьте следующее:
<?php get_sidebar( 'sections' ); the_title(); the_content(); ?>
В taxonomy-section.php добавьте следующий код для отображения списка статей из раздела.
<?php global $wp_query; $args = array_merge( $wp_query->query, array( 'posts_per_page' => 100 ) ); query_posts( $args ); $term = get_term_by( 'slug', get_query_var( 'term' ), 'section' ); get_header(); get_sidebar( 'sections' ); while ( have_posts() ) : the_post(); echo kb_article_permalink( $post->ID, $term->term_id ); endwhile; get_footer(); ?>
Структурировать и стилизовать это можно как угодно.
Пример
В качестве примера, как это работает в жизни и как это можно использовать, предлагаем посмотреть на syneto.net
Руководство
- add_action
- register_post_type
- register_taxonomy
- add_filter





















Комментарии к записи: 9
Мой сайт на два языка. Как сделать так, чтоби переводились и разделы ( section)? Для статий — нет проблем :)
qtranslate не дает вариант на другом языке в разделах, а для статий — есть.
А как css подправить, чтобы как на сате в примере красиво выезжало. А то киш-миш из рубрик и статей получается пока…=(
Извините, но правка стилей — это уже личный творческий процесс, тут мы не можем подсказать.
Полдня разбирался в коде, не уверен, что дело в css. Он список разделов «sections» в сайдбаре выводит, все ок, а вот список постов в каждой категории нет. Скажите, а вы описанные шаги сами выполняли или просто сделали перевод статьи Роберта Калина http://wp.tutsplus.com/tutorials/business/wordpress-as-a-knowledge-base/? Может есть еще ссылки на сайты которые также использовали этот метод организации базы знаний?
Данная публикация является авторским переводом статьи, указанной в источнике.
Аааа, тогда ясно! Спасибо за перевод. И в целом, за полезный сайт по вордпресс =)
Ничего не выходит, сделал все как в инструкции, а как дальше с ним работать?
Кто на какой версии клепал ето счастье? в меня на 4.3.1 не получилось((