WordPress自定义帖子类型的URL重写和导航结构

时间:2014-11-01 作者:nelson

我创建了以下自定义帖子类型:

艺术家的专辑歌曲是专辑的孩子,专辑是艺术家的孩子。

我正在尝试以以下格式设置显示此关系的导航结构:http://www.example.com/artists/alicia-keys/discography/girl-on-fire/brand-new-me. alicia-keys 是一个类型艺术家的帖子名,girl-on-fire 是帖子类型相册的帖子名称;brand-new-me 是贴子类型歌曲的贴子名称。

当有人缩短url说:,http//www.example.com/artists/alicia-keys/discography 它应该显示属于Alicia密钥的相册,如果您只需键入http://www.example.com/albums 它显示所有艺术家的所有专辑。如果我在艺术家CPT中有一个链接,例如“查看所有相册”,我希望它打开一个新页面,显示属于父艺术家的所有相册

我有以下文件:

单身艺术家。php单张专辑。php单曲。php存档艺术家。php存档相册。php存档歌曲。php问题可以细分如下:

是否需要在函数中编写重写规则和/或筛选代码。php?如果是,我该怎么做?

是否需要更改/重写slug?如果是,我需要做什么

我是否需要其他文件来实现上述链接结构?如果是,请解释。

请注意:我正在使用Wp-types插件创建自定义的帖子类型。然而,我强烈感觉这个问题更多的是Wordpress的挑战,而不是局限于特定的插件。毕竟,我相信插件产生的代码与从头开始编写帖子类型的代码几乎相同,但尽管如此,我也在他们的论坛上发布了一个类似的问题。如果我在那里得到答案,我也会在这里提供,以帮助将来可能面临此类问题的任何其他人。

UPDATE: Potential path to solution

在谷歌搜索了一段时间后,我找到了一条我认为可以解决问题的途径。我能够创建以下链接结构,加载alicia Key的所有相册:

示例。com/艺术家/alicia keys/唱片公司http://code.tutsplus.com/articles/custom-page-template-page-based-on-url-rewrite--wp-30564

正如代码的原始作者所说,由于使用PHP匿名函数,这需要PHP 5.3.0及以上版本。

在函数中。php

<?php
 //create a rewrite rule that will append /discography to artists endpoint
 function ex_rewrite(){
  //add_rewrite_rule( \'artists/([^/]+)/discography\', \'index.php?artists=$matches[1]&discography=yes\', \'top\' );
   add_rewrite_rule( \'artists/([^/]+)/discography/([^/]+)/?\', \'index.php?album_artist=$matches[1]&discography=yes&albums=$matches[2]\', \'top\' );
 }
 add_action(\'init\',\'ex_rewrite\');
//register query variable so that wordpress recognizes discography query_var
function ex_query_var($vars){
 $vars[]= \'discography\';
 $vars[] = \'album_artist\';
 return $vars;
}
 add_filter(\'query_vars\',\'ex_query_var\');
//tell wordpress that when it sees the discography query variable,set/load a template called single-artists-discography.
add_filter( \'template_include\', function( $path ) {
if ( get_query_var( \'album_artist\' ) && is_singular( \'artists\' ) ) {
    return get_template_directory() . \'/single-artists.php\';
}
if ( get_query_var( \'discography\' ) && is_singular( \'artists\' ) ) {
    return get_template_directory() . \'/single-artists-discography.php\';
}
return $path;
});
单一艺术家唱片库保存着显示属于特定艺术家的所有专辑的逻辑。在这种情况下,它将显示属于Alicia密钥的所有相册。这回答了上述问题的第三部分,即需要额外的文件。

因此,挑战的范围缩小到:

如何重写相册的URL以显示示例。com/艺术家/艾丽西娅·凯斯/唱片公司/着火的女孩/ul>我希望现在更多知识渊博的开发人员可以将此作为一个指针来帮助我解决上述问题,因为我的研究越来越多。

3 个回复
最合适的回答,由SO网友:Rachel Carden 整理而成

为了重写自定义帖子类型的URL或永久链接,您需要过滤“post\\u type\\u链接”,该链接在调用get\\u permalink()时运行,允许您更改帖子的永久链接。我在下面包含了一些指导代码。

你似乎掌握了重写规则,但如果需要更多帮助,请告诉我。

add_filter( \'post_type_link\', \'filter_the_post_type_link\', 1, 4 );
function filter_the_post_type_link( $post_link, $post, $leavename, $sample ) {

    // Filter the permalink by post type
    switch( $post->post_type ) {

        case \'albums\':

            // Build permalink
            $post_link = get_bloginfo( \'url\' ) . \'/artists/\';

            // Get the artist
            $album_artist = ??

            // Add artist to permalink
            $post_link .= "{$album_artist}/";

            // Add album name to permalink
            $post_link .= "discography/{$post->post_name}";

            break;

        case \'songs\':

            // Build permalink
            $post_link = get_bloginfo( \'url\' ) . \'/artists/\';

            // Get the artist
            $album_artist = ??

            // Add artist to permalink
            $post_link .= "{$album_artist}/";

            // Get the album
            $album = ??

            // Add album to permalink
            $post_link .= "discography/{$album}/";

            // Add song name to permalink
            $post_link .= "{$post->post_name}";

            break;

    }

    return $post_link;

}

SO网友:nelson

这是对Rachel回答的澄清和补充。将此与她的代码结合起来将产生完整的解决方案(主持人建议我将此放在这里,而不是用更新编辑问题。我对Rachel的回答给予100%的信任)

<?php
 //rewrite rules for discography, news, albums,songs
 function ex_rewrite(){
 //discography rewrite
 add_rewrite_rule( \'artists/([^/]+)/discography/?$\', \'index.php?artists=$matches[1]&discography=yes\',\'top\');
 //news
add_rewrite_rule(\'artists/([^/]+)/news/?$\', \'index.php?artists=$matches[1]&news=yes\',\'top\');
//album rewrite
add_rewrite_rule( \'artists/([^/]+)/discography/([^/]+)/?$\', \'index.php?album_artist=$matches[1]&discography=yes&albums=$matches[2]\', \'top\' );
//song rewrite
add_rewrite_rule( \'artists/([^/]+)/discography/([^/]+)/([^/]+)/?$\', \'index.php?album_artist=$matches[1]&discography=yes&albums=$matches[2]&songs=$matches[3]\', \'top\' );
 }
 add_action(\'init\',\'ex_rewrite\');
//register query variable so that wordpress recognizes discography query_var as well as other variables you might be using
function ex_query_var($vars){
 $vars[]= \'discography\';
 $vars[] = \'album_artist\';
 $vars[] = \'news\';
 return $vars;
}
 add_filter(\'query_vars\',\'ex_query_var\');
//tell wordpress that when it sees the discography or news variable, redirect to to their respective templates.
add_filter( \'template_include\', function( $path ) {
if ( get_query_var( \'discography\' ) && is_singular( \'artists\' ) ) {
    return get_template_directory() . \'/single-artists-discography.php\';
    // URL will result in example.com/artists/alicia-keys/discography
}
 if ( get_query_var( \'news\' ) && is_singular( \'artists\' ) ) {
    return get_template_directory() . \'/single-artists-news.php\';
  //URL will result in example.com/artists/alicia-keys/news
}
return $path;
});
//Rachel\'s code starts here......
至于示例中的链接。com/artists/aliciakeys,将带您进入示例。com/艺术家/alicia keys/唱片公司:

<a href="<?php echo get_permalink($post->ID). \'discography/\';?>"> See Alicia Keys\' Full Discography</a>
在Rachel的代码中,有一些变量需要提供父帖子的slug($album\\u-artist,$album)。这就是您用来建立帖子类型之间关系的方法发挥作用的地方。我正在使用一个插件,它提供了建立关系以及使用外键提取父信息的功能。

我觉得对于那些想知道需要为这两个变量提供什么信息的人来说,注意这一点很重要。

SO网友:Milo

看来你已经注意到了椎间盘造影规则。您可以通过rewrite 注册帖子类型时的参数。这可能需要您手动注册帖子类型,但不确定插件提供的控制级别。您还必须注意您注册帖子类型的确切顺序,以便您的规则从最具体到最不具体。这可能是您必须手动注册帖子类型的另一个原因。

艺术家是最简单的,那就是:

rewrite => array( \'slug\' => \'artists\' )
相册应为:

rewrite => array( \'slug\' => \'artists/%artist%/discography\' )
最后,歌曲是:

rewrite => array( \'slug\' => \'artists/%artist%/discography/%album%\' )
然后你需要post_type_link 加载相关数据并将其替换为%artist%%album% 重写标记。我不确定这些关系是如何存储的,所以我不能告诉你这将如何工作。您可以看到此函数的类似示例,其中有一个分类术语this answer.

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-