Пользовательский тип сообщения / таксономия Slug / Post Title с архивом типа сообщения

Я пробовал плагины, читал стек и тратил часы на это, и я просто не могу найти способ добиться того, чего хочу.

Я могу достичь следующей структуры permalink:

custom-post-type/taxonomy-term/post-title

например, our-work/interactive/some-project-title

который также позволяет our-work/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 обратного вызова фильтра 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; }