avianex / Wordpress / WordPress Custom-Post-Type Slug verkürzen

WordPress Custom-Post-Type Slug verkürzen

Bei der Erstellung von Custom Post Types verwendet WordPress als Leading-Directory den (selbst definierbaren) Slug-Namen des Custom Post Types. Obwohl die Benennung selbst wählbar ist, kann dieses Extra-Verzeichnis nicht mit Bordmitteln entfernt werden. Wie es doch geht, zeigt dieses How-To.

Das Stammverzeichnis ist erforderlich, um alle URLs unique zu halten. Denn ohne das Verzeichnis, könnte es z.B. durch einen Seitennamen oder Post eine Kollision (Doppelung) geben. Manchmal möchte man aber (z.B. aus SEO-Gründen) eine kurze URL, da man etwaige Doppelungen z.B. schlicht selbst im Griff hat und ausschließen kann 😉

Herausschneiden des Verzeichnisses aus der URL

Dieses und die folgenden Snippets kommen in die functions.php, „required_post_type_name“ bitte durch den Namen des eigenen Post-Types ersetzen. Wir lesen hier schlicht die Slug und ersetzen das Post-Type-Unterverzeichnis.

function avianex_remove_slug( $post_link, $post, $leavename ) {
    if ( ( 'required_post_type_name' != $post->post_type ) || 'publish' != $post->post_status ) {
        return $post_link;
    }
  $postType = $post->post_type;
               $postObjectDetails = get_post_type_object( $postType );
               if( $postType != $postObjectDetails->rewrite['slug']) {
               $postType = $postObjectDetails->rewrite['slug'];
                }
    $post_link = str_replace( '/' . $postType . '/', '/', $post_link );
    return $post_link;
}
add_filter( 'post_type_link', 'avianex_remove_slug', 10, 3 );

Rewrite der alten URL-Logik

Nur ersetzen reicht nicht, denn sonst werden 404er geschmissen, da WordPress die Posts noch immer nach der Default-Logik ausgibt.
Auch hier „required_post_type_name“ ersetzen.

function avianex_parse_request( $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', 'required_post_type_name',  'page' ) );
    }
}
add_action( 'pre_get_posts', 'avianex_parse_request' );

Rewrite der bereits indexierten URLs

Für den Fall, dass URLs bereits indexiert waren (Juhu!!) – hier noch eine optionale Funktion zum sauberen 301-Redirect.
Achtung: website_url durch die eigene ersetzen.

function avianex_cpt_rewrite() {
  add_rewrite_rule('post_type_name/(.+)$', 'website_url/$1 [R=301,L]', 'top');
}
add_action('init', 'avianex_cpt_rewrite');

That´s it! 😉

kommentieren