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.
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.