私はプラグインを試し、スタックを読み、これに何時間も費やしましたが、私が望むものを達成する方法を見つけることができないようです。
私は以下のパーマリンク構造を達成することができます:
custom-post-type/taxonomy-term/post-title
例えばour-work/interactive/some-project-title
これはまた、our-work/interactive
が私たちの仕事の投稿をすべて分類学用語interactiveで正しく表示することを可能にしますが、アーカイブページour-work
をうまく動かすことはできません。
function my_custom_post_work() {
$labels = array(
'name' => _x( 'Work', 'post type general name' ),
'singular_name' => _x( 'Work', 'post type singular name' ),
'add_new' => _x( 'Add New', 'book' ),
'add_new_item' => __( 'Add New Work' ),
'edit_item' => __( 'Edit Work' ),
'new_item' => __( 'New Work' ),
'all_items' => __( 'All Work' ),
'view_item' => __( 'View Work' ),
'search_items' => __( 'Search Work' ),
'not_found' => __( 'No work found' ),
'not_found_in_trash' => __( 'No work found in the Trash' ),
'parent_item_colon' => '',
'menu_name' => 'Our Work'
);
$args = array(
'labels' => $labels,
'description' => 'Holds our works and work specific data',
'public' => true,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
'has_archive' => true,
'rewrite' => array( 'slug' => 'our-work/%work_category%')
);
register_post_type( 'work', $args );
}
add_action( 'init', 'my_custom_post_work' );
function mav_taxonomies_work() {
$labels = array(
'name' => _x( 'Work Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Work Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Work Categories' ),
'all_items' => __( 'All Work Categories' ),
'parent_item' => __( 'Parent Work Category' ),
'parent_item_colon' => __( 'Parent Work Category:' ),
'edit_item' => __( 'Edit Work Category' ),
'update_item' => __( 'Update Work Category' ),
'add_new_item' => __( 'Add New Work Category' ),
'new_item_name' => __( 'New Work Category' ),
'menu_name' => __( 'Work Categories' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'has_archive' => true,
);
register_taxonomy( 'work_category', 'work', $args );
}
add_action( 'init', 'mav_taxonomies_work', 0 );
function filter_post_type_link($link, $post) {
if ($post->post_type != 'work')
return $link;
if ($cats = get_the_terms($post->ID, 'work_category'))
$link = str_replace('%work_category%', array_pop($cats)->slug, $link);
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
理想的には、私は以下のものを動かしたいです:
/our-work/
=>すべてのカスタム投稿を表示/our-work/taxonomy-term/
=>選択した用語ですべての記事を表示/our-work/taxonomy-term/post-title/
=>特定の投稿がクリックされたときのパーマリンク。もっと良い方法はありますか?
コードを次のコードに置き換えます。post_type_link
フィルターのコールバック関数にいくつかの変更を加えました。
function my_custom_post_work() {
$labels = array(
'name' => _x( 'Work', 'post type general name' ),
'singular_name' => _x( 'Work', 'post type singular name' ),
'add_new' => _x( 'Add New', 'book' ),
'add_new_item' => __( 'Add New Work' ),
'edit_item' => __( 'Edit Work' ),
'new_item' => __( 'New Work' ),
'all_items' => __( 'All Work' ),
'view_item' => __( 'View Work' ),
'search_items' => __( 'Search Work' ),
'not_found' => __( 'No work found' ),
'not_found_in_trash' => __( 'No work found in the Trash' ),
'parent_item_colon' => '',
'menu_name' => 'Our Work'
);
$args = array(
'labels' => $labels,
'description' => 'Holds our works and work specific data',
'public' => true,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
'has_archive' => true,
'rewrite' => array( 'slug' => 'our-work/%work_category%')
);
register_post_type( 'work', $args );
}
add_action( 'init', 'my_custom_post_work' );
function mav_taxonomies_work() {
$labels = array(
'name' => _x( 'Work Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Work Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Work Categories' ),
'all_items' => __( 'All Work Categories' ),
'parent_item' => __( 'Parent Work Category' ),
'parent_item_colon' => __( 'Parent Work Category:' ),
'edit_item' => __( 'Edit Work Category' ),
'update_item' => __( 'Update Work Category' ),
'add_new_item' => __( 'Add New Work Category' ),
'new_item_name' => __( 'New Work Category' ),
'menu_name' => __( 'Work Categories' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'has_archive' => true,
);
register_taxonomy( 'work_category', 'work', $args );
}
add_action( 'init', 'mav_taxonomies_work', 0 );
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
function filter_post_type_link( $post_link, $id = 0, $leavename = FALSE ) {
if ( strpos('%work_category%', $post_link) === 'FALSE' ) {
return $post_link;
}
$post = get_post($id);
if ( !is_object($post) || $post->post_type != 'work' ) {
return $post_link;
}
$terms = wp_get_object_terms($post->ID, 'work_category');
if ( !$terms ) {
return str_replace('our-work/%work_category%/', '', $post_link);
}
return str_replace('%work_category%', $terms[0]->slug, $post_link);
}
また、提案されたURI構造が機能するためには、カスタム投稿タイプの書き換え規則を記述する必要があります。
テーマのfunctions.php
ファイルに以下のコードを追加してください。
add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_action( 'wp_loaded','my_flush_rules' );
function my_flush_rules(){
$rules = get_option( 'rewrite_rules' );
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
$newrules = array();
$newrules['our-work/?$'] = 'index.php?post_type=work';
$newrules['our-work/page/?([0-9]{1,})/?$'] = 'index.php?post_type=work&paged=$matches[1]';
$newrules['our-work/(.+?)/page/?([0-9]{1,})/?$'] = 'index.php?post_type=work&work_category=$matches[1]&paged=$matches[2]';
//print_r($rules);
return $newrules + $rules;
}