Ich arbeite an einem Plugin, das Listen erstellt. Nachdem ich eine Liste erstellt hatte, wollte ich den Slug aus der URL entfernen
Post-Typ:
$rewrite = [ 'slug' => 'single-link', 'with_front' => false, 'pages' => false, 'feeds' => false, ]; $args = [ 'label' => esc_html__( 'Single Link', 'single-link' ), 'labels' => $labels, 'supports' => [ 'title' ], 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 15, 'menu_icon' => 'dashicons-admin-links', 'show_in_admin_bar' => false, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => false, 'exclude_from_search' => true, 'publicly_queryable' => true, 'rewrite' => $rewrite, 'capability_type' => 'page', 'show_in_rest' => true, ]; $args = apply_filters( 'single-link/post_type/args', $args ); register_post_type( 'single-link', $args );
Entferne den Slug von der URL:
function remove_cpt_slug( $post_link, $post, $leavename ) { if ( 'single-link' != $post->post_type || 'publish' != $post->post_status ) { return $post_link; } $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link ); return $post_link; } add_filter( 'post_type_link', 'remove_cpt_slug', 10, 3 ); function change_slug_struct( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); } } add_action( 'pre_get_posts', 'change_slug_struct' );
(Dieser Code ist von hier )
Jetzt, nachdem die Veröffentlichung abgeschlossen wurde, wird der Slug / Single-Link / gelöscht, aber beim Besuch der Seite erhalten wir immer einen 404. Ändern / erneutes Speichern der Permalinks hat nicht geholfen. Was mache ich falsch?
Die Registrierung des benutzerdefinierten Post-Typs und der Permalink-Änderung ist OK. Das Problem ist mit den WordPress Rewrite-Regeln, die mehr als wahrscheinlich die “aufgeräumt” URL Ihrer einfachen Links zu Seiten pagename
und es wird die pagename
Query Var nicht name
wie Ihre change_slug_struct()
-function angenommen.
Ändern Sie die function so, dass alle Fälle berücksichtigt werden:
function change_slug_struct( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); } elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); // We also need to set the name query var since redirect_guess_404_permalink() relies on it. $query->set( 'name', $query->query['pagename'] ); } } add_action( 'pre_get_posts', 'change_slug_struct' );
Sie müssen die Permastruktur ändern. Standardmäßig wird der Beitrag Ihres benutzerdefinierten Beitragstyps nur gefunden, wenn die URL mit dem Slug-Präfix beginnt. Wenn Sie das Präfix ändern, haben Sie ähnliche Probleme wie beim Löschen. Sehen Sie sich diesen Beitrag an .
Um das Entfernen des post-type slug prefix zu erreichen, sollten Sie sich in single-link_rewrite_rules
und diese Regeln durchlaufen und auch dort das Präfix entfernen.
Hinweis: Änderungen in der Perma-Struktur können URL-Konflikte verursachen.