自定义帖子类型的父页面和面包屑URL不起作用

时间:2015-10-11 作者:Codette

What I Have Set Up

我有三种自定义帖子类型,它们分别命名为“品牌”、“职业”和“新闻”
我有三个页面模板,它们分别命名为“页面品牌”、“页面职业”和“页面新闻”
我使用这些模板创建的页面会查询同名的自定义帖子(即,我的“新闻”页面列出了所有“新闻”自定义帖子)。

我的自定义帖子类型主要是“品牌”、“职业”和“新闻”。

“我的网页”的URL为:

www.example.com/our-brands/
www.example.com/our-careers/
www.example.com/our-news/

我给这些页面添加了这些slug,因为我知道这些页面本身不能有与自定义帖子类型相同的slug,否则WordPress会感到困惑,并开始给出404个错误。

My Issue

我的页面的永久链接可以工作,我的自定义帖子的永久链接也可以工作,但我无法让我的面包屑获得正确的父页面URL。

例如:如果您要访问www.example.com/our-news/ 然后单击此处列出的“新闻”帖子,生成的URL将是www.example.com/news/example-news-custom-post/.
因此,我的面包屑显示为“主页»新闻»示例新闻自定义帖子”。如果有人想使用面包屑导航回来,并点击“新闻”链接,他们会得到404错误,因为www.example.com/news/ 不存在。

What I Have Tried

我试图通过更改rewrite参数(注册帖子类型时可用)来解决这个问题,以便rewrite slug与我创建的页面的url相匹配。

\'rewrite\'             => array( 
                \'slug\'       => \'our-news\',
                \'with_front\' => true,
                \'pages\'      => true,
                \'feeds\'      => true,
),
当然,这不起作用,因为WordPress现在很混乱,我的“新闻”页面开始出现404错误。

接下来,我尝试创建一个元框,为我的自定义帖子类型提供一个父页面,使用我创建的页面ID将它们指定为自定义帖子的父页面。

function rmm_add_meta_box() {

    $screens = array( \'brands\', \'news\' , \'careers\');    

    foreach ( $screens as $screen ) {

        add_meta_box(
            \'custom_post_parent\',
            \'Enter Post Parent ID\',
            \'rmm_add_meta_callback\',
            $screen,
            \'side\'
        );
    }
}
add_action( \'add_meta_boxes\' , \'rmm_add_meta_box\' );

function rmm_add_meta_callback( $post ) {
    wp_nonce_field( basename( __FILE__ ), \'rmm_meta_nonce\');

    $custom_post_id  = get_post_custom($post->ID);
    $parent_id       = $custom_post_id[\'parent_id\'][0];
    $rmm_stored_meta = get_post_meta( $custom_post_id );

    ?>
    <input type="text" id="parent_id" name="parent_id" value="<?php if ( ! empty( $rmm_stored_meta[\'parent_id\'] ) ) echo esc_attr( $rmm_stored_meta[\'parent_id\'][0] ) ; ?>" />
    <?php
}

function rmm_meta_save( $post ){

    $is_autosave    = wp_is_post_autosave( $post_id );
    $is_revision    = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ \'rmm_meta_nonce\' ] ) && wp_verify_nonce( $_POST[ \'rmm_meta_nonce\' ], basename( __FILE__) ) ) ? \'true\' : \'false\';

    if ( $is_autosave || $is_revision || !$is_valid_nonce){

        return;
    }

    $data = sanitize_text_field( $_POST[\'parent_id\'] );

    if ( isset( $_POST[\'parent_id\'] ) ) {

        update_post_meta($post_id, \'parent_id\', $data);
    }
}
add_action( \'save_post\', \'rmm_meta_save\');
这导致了“我们的新闻”这一段被钉在“新闻”这一段上。换句话说:www.example.com/news/example-news-custom-post/ 简直成了www.example.com/our-news/news/example-news-custom-post/, 我的面包屑会将您引导到包含URL的父页面www.example.com/our-news/news/ (当然,这并不存在)。

我想知道如何获取我的父页面urlwww.example.com/our-news/ 我的自定义帖子url为www.example.com/our-news/example-news-custom-post 这样我的面包屑就不会再将我指向不存在的页面的URL了。

1 个回复
最合适的回答,由SO网友:Codette 整理而成

好吧,我想得太多了,因为我没有想到,如果在注册帖子类型时将“has archive”设置为“true”,WordPress会自动为自定义帖子类型生成归档页。

什么结束了工作

我创建了自定义archive-{slug}.php 我注册的“品牌”、“职业”和“新闻”自定义帖子类型的主题文件模板。完成后,我上传了我的主题,并通过自定义链接选项将永久链接(WordPress会自动为每个归档页面生成)添加到导航菜单中。这导致页面具有正确的urlwww.example.com/news/, 具有正确url的帖子www.example.com/news/example-news-custom-post, 还有在帖子标题前写着“新闻”的面包屑,以及正确的URL。

相关推荐

仅为主页显示Metabox

我将尝试使用设置字段将metabox添加到主页,但出现问题,请帮助我。删除时,metabox不会显示在页面编辑器中if statement 它显示在所有页面上。add_action(\'add_meta_boxes\', \'metabox_homepage_videos\'); function metabox_homepage_videos($post) { if (is_front_page()): add_meta_box(\'metabox