Custom_Taxonomy und custom_post_type in einer url Struktur
Ich hatte folgendes Problem.
Für einen Verein wollte ich aus der URL /team/teamname eine /altersklasse/team/teamname machen.
Mit ACF hatte ich den custom_post_type „teams“ und den custom_taxonomy „altersklasse„.
Mein Problem war jetzt, dass ich beides nicht in die URL bekommen habe.
Die Lösung sieht so aus:
![](https://tiborius.com/wp-content/uploads/2024/06/acf_link_struktur.png)
add_filter( 'post_type_link', 'ts_post_link', 1, 3 );
function ts_post_link( $post_link, $id = 0 ){
$post = get_post($id);
if ( is_object( $post ) && $post->post_type == 'team' ){
$terms = wp_get_object_terms( $post->ID, 'altersklasse' );
if( $terms ){
foreach( $terms as $term ){
if( 0 == $term->parent ){
return str_replace( '%altersklasse_category%' , $term->slug , $post_link );
}
}
} else {
return str_replace( '%altersklasse_category%' , 'uncategorized', $post_link );
}
}
return $post_link;
}
Hiermit wandeln wir unser Wort %altersklasse_category%, was wir in unserer ACF Team Link Struktur eingefügt haben um. Im Code müsste ihr „post_type == ‚team‘„, „$post->ID, ‚altersklasse‘“ und die beiden „%altersklasse_category%“ anpassen.
Dazu müsst ihr jetzt noch eure URL registrieren. Das geht so:
add_action( 'init', 'ts_add_team_rewrite_rule' );
function ts_add_team_rewrite_rule(){
add_rewrite_rule(
'([^/]+)/team/([^/]+)/?$',
'index.php?altersklasse=$matches[1]&team=$matches[2]',
'top'
);
}
„([^/]+)/team/([^/]+)/?$“ gibt an, wie eure URL aussehen soll, damit sie funktioniert, muss es etwas eindeutig geben, wie hier im Beispiel „team“. Habe ich es weggelassen, liefen alle Seiten in ein 404.
„index.php?altersklasse=$matches[1]&team=$matches[2]“ gibt an, wo, was hingesetzt werden soll.
In diesem Fall kommt die „altersklasse“ für das /team/ und „team“ danach.
Eigentlich wollte ich das /team/ auch noch raus haben, aber das habe ich einfach nicht geschafft. Aber so bin ich auch zufrieden.