$conf, $runtime; function_exists('chdir') AND chdir(APP_PATH); $r = 'mysql' == $conf['cache']['type'] ? website_set('runtime', $runtime) : cache_set('runtime', $runtime); } function runtime_truncate() { global $conf; 'mysql' == $conf['cache']['type'] ? website_set('runtime', '') : cache_delete('runtime'); } register_shutdown_function('runtime_save'); ?>Custom post types & Pages hierarchy - Error 404|Programmer puzzle solving
最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

Custom post types & Pages hierarchy - Error 404

matteradmin9PV0评论

I've defined two custom post types:

  • Theme
  • Fiche

I've also 7 pages using a defined rubrique template: (template-rubrique.php)

Both my Theme and Fiche have an ACF post-object field.

  • The Theme ACF post-object field is used to target a Rubrique.
  • The Fiche ACF post-object field is used to target a Theme.

I'd like my URLs to be in the following format: example/myRubriqueName/myThemeName/myFicheName.

myRubriqueName is a Page, while myThemeName and myFicheName are CPT.


Up to now, all my fiche and theme posts URL are well generated, but they end up in a 404 page.

I'm using the code from this post, which I tried to adjust to my situation.


CPTs registering:

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
    ),
));


Rewrite rules

function fiche_rewrite() {

    add_rewrite_rule(
        '%theme%',
        '([^&]+)',
        'theme='
    );
}
add_action( 'init', 'fiche_rewrite' );


function theme_rewrite() {

    add_rewrite_rule(
        '%rubrique%',
        '([^&]+)',
        'rubrique='
    );
}
add_action( 'init', 'theme_rewrite' );


CPT placeholder rewriting

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 );


Mismatched related posts redirecting

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' );
Post a comment

comment list (0)

  1. No comments so far