Пользовательские правила перезаписи типа сообщений не работают, как изменить порядок перезаписи?

Я прошел через четыре или пять страниц Codex, десятки страниц Stackexchange и четыре или пять dev-блогах, пытающихся решить эту проблему.

У меня есть пользовательский тип сообщения, называемый авторами. CPT настроен правильно, я вытащил структуру CPT из Codex, и я проверил ее против генератора CPT. Окна администратора правильно создают, редактируют и списывают сообщения авторов, а URL-адреса находятся в правильном формате example.com/author/post_name/ . Авторские архивы также работают.

Но ничего, что я сделаю, покажет эту страницу на лицевой стороне. Это ничего, кроме 404s.

Я сбросил переписку дюжину раз, хотя на странице Permalinks и WP-CLI. Я также установил Permalinks Custom Post Type и имею ту же проблему.

CPT находится здесь:

 add_action( 'init', 'to4_cpt_author' ); function to4_cpt_author() { $labels = array( 'name' => _x( 'Authors', 'post type general name' ), 'singular_name' => _x( 'Author', 'post type singular name' ), 'menu_name' => _x( 'Authors', 'admin menu' ), 'name_admin_bar' => _x( 'Author', 'add new on admin bar' ), 'add_new' => _x( 'Add New', 'author' ), 'add_new_item' => __( 'Add New Author' ), 'new_item' => __( 'New Author' ), 'edit_item' => __( 'Edit Author' ), 'view_item' => __( 'View Author' ), 'all_items' => __( 'All Authors' ), 'search_items' => __( 'Search Authors' ), 'parent_item_colon' => __( 'Parent Authors:' ), 'not_found' => __( 'No authors found.' ), 'not_found_in_trash' => __( 'No authors found in Trash.' ) ); $args = array( 'labels' => $labels, 'description' => __( 'Author post type.' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => 'author', 'rewrite' => array('slug' => 'author', 'with_front' => true ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => 9, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ), 'taxonomies' => array( 'admin_tag', 'post_tag' ), 'menu_icon' => 'dashicons-id-alt' ); register_post_type( 'author', $args ); } 

Я установил плагин Query Monitor, и он сказал мне, что следующие перезаписи совпадают.

 All Matching Rewrite Rules Rule Query ([^/]*)/([^/]*)/?$ post_type=post &name=$matches[2] &meta=$matches[1] ^author/([^/]*)/? post_type=author &name=$matches[1] author/([^/]+)(?:/([0-9]+))?/?$ author=$matches[1] &page=$matches[2] (.?.+?)(?:/([0-9]+))?/?$ pagename=$matches[1] &page=$matches[2] 

Второй запрос ^author/([^/]*)/? это тот, который я написал, используя:

 function to4_rewrite_rule() { add_rewrite_rule( '^author/([^/]*)/?', 'index.php?post_type=author&name=$matches[1]','top' ); } add_action('init', 'to4_rewrite_rule', 10, 0); 

Но первый запрос, похоже, сначала подбирается, поэтому я получаю 404s. Query Monitor отображает сгенерированный запрос как name=catherine-collins&post_type=post когда он должен быть name=catherine-collins &post_type=author

Откуда этот запрос и как я могу его понизить? Других add_rewrite_rule в моей теме или плагине нет, поэтому я предполагаю, что это ядро. Тема «Двадцать семнадцать» с моим собственным плагином, определяющим несколько пользовательских типов сообщений.

Хотя вы уже нашли проблему, вот какой-то базовый код, чтобы переместить определенное правило в конец правил перезаписи с помощью фильтра rewrite_rules_array для людей, сталкивающихся с аналогичной проблемой.

Скажем, я хочу переместить правило для ([^/]*)/([^/]*)/?$ :

 add_filter("rewrite_rules_array", function($rules) { $keys = array_keys($rules); foreach($keys as $rule) { if($rule == '([^/]*)/([^/]*)/?$') { $value = $rules[$rule]; unset($rules[$rule]); $rules[$rule] = $value; break; } } return $rules; }); не add_filter("rewrite_rules_array", function($rules) { $keys = array_keys($rules); foreach($keys as $rule) { if($rule == '([^/]*)/([^/]*)/?$') { $value = $rules[$rule]; unset($rules[$rule]); $rules[$rule] = $value; break; } } return $rules; }); 

Обратите внимание, что вам нужно будет сбросить / обновить правила, чтобы это имело какой-либо эффект. Для этого достаточно сохранить конфигурацию постоянных ссылок в бэкэнд.

Да, это была ошибка пользователя.

Несколько месяцев назад я экспериментировал с Yeost и добавил, что rewrite_rules_array is functions.php. Он занимал приоритет над add_rewrite_rule. Как только я удалю это, пользовательские типы сообщений работают нормально.

Вот код нарушения:

 add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array'); function my_rewrite_rules_array($rules) { $rules = array('([^/]*)/([^/]*)/?$' => 'index.php?post_type=post&name=$matches[2]&meta=$matches[1]') + $rules; return $rules; } 

Это было разрешено с помощью Atom для поиска не-grep для '([^/]*)/([^/]*)/?$' Во всей папке сайта.