Как смоделировать иерархию для курсов, уровней и уроков?

Я - немного новичок 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 );
5
03.08.2014, 06:57
2 ответа

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

Я полагаю, что урок и курс являются и подобными сообщению вещами, но уровень - что-то, что имеет меньше смысла самостоятельно и нуждается в контексте (т.е. его уроки), чтобы быть значимым.

Если бы я создавал это, то я понизил бы 'уровень' к таксономии уроков, и я использовал бы Сообщения использования 2 Сообщения для связи уроков с курсами. Затем для получения урока я запросил бы его непосредственно. Для уровня в курсе я запросил бы уроки в термине того уровня, которые были также связаны с курсом.

По следующим причинам:

  • Шаблонная обработка Вас извлекает пользу из single-lesson.php и т.д. в Вашей шаблонной иерархии. Если Вы делаете это путь @toscho, если бы Вы хотели различные шаблоны для уроков, курсы и т.д., которые необходимо было бы сделать, что-то немного сложное, как представляют условное выражение, прежде чем шаблон был представлен, и обработайте его сами.

  • Удобочитаемость запрос для post_type=lesson&level=level_one более читаемо, чем post_parent=123243 (или безотносительно).

  • Гибкость Хочет урок, совместно использованный двумя курсами? Хотите снова использовать уроки через уровни? Можно сделать это. С прямой иерархией сообщения необходимо было бы копировать материал в базе данных, которая является рецептом для проблемы.

  • Простота Уровней, я признаю, что это - точка, где система менее гибка, но я думаю, что это в порядке - это не могло бы быть для Вашего примера использования! Если Вы хотите иметь то же название уровней (например, Уровня 1, Уровня 2, Уровня 3) через все Ваши курсы, почему бы не их в том же месте? Если Вы должны иметь на курс, описания на уровень, добавьте postmeta поле к своему курсу с описанием в нем. Менее гибкий, но возможно достаточно.

1
19.02.2020, 22:08
  • 1
    Это имеет большой смысл с помощью таксономии для уровня. Для уровней не нужны описания или изображения или что-либо. Другие делают. Возможно, что урок может быть совместно использован некоторыми курсами. Вы предлагаете, чтобы я использовал различные пользовательские типы сообщения для курсов программ и уроков? Шаблоны действительно должны отличаться для каждого типа. Уровни будут последовательны от уровня 1 - 6, таким образом, я буду думать, что taxonomies должен работать. Спасибо за справку. –  user57391 07.08.2014, 23:55
  • 2
    А-а-а! Я пропустил ссылку для регистрации на сообщение. Я думаю, что это работало бы чрезвычайно хорошо! Все имеет смысл теперь. –  user57391 08.08.2014, 00:06

Вы используете taxonomies для моделирования иерархии. Я думаю, что это не хорошее решение. Условия в таксономии не являются взаимоисключающими, они предназначены, чтобы использоваться в n:m отношениях. В результате каждый уровень в Вашей установке может быть в нескольких курсах и любом уроке на нескольких уровнях. Это не то, что Вы хотите, правильно?

register_post_type() берет аргумент hierarchical. Установите его на true, и используйте всего один тип сообщения для моделирования иерархии. Курсы являются теперь всеми сообщениями чей post_parent 0, выравнивает тех чей post_parent курс и так далее. Можно даже добавить подстраницы для уроков позже, если Вы видите потребность в этом.

Можно получить все более низкие уровни на каждой точке с get_children().

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

2
19.02.2020, 22:08
  • 1
    +1. Это - вероятно, лучший подход для того, как WP работает из поля. Проблема, когда CPT уникален, состоит в том, чтобы знать, которые выравниваются, объект принадлежат. НАПРИМЕР, при запросах cpt Вы получаете все уровни (программа, курсы, уровень, уроки), если post_parent 0 затем, уровень является первым, но в других случаях твердо знать, является ли объект сообщения курсом урок или иначе. Это отражается в шаблонной иерархии: все сообщения вручены уникальным шаблоном single-{$cpt}.php и служить шаблонам условно становится твердым. –  gmazzap♦ 03.08.2014, 14:40
  • 2
    Большое спасибо за ответы! Это имеет такой смысл теперь. Я собираюсь исправить код прямо сейчас и начать играть вокруг. У меня определенно будут некоторые вопросы на обслуживании шаблонов условно... Это должно быть выполнимо хотя право? Одна вещь за один раз, хотя :) –  user57391 04.08.2014, 07:26

Теги

Похожие вопросы