web-dev-qa-db-ja.com

コース、レベル、レスンの階層をモデル化する方法

私はちょっとWordpressのノブです、そして、私は最初にコース作成プラグインに飛び込んでいます。構造は program> course> level> lesson になります。今私はカスタムポストタイプとレベルとして設定されたレッスンを持っています、コースとプログラムは分類学です。基本的に私はあなたが最初にプログラムを選び、それからコース、そしてレベル、そしてレッスンを選ぶナビゲーションパスを作成するのに役立ちます。私は私の頭脳をラッキングしていて、ちょっと立ち往生しています。私が言ったように、私はWordpressとphpにはかなり慣れていません。

これはカスタム投稿タイプと分類法を使用することによってこれを実行するための実行可能な方法であり、誰かが何か提案やリソースを持っていますか?このためにカスタムテーマテンプレートファイルを作成するか、ナビゲーション用のページでショートコードを使用するかについてはわかりません。

                 Program
                    |
                   / \
                  /   \
             Course1 Course2
                /\     /\
               /  \   /  \
             Lv1 Lv2 Lv1 Lv2
            /\   /\   /\   /\
          Lessons Lessons Lessons

以下は私がこれまでに持っているものです(すみません、それはかなり長いです)。それはうまくいきます、私はまだそれをどのように組織化するかについてはあまり考え出していません。以下にカスタム投稿タイプと分類法を設定しました。それはそれについてです

<?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
user57391

あなたのデータモデルは面白いです。あなたは私よりもこの質問に答えることができますが、@ toschoがそうであるように、授業がコース間で決して共有されない、または2つのレベルが同じ授業を持つことはないと本当に言えるかどうかわかりません。

レッスンとコースはどちらもポストライクなものだと思いますが、レベルとはそれ自体が意味を成さないものであり、意味があるためにはコンテキスト(つまりレッスン)が必要です。

私がこれを構築していたならば、私は「レベル」を授業の分類法に任せ、そして授業を授業に関連づけるために 投稿2投稿 を使うことを使うでしょう。それからレッスンを受けるために私はそれを直接質問するでしょう。コース内のあるレベルについては、そのコースに関連したそのレベルの用語でのレッスンを照会します。

次のような理由から

  • テンプレート化テンプレート階層でsingle-lesson.phpなどの利点が得られます。もしあなたが@ toschoのやり方で、もしあなたがレッスン、コースなどのために異なるテンプレートが欲しいなら、あなたはテンプレートがレンダリングされる前に条件を導入してそれをあなた自身で処理するような少し複雑な何かをする必要があるでしょう。

  • 読みやすさpost_type=lesson&level=level_oneに対する問い合わせは、post_parent=123243よりも読みやすくなります。

  • 柔軟性2つのコースでレッスンを共有したいですか?レベルを超えてレッスンを再利用したいですか?あなたはそれをすることができます。ストレートな投稿階層では、データベース内の資料を複製する必要があります。これは問題を解決するためのレシピです。

  • レベルの単純化これはシステムの柔軟性が劣る点であると認めますが、それは問題ないと思います - あなたのユースケースではそうではないかもしれません!すべてのコースで同じレベルの名前(レベル1、レベル2、レベル3など)を使用したい場合は、同じ場所に配置しないでください。コースごと、レベルごとの説明が必要な場合は、コース内の説明とともにpostmetaフィールドをコースに追加します。それほど柔軟ではありませんが、おそらく十分です。

1
djb

階層をモデル化するために分類法を使用しています。これは良い解決策ではないと思います。分類法の用語は相互に排他的ではなく、それらはn:mの関係で使用されることを意味しています。結果として、あなたの設定のすべてのレベルは複数のコース、そして複数のレベルのどのレッスンでも可能です。これはあなたが望むものではありませんね。

register_post_type()は引数hierarchicalを取ります。それをtrueに設定し、階層をモデル化するためにただ1つの投稿タイプを使用します。 コース は現在、post_parent0であるすべての投稿、 レベル post_parentがコースである投稿などです。必要がある場合は、後でレッスン用のサブページを追加することもできます。

get_children()を使えば、各点ですべての下位レベルを取得できます。

これにより、各コースまたはレベルに、長いフォーマットされた説明と添付ファイルを簡単に追加できます。組み込み検索はデフォルトで機能し、アクセス制御もより簡単になります。

2
fuxia