На работе для управления нашей Базой знаний раньше мы использовали 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

Руководство

Источник: WP.tutsplus.com

Вам понравился материал?

Добавить комментарий

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

9 комментариев

сначала новые
по рейтингу сначала новые по хронологии
Богдан

Кто на какой версии клепал ето счастье? в меня на 4.3.1 не получилось((

Богдан

Ничего не выходит, сделал все как в инструкции, а как дальше с ним работать?

А как css подправить, чтобы как на сате в примере красиво выезжало. А то киш-миш из рубрик и статей получается пока...=(

Извините, но правка стилей - это уже личный творческий процесс, тут мы не можем подсказать.

Полдня разбирался в коде, не уверен, что дело в css. Он список разделов "sections" в сайдбаре выводит, все ок, а вот список постов в каждой категории нет. Скажите, а вы описанные шаги сами выполняли или просто сделали перевод статьи Роберта Калина http://wp.tutsplus.com/tutorials/business/wordpress-as-a-knowledge-base/? Может есть еще ссылки на сайты которые также использовали этот метод организации базы знаний?

Данная публикация является авторским переводом статьи, указанной в источнике.

Аааа, тогда ясно! Спасибо за перевод. И в целом, за полезный сайт по вордпресс =)

qtranslate не дает вариант на другом языке в разделах, а для статий - есть.

Мой сайт на два языка. Как сделать так, чтоби переводились и разделы ( section)? Для статий - нет проблем :)