Ich habe zwei benutzerdefinierte Beitragstypen definiert:
- Thema
- Datenblatt
Ich habe auch 7 Seiten mit einem definierten Rubrik Schablone: (template-rubrique.php)
Beide meine Thema und Datenblatt ein ACF-Post-Object-Feld haben.
- Das Thema-ACF-Nachobjektfeld wird verwendet, um a Rubrik.
- Das Fiche-ACF-Nachobjektfeld wird verwendet, um auf a abzuzielen Thema.
Ich möchte, dass meine CPTS-URL das folgende Format hat: example.com/myRubriqueName/myThemeName/myFicheName
.
myRubriqueName
ist eine Seite, währendmyThemeName
undmyFicheName
sind CPT.
Bis jetzt alle meine fiche und Thema Posts-URL sind gut generiert, landen aber auf einer 404-Seite. Außerdem werden meine Beiträge und Seiten auf die Titelseite umgeleitet.
Ich verwende den Code von dieser Beitragdie ich versucht habe, an meine Situation anzupassen.
Registrierung von CPTs:
register_post_type('theme', array(
'labels' => array(
'name' => 'Thèmes',
'singular_name' => 'Thème',
),
'public' => true,
'has_archive' => false,
'hierarchical' => false,
'menu_icon' => 'dashicons-art',
'rewrite' => array(
'slug' => '%rubrique%', // %rubrique% is used as placeholder
'with_front' => false
)
));
register_post_type('fiche', array(
'labels' => array(
'name' => 'Fiches',
'singular_name' => 'Fiche',
),
'public' => true,
'has_archive' => false,
'hierarchical' => false,
'menu_icon' => 'dashicons-clipboard',
'rewrite' => array(
'slug' => '%rubrique%/%theme%', // %rubrique%/%theme% is used as placeholder
'with_front' => false
),
));
Regeln neu schreiben
function fiche_rewrite() {
add_rewrite_tag(
'%theme%',
'([^&]+)',
'theme="
);
}
add_action( "init', 'fiche_rewrite' );
function theme_rewrite() {
add_rewrite_tag(
'%rubrique%',
'([^&]+)',
'rubrique="
);
}
add_action( "init', 'theme_rewrite' );
Umschreiben von CPT-Platzhaltern
function gpc_custom_post_link_replacements( $post_link, $post ) {
$cpts = array('theme', 'fiche');
if ( empty( $post ) || !in_array($post->post_type, $cpts) ) {
return $post_link;
}
switch ($post->post_type) {
case 'fiche':
$theme_id = get_field('fiche-attachment', $post->ID);
$theme_slug = get_post_field( 'post_name', $theme_id );
$rubrique_id = get_field('theme-attachment', $theme_id);
$rubrique_slug = get_post_field('post_name', $rubrique_id);
if ( !empty( $theme_slug ) && !empty( $rubrique_slug ) ) {
$post_link = str_replace('%rubrique%', $rubrique_slug, $post_link );
$post_link = str_replace('%theme%', $theme_slug, $post_link );
}
break;
case 'theme':
$rubrique_id = get_field('theme-attachment', $post->ID);
$rubrique_slug = get_post_field('post_name', $rubrique_id);
if ( !empty( $rubrique_slug ) ) {
$post_link = str_replace('%rubrique%', $rubrique_slug, $post_link );
}
break;
}
return $post_link;
}
add_filter( 'post_type_link', 'wpc_custom_post_link_replacements', 9, 2 );
Nicht übereinstimmende Weiterleitung verwandter Beiträge
function custom_post_redirects() {
global $post, $wp_query;
$redirect_to = get_home_url();
if( ! is_singular( 'fiche' ) && ! is_singular('theme') ) {
return;
}
if( is_singular('fiche') ) {
$given_slug = $wp_query->get( 'theme' );
$expected_theme = get_field('field-attachment', $post->ID );
if( empty( $given_slug ) || empty( $expected_theme ) ) {
wp_redirect( $redirect_to );
exit();
}
$expected_slug = get_post_field( 'post_name', $expected_theme );
if( $given_slug !== $expected_slug ) {
wp_redirect( $redirect_to );
exit();
}
}
else if( is_singular('theme' ) ) {
$given_slug = $wp_query->get( 'rubrique' );
$expected_rubrique = get_field('theme-attachment', $post->ID);
if( empty( $given_slug ) || empty( $expected_theme ) ) {
wp_redirect( $redirect_to );
exit();
}
$expected_slug = get_post_field( 'post_name', $expected_rubrique );
if( $given_slug !== $expected_slug ) {
wp_redirect( $redirect_to );
exit();
}
}
}
add_action( 'template_redirect', 'custom_post_redirects' );