Benutzerdefinierte Umschreibungsregeln für Post-Typen funktionieren nicht, wie kann die Umschreibreihenfolge geändert werden?

Ich habe vier oder fünf Codex-Seiten, Dutzende Stackexchange-Seiten und vier oder fünf Entwicklerblogs durchsucht, um das Problem zu lösen.

Ich habe einen benutzerdefinierten Beitragstyp namens authors. Der CPT ist korrekt eingerichtet, ich habe das CPT-Framework aus dem Codex gezogen und es mit einem CPT-Generator verglichen. Die Admin-Bildschirme erstellen, bearbeiten und listen Autor Posts korrekt auf und die URLs haben das korrekte Format von example.com/author/post_name/ . Autorenarchive funktionieren auch.

Aber nichts, was ich mache, wird diese Seite am Frontend anzeigen. Es ist nichts als 404s.

Ich habe das Umschreiben ein Dutzend Mal über die Permalinks-Seite und WP-CLI gelöscht. Ich habe auch Custom Post Type Permalinks installiert und habe das gleiche Problem.

CPT ist hier:

 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 ); } 

Ich habe das Query Monitor-Plugin installiert und er teilt mir mit, dass die folgenden Neuschreibungen übereinstimmen.

 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] 

Die zweite Abfrage ^author/([^/]*)/? ist eine, die ich geschrieben habe mit:

 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); 

Aber die oberste Abfrage scheint zuerst abgeglichen zu werden, weshalb ich 404s bekomme. Der Abfrage-Monitor zeigt die generierte Abfrage als name=catherine-collins&post_type=post wenn name=catherine-collins &post_type=author

Woher kommt diese Abfrage und wie degradiere ich sie? Es gibt keine andere add_rewrite_rule irgendwo in meinem Thema oder einem Plugin, also ich vermute, das ist core. Das Thema ist Twenty-Seventeen mit meinem eigenen Plugin, das mehrere benutzerdefinierte Post-Typen definiert.

Solutions Collecting From Web of "Benutzerdefinierte Umschreibungsregeln für Post-Typen funktionieren nicht, wie kann die Umschreibreihenfolge geändert werden?"

Während Sie das Problem bereits gefunden haben, finden Sie hier einen grundlegenden Code zum Verschieben einer bestimmten Regel an das Ende der Umschreibungsregeln mit dem rewrite_rules_array- Filter für Personen, die über ein ähnliches Problem stolpern.

Angenommen, ich möchte die Regel für ([^/]*)/([^/]*)/?$ Verschieben:

 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; }); 

Beachten Sie, dass Sie die Regeln leeren / aktualisieren müssen, damit dies Auswirkungen hat. Das Speichern Ihrer Permalinks-Konfiguration im Backend reicht aus, um dies zu erreichen.

Ja, so war es doch ein Benutzererrors.

Vor Monaten hatte ich mit Yeost experimentiert und hatte ein rewrite_rules_array mit functions.php hinzugefügt. Es hatte Vorrang vor der add_rewrite_rule. Sobald ich das gelöscht habe, funktionierten benutzerdefinierte Posts normal.

Hier ist der anstößige Code:

 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; } 

Dies wurde dadurch getriggers, dass Atom eine nicht-grep-Suche nach '([^/]*)/([^/]*)/?$' Im gesamten Site-Ordner durchführte.