Benutzerdefinierte Beitragstypen und Seitenhierarchie – Fehler 404

Lesezeit: 3 Minuten

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ährend myThemeName und myFicheName 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' );

‘Flush’ die Permalinks.

Ein 404, wenn man Code hinzugefügt hat, der benutzerdefinierte Beitragstypen erstellt oder beeinflusst, wird oft durch einfaches „Leeren“ der Permalinks gelöst. Man kann dies manuell tun, indem man Einstellungen -> Permalinks besucht.
https://typerocket.com/flushing-permalinks-in-wordpress/.

Es ist eine “teure” Operation, daher wird empfohlen, den Code dafür nicht einzuschließen https://codex.wordpress.org/Function_Reference/flush_rewrite_rulesaber machen Sie es einfach einmal manuell.

  • Das habe ich schon mehrmals gemacht, es ändert nichts.

    – Quentin Veron

    8. Dezember 2018 um 14:07 Uhr


1386030cookie-checkBenutzerdefinierte Beitragstypen und Seitenhierarchie – Fehler 404

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy