归档页面和单篇文章的自定义重写规则

时间:2016-06-14 作者:Łukasz Florczak

我正在构建一个Wordpress站点,其中包含几个自定义帖子类型。每种帖子类型都是不同的杂志。我还有一个自定义的元字段,用于杂志年度和发行。

我希望有URL(使用archive.php):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/
我是按代码制作的:

function magazine_rewrite_tag() {
    add_rewrite_tag(\'%issue_year%\', \'([0-9]{4})\');
    add_rewrite_tag(\'%issue%\', \'([0-9])\');
}
add_action(\'init\', \'magazine_rewrite_tag\', 10, 0);
以及:

function magazine_rewrite_rules() {
    add_rewrite_rule(\'^([a-z]+)/([0-9]{4})/([0-9])?\', \'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]\', \'top\');
    add_rewrite_rule(\'^([a-z]+)/([0-9]{4})?\', \'index.php?post_type=$matches[1]&issue_year=$matches[2]\', \'top\');
}
add_action(\'init\', \'magazine_rewrite_rules\');
当然,我还有一个自定义查询存档。php。而且效果很好。

但现在,我的单个文章的URL不起作用。默认情况下,它是:

http://my_site/magazine/post-title
但它会像url一样显示杂志中的所有文章(并使用archive.php模板):

http://my_site/magazine/
如何为单个自定义帖子添加正确的重写规则?有可能的话,我希望单篇文章的URL(仅适用于选定的自定义文章类型)采用以下格式:

http://my_site/magazine/year/issue/post-title

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

我找到了解决办法!Monkeyman Rewrite Analyzur插件非常有用:https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

所以现在,我有了这样的工作URL。。。

single.php:

/magazine-name/issue-year/issue/article-name

archive.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name
在wp admin的自定义帖子编辑器页面上,我使用高级自定义字段插件来显示发布年份和发布。您还可以自己定义元字段。

接下来,我为发行年份和发行添加了重写标记:

function custom_rewrite_tag() {
    add_rewrite_tag(\'%issue_year%\', \'([0-9]{4})\' );
    add_rewrite_tag(\'%issue%\', \'([0-9]+)\' );
}

add_action(\'init\', \'custom_rewrite_tag\');
接下来,我为任意URL组合添加了重写规则:

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule(\'^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$\', \'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]\', \'top\');

    // URL: /magazine/year/issue
    add_rewrite_rule(\'^([^/]+)/([0-9]{4})/([0-9])?$\', \'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]\', \'top\');

    // URL: /magazine/year
    add_rewrite_rule(\'^([^/]+)/([0-9]{4})?$\', \'index.php?post_type=$matches[1]&issue_year=$matches[2]\', \'top\');
}

add_action(\'init\', \'custom_rewrite_rule\');
最后,我用发行年份和发行日期替换了自己的标准URL

function custom_permalink($url, $post) {
    if ($post->post_type == \'magazine-name-1\' || $post->post_type == \'magazine-name-2\' || $post->post_type == \'magazine-name-2\' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field(\'issue_year\', $post->ID); // ACF; for meta: get_post_meta($post->ID, \'$issue\', true);
        $issue = get_field(\'issue\', $post->ID); // ACF

        $url = str_replace( $post_type . \'/\', $post_type . \'/\' . $issue_year . \'/\' . $issue . \'/\' , $url);
    }
    return $url;
}
add_filter(\'post_type_link\', \'custom_permalink\', 10, 2);

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?