Я - немного новичок Wordpress, и я погружаюсь голова сначала в плагин создания курса. Структура пойдет программа> курс> уровень> урок. Прямо сейчас мне настраивали уроки как пользовательский тип сообщения и уровни, курсы и программы являются taxonomies. В основном я мог использовать справку, создающую путь навигации, где Вы сначала выбираете программу, затем курс, затем уровень, затем урок. Я ломаю головы, и я отчасти застреваю. Как я сказал, что я довольно плохо знаком с Wordpress и php в этом отношении...
Действительно ли это - жизнеспособный способ пойти об этом при помощи пользовательских типов сообщения и taxonomies, и у кого-либо есть какие-либо предложения или ресурсы? Я не уверен, должен ли я пойти о создании пользовательского шаблонного файла темы для этого или, или просто использовать shortcode на странице для навигации.
Program
|
/ \
/ \
Course1 Course2
/\ /\
/ \ / \
Lv1 Lv2 Lv1 Lv2
/\ /\ /\ /\
Lessons Lessons Lessons
Ниже то, что я имею до сих пор (Извините, это довольно длинно). Это работает хорошо, я просто не вполне выяснил, как организовать его все же. Ниже я только что настроил пользовательский тип сообщения и taxonomies. Это об этом
<?php
/**
* Plugin Name: Course Manager
* Description: Creates Programs, Courses, Levels and Lessons
* Version: The Plugin's Version Number, e.g.: 0.1
*/
?>
<?php
function cm_lesson_cp(){
$labels = array(
'name' => _x( 'Lesson', 'post type general name' ),
'singular_name' => _x( 'Lesson', 'post type singular name' ),
'add_new' => _x( 'Add New', 'Lesson' ),
'add_new_item' => __( 'Add New Lesson' ),
'edit_item' => __( 'Edit Lesson' ),
'new_item' => __( 'New Lesson' ),
'all_items' => __( 'All Lessons' ),
'view_item' => __( 'View Lesson' ),
'search_items' => __( 'Search Lessons' ),
'not_found' => __( 'No Lessons found' ),
'not_found_in_trash' => __( 'No lessons found in the Trash' ),
'parent_item_colon' => '',
'menu_name' => 'Lessons'
);
$args = array(
'labels' => $labels,
'description' => 'Enter a lesson description here.',
'public' => true,
'menu_position' => 4,
'supports' => array( 'title', 'editor', 'excerpt'),
'has_archive' => true,
);
register_post_type( 'lesson', $args );
flush_rewrite_rules( false );
}
add_action( 'init', 'cm_lesson_cp' );
//Custom messages for custom post type`
function lesson_messages_cp( $messages ) {
global $post, $post_ID;
$messages['lesson'] = array(
0 => '',
1 => sprintf( __('Lesson updated. <a href="%s">View Lesson</a>'), esc_url( get_permalink($post_ID) ) ),
2 => __('Custom field updated.'),
3 => __('Custom field deleted.'),
4 => __('Lesson updated.'),
5 => isset($_GET['revision']) ? sprintf( __('Lesson restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
6 => sprintf( __('Lesson published. <a href="%s">View Lesson</a>'), esc_url( get_permalink($post_ID) ) ),
7 => __('Lesson saved.'),
8 => sprintf( __('Lesson submitted. <a target="_blank" href="%s">Preview Lesson</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
9 => sprintf( __('Lesson scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview Lesson</a>'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
10 => sprintf( __('Lesson draft updated. <a target="_blank" href="%s">Preview Lesson</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
);
return $messages;
}
add_filter( 'post_updated_messages', 'lesson_messages_cp' );
// Register Program Taxonomy
function program_taxonomy_cp() {
$args = array();
register_taxonomy( 'program', 'lesson', $args );
}
add_action( 'init', 'program_taxonomy_cp', 0 );
// Customize taxonomy
function program_taxonomy_setting_cp() {
$labels = array(
'name' => _x( 'Program', 'taxonomy general name' ),
'singular_name' => _x( 'Program', 'taxonomy name' ),
'search_items' => __( 'Search Programs' ),
'all_items' => __( 'All Programs' ),
'parent_item' => __( 'Parent Program Category' ),
'parent_item_colon' => __( 'Parent Program Category:' ),
'edit_item' => __( 'Edit Program Category' ),
'update_item' => __( 'Update Program' ),
'add_new_item' => __( 'Add New Program' ),
'new_item_name' => __( 'New Program' ),
'menu_name' => __( 'Programs' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
);
register_taxonomy( 'program', 'lesson', $args );
}
add_action( 'init', 'program_taxonomy_setting_cp', 0 );
// Register Course Taxonomy
function course_taxonomy_cp() {
$args = array();
register_taxonomy( 'course', 'lesson', $args );
}
add_action( 'init', 'course_taxonomy_cp', 0 );
// Customize taxonomy
function course_taxonomy_setting_cp() {
$labels = array(
'name' => _x( 'Course', 'taxonomy general name' ),
'singular_name' => _x( 'Course', 'taxonomy name' ),
'search_items' => __( 'Search Courses' ),
'all_items' => __( 'All Courses' ),
'parent_item' => __( 'Parent Course Category' ),
'parent_item_colon' => __( 'Parent Course Category:' ),
'edit_item' => __( 'Edit Course Category' ),
'update_item' => __( 'Update Course' ),
'add_new_item' => __( 'Add New Course' ),
'new_item_name' => __( 'New Course' ),
'menu_name' => __( 'Courses' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
);
register_taxonomy( 'course', 'lesson', $args );
}
add_action( 'init', 'course_taxonomy_setting_cp', 0 );
// Register Custom Taxonomy "Level"
function level_taxonomy_cp() {
$args = array();
register_taxonomy( 'glossary', 'term', $args );
}
add_action( 'init', 'level_taxonomy_cp', 0 );
// Customize taxonomy
function level_taxonomy_setting_cp() {
$labels = array(
'name' => _x( 'Levels', 'taxonomy general name' ),
'singular_name' => _x( 'Level', 'taxonomy name' ),
'search_items' => __( 'Search Levels' ),
'all_items' => __( 'All Levels' ),
'parent_item' => __( 'Parent Level Category' ),
'parent_item_colon' => __( 'Parent Level Category:' ),
'edit_item' => __( 'Edit Level Category' ),
'update_item' => __( 'Update Level' ),
'add_new_item' => __( 'Add New Level' ),
'new_item_name' => __( 'New Level' ),
'menu_name' => __( 'Levels' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
);
register_taxonomy( 'level', 'lesson', $args );
}
add_action( 'init', 'level_taxonomy_setting_cp', 0 );
Ваша модель данных интересна. Можно ответить на этот вопрос лучше, чем я, но я не знаю, можем ли мы действительно сказать, как @toscho делает, что урок никогда не будет совместно использоваться курсами, или что никакие два уровня не будут иметь тот же урок в.
Я полагаю, что урок и курс являются и подобными сообщению вещами, но уровень - что-то, что имеет меньше смысла самостоятельно и нуждается в контексте (т.е. его уроки), чтобы быть значимым.
Если бы я создавал это, то я понизил бы 'уровень' к таксономии уроков, и я использовал бы Сообщения использования 2 Сообщения для связи уроков с курсами. Затем для получения урока я запросил бы его непосредственно. Для уровня в курсе я запросил бы уроки в термине того уровня, которые были также связаны с курсом.
По следующим причинам:
Шаблонная обработка Вас извлекает пользу из single-lesson.php
и т.д. в Вашей шаблонной иерархии. Если Вы делаете это путь @toscho, если бы Вы хотели различные шаблоны для уроков, курсы и т.д., которые необходимо было бы сделать, что-то немного сложное, как представляют условное выражение, прежде чем шаблон был представлен, и обработайте его сами.
Удобочитаемость запрос для post_type=lesson&level=level_one
более читаемо, чем post_parent=123243
(или безотносительно).
Гибкость Хочет урок, совместно использованный двумя курсами? Хотите снова использовать уроки через уровни? Можно сделать это. С прямой иерархией сообщения необходимо было бы копировать материал в базе данных, которая является рецептом для проблемы.
Простота Уровней, я признаю, что это - точка, где система менее гибка, но я думаю, что это в порядке - это не могло бы быть для Вашего примера использования! Если Вы хотите иметь то же название уровней (например, Уровня 1, Уровня 2, Уровня 3) через все Ваши курсы, почему бы не их в том же месте? Если Вы должны иметь на курс, описания на уровень, добавьте postmeta поле к своему курсу с описанием в нем. Менее гибкий, но возможно достаточно.
Вы используете taxonomies для моделирования иерархии. Я думаю, что это не хорошее решение. Условия в таксономии не являются взаимоисключающими, они предназначены, чтобы использоваться в n:m отношениях. В результате каждый уровень в Вашей установке может быть в нескольких курсах и любом уроке на нескольких уровнях. Это не то, что Вы хотите, правильно?
register_post_type()
берет аргумент hierarchical
. Установите его на true
, и используйте всего один тип сообщения для моделирования иерархии. Курсы являются теперь всеми сообщениями чей post_parent
0
, выравнивает тех чей post_parent
курс и так далее. Можно даже добавить подстраницы для уроков позже, если Вы видите потребность в этом.
Можно получить все более низкие уровни на каждой точке с get_children()
.
Это делает также легче добавить длинное, отформатированное описание и вложения к каждому курсу или уровню. Встроенный поиск будет работать и управлением доступом по умолчанию, будет легче также.
single-{$cpt}.php
и служить шаблонам условно становится твердым.
– gmazzap♦
03.08.2014, 14:40