自定义帖子类型和页面层次结构 - 错误 404

Posted

技术标签:

【中文标题】自定义帖子类型和页面层次结构 - 错误 404【英文标题】:Custom post types & Pages hierarchy - Error 404 【发布时间】:2019-05-03 12:55:41 【问题描述】:

我定义了两种自定义帖子类型:

主题 Fiche

我还有 7 个页面使用定义的 rubrique 模板:(template-rubrique.php)

我的 ThemeFiche 都有一个 ACF post-object 字段。

Theme ACF post-object 字段用于定位 Rubrique。 Fiche ACF 后置对象字段用于定位主题

我希望我的 CPTS URL 采用以下格式:example.com/myRubriqueName/myThemeName/myFicheName

myRubriqueName 是 Page,而 myThemeNamemyFicheName 是 CPT。

到目前为止,我所有的 fichetheme 帖子 URL 都生成良好,但它们最终出现在 404 页面中。此外,我的帖子和页面被重定向到首页。

我正在使用来自this post 的代码,我试图根据自己的情况进行调整。


CPT 注册:

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

重写规则

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

CPT 占位符重写

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

不匹配的相关帖子重定向

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

【问题讨论】:

【参考方案1】:

“刷新”永久链接。

当一个人添加了创建或影响自定义帖子类型的代码时,通常可以通过简单地“刷新”永久链接来解决 404。可以通过访问设置 -> 永久链接手动执行此操作。https://typerocket.com/flushing-permalinks-in-wordpress/。

这是一个“昂贵”的操作,因此建议不要包含执行此操作的代码https://codex.wordpress.org/Function_Reference/flush_rewrite_rules,而只需手动执行一次即可。

【讨论】:

我已经做了好几次了,没有任何改变。

以上是关于自定义帖子类型和页面层次结构 - 错误 404的主要内容,如果未能解决你的问题,请参考以下文章

WordPress中具有自定义帖子类型的单个页面的层次结构

wordpress 3.8.1 类别第 2 页错误 404 未找到 / 自定义帖子类型

自定义帖子类型和分类法分页 404 错误

使用移动浏览器请求自定义帖子类型时出现 Wordpress REST API 404 错误

页面和自定义帖子类型如何共享同一个父级

未找到具有自定义分页 404 的自定义分类和自定义帖子类型