代码之家  ›  专栏  ›  技术社区  ›  Quentin

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

  •  8
  • Quentin  · 技术社区  · 7 年前

    我定义了两种自定义的post类型:

    • 主题
    • 菲切

    红宝石 模板:( 模板-rubrique.php文件

    我的两个 主题 菲切 有一个ACF post object字段。

    • 主题ACF post object字段用于将 .
    • Fiche ACF post object字段用于将 .

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

    myRubriqueName 是一个页面,而 myThemeName myFicheName 是CPT。


    到目前为止,我所有的 菲切 主题 posts 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 回复  |  直到 7 年前
        1
  •  2
  •   anmari    7 年前

    “冲洗”永磁线。

    404如果添加了创建或影响自定义post类型的代码,通常只需“刷新”permalinks即可解决。您可以通过访问“设置”->永久链接来手动执行此操作。
    https://typerocket.com/flushing-permalinks-in-wordpress/

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

    推荐文章