カスタム分類法を使用してCutom Post Type用の正しいURL構造を設定することは非常に不満です。
私はcourses
というカスタム投稿タイプとcourse-type
というカスタム分類法を持っています。
site.com/courses/course-type/course-single-post/
。site.com/courses/science/rocket-to-the-moon/
私はなんとかしてそれを達成することに成功しましたが、すべてのURL部分が本来の動作をするわけではありません。
site.com/courses/
- 404を返しますsite.com/courses/science/
- カスタム分類法の側にあるすべての投稿を含むアーカイブページを表示しますsite.com/courses/science/rocket-to-the-moon/
- 正しい単一の投稿タイプを表示site.com/courses/
がすべてのカスタム投稿タイプを一覧表示したアーカイブページを表示するのではなく404を返すのはなぜですか?
これは私が使ったコードです:
<?php
/*Courses Custom Post Type*/
function my_custom_post_courses() {
$labels = array(
'name' => _x( 'Courses', 'post type general name' ),
'singular_name' => _x( 'Course', 'post type singular name' ),
'add_new' => _x( 'New course', 'reis' ),
'add_new_item' => __( 'Add new course' ),
'edit_item' => __( 'Edit course' ),
'new_item' => __( 'New item' ),
'all_items' => __( 'All courses' ),
'view_item' => __( 'View courses' ),
'search_items' => __( 'Search courses' ),
'not_found' => __( 'Nothing found ' ),
'not_found_in_trash' => __( 'Nothing found in the trash' ),
'parent_item_colon' => '',
'menu_name' => 'Courses'
);
$args = array(
'labels' => $labels,
'description' => 'Enter a new course',
'public' => true,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
'has_archive' => true,
'hierarchical' => true,
'rewrite' => array('slug' => 'courses/%course-type%','with_front' => false),
'query_var' => true,
//'rewrite' => true,
//'publicly_queryable' => false,
);
register_post_type( 'courses', $args );
}
add_action( 'init', 'my_custom_post_courses' );
/* Courses custom taxonomy */
function my_taxonomies_course_type() {
$labels = array(
'name' => _x( 'Course type', 'taxonomy general name' ),
'singular_name' => _x( 'Course type', 'taxonomy singular name' ),
'search_items' => __( 'Search course types' ),
'all_items' => __( 'All course types' ),
'parent_item' => __( 'Parent course type' ),
'parent_item_colon' => __( 'Parent course type:' ),
'edit_item' => __( 'Edit course type' ),
'update_item' => __( 'Update course type ' ),
'add_new_item' => __( 'Add new course type' ),
'new_item_name' => __( 'New course type' ),
'menu_name' => __( 'Course type' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'query_var' => 'course-type',
'rewrite' => array('slug' => 'courses' ),
'_builtin' => false,
);
register_taxonomy( 'course-type', 'courses', $args );
}
add_action( 'init', 'my_taxonomies_course_type', 0 );
/* Permalink filter Courses */
add_filter('post_link', 'course_permalink', 1, 3);
add_filter('post_type_link', 'course_permalink', 1, 3);
function course_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%course-type%') === FALSE) return $permalink;
// Get post
$post = get_post($post_id);
if (!$post) return $permalink;
// Get taxonomy terms
$terms = wp_get_object_terms($post->ID, 'course-type');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
$taxonomy_slug = $terms[0]->slug;
else $taxonomy_slug = 'no-course-type';
return str_replace('%course-type%', $taxonomy_slug, $permalink);
}
has_archive
をtrue
に設定すると、WordPressは書き換えスラグを使用してアーカイブ用の書き換え規則を生成します。代わりに、アーカイブスラッグを文字列として明示的に指定すると正しいルールが生成されます。
$args = array(
'has_archive' => 'courses',
'rewrite' => array('slug' => 'courses/%course-type%','with_front' => false),
// the rest of your args...
);
register_post_type( 'courses', $args );
あなたの望むパーマリンクURL構造を使って... WordPressはあなたの投稿タイプスラッグのためにあなたが入力したもの(courses/%course-type%
)のための書き換え規則の作成を自動的に処理しています。もちろん、あなたは(すでに行ったように)実際の値でプレースホルダーを置き換えるためにPost Typeリンクを修正しなければなりません。
しかし、WordPressはPost Typeスラッグでそのような振る舞いを期待していません。通常WordPressは(courses/%course-type%
の代わりに)courses
のような単純なものを期待します。
それでも大丈夫ですが、WordPressを使用すると、驚くほどの柔軟性とカスタマイズ機能を備えたほぼすべての状況に適応できます。
あなたがする必要があるのはあなたのポストタイプスラッグ(courses
)の「ベース」を処理するために書き換え規則を調整することです。
これは、現在アクティブ化されているテーマのfunctions.php
ファイル(またはより理想的には...プラグインファイル)に貼り付けることができる2つの関数できれいに行うことができます。
このステップでは、既存の書き換え規則に追加する新しい書き換え規則を要求しています。新しい書き換え規則はmbe_get_new_rewrite_rules();
関数に自動的に作成されます。
if ( ! function_exists( 'mbe_adjust_rewrite_rules' ) ) {
function mbe_adjust_rewrite_rules( $rules ) {
if ( ! function_exists( 'mbe_get_new_rewrite_rules' ) ) {
return $rules;
}
$new_rules = mbe_get_new_rewrite_rules( 'courses' );
return ( $new_rules + $rules );
}
add_action( 'rewrite_rules_array', 'mbe_adjust_rewrite_rules', 100 );
}
注意してください:この関数はパラメータとしてPost Typeの名前を必要とします。
この関数は指定された投稿タイプ名を取り、自動的にその書き換えスラッグ(投稿タイプ登録中に指定された)を取得します。
この関数はポストタイプスラグのスラッシュをチェックし続けます。見つかった場合は、最初のスラッシュ(AKAはベーススラッグ)より前のすべてのものが使用され、ポストタイプのベーススラッグに適した書き換え規則が生成されます。 (Post Typeの登録時にcourses/%course-type%
の代わりにcourses
の単純な書き換えスラグを指定した場合と同じです。)
if ( ! function_exists( 'mbe_get_new_rewrite_rules' ) ) {
function mbe_get_new_rewrite_rules( $post_type = '' ) {
$new_rules = array();
$post_type_object = get_post_type_object( $post_type );
if ( ! $post_type_object ) {
return $new_rules;
}
$post_type_slug = $post_type_object->rewrite['slug'];
$post_type_slug_base = substr( $post_type_slug, 0, strpos( $post_type_slug, '/' ) );
if ( ! empty( $post_type_slug_base ) ) {
$new_rules["{$post_type_slug_base}/?$"] = "index.php?post_type={$post_type}";
}
return $new_rules;
}
}
そこにあります。有効で機能する3つのURL。あなたの要求に従って。
domain.com/courses/
domain.com/courses/course-type/
domain.com/courses/course-type/course-name/
プログラムで書き換えルールをフラッシュするか、または新しい書き換えルールを有効にするためのDashboard -> Settings -> Permalinks
にアクセスすることを忘れないでください。