包括多个分类的定制帖子类型的定制固定链接结构

时间:2020-07-02 作者:Axel Murman

目标是建立如下结构:example.com/tax_1/tax_2/post_name

此代码生成正确的结构,但找不到帖子(404)

// Register custom post types
function register_work() {
    $args = array(
        \'public\' => true,
        \'label\' => \'Projekt\',
        \'menu_name\' => \'work\',
        \'menu_icon\' => \'dashicons-welcome-view-site\',
        \'has_archive\' => false,
        \'supports\' => array( \'thumbnail\', \'title\' ),
        \'rewrite\' => array(
            \'slug\' => \'%filter_1%/%filter_2%\',
            \'with_front\' => false
        )
        );
    register_post_type( \'work\', $args );
}
add_action( \'init\', \'register_work\' );

// Register tax
function work_tax() {
    register_taxonomy(
        \'filter\',
        \'work\',
        array(
            \'label\' => __( \'Tags\' ),
            \'hierarchical\' => true,
            \'rewrite\' => array(
                \'slug\' => \'filter\',
                \'with_front\' => false
            )
        )
    );
}
add_action( \'init\', \'work_tax\' );

// Replace permalink slug
function custom_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == \'work\' ){
        $terms = wp_get_object_terms( $post->ID, \'filter\' );
        if( $terms ){
            $find = array(\'%filter_1%\',\'%filter_2%\');
            $replace = array($terms[0]->slug,$terms[1]->slug);
            return str_replace($find, $replace, $post_link);
        }
    }
    return $post_link;
}
add_filter( \'post_type_link\', \'custom_permalinks\', 1, 2 );
我重新生成了。htaccess文件,方法是在设置菜单中保存永久链接。

有人知道这样做是否可行吗?

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

此代码生成正确的结构,但找不到帖子(404)

这是因为自定义重写标记(%filter_1%%filter_2%) 在生成的重写规则(在数据库中)中按原样显示。因此,您需要注册标记,以便在WordPress(重新)生成规则时用适当的RegEx(正则表达式)模式替换它们。

您可以使用add_rewrite_tag() 像这样:

function register_work() {
    // Register the custom rewrite tags.
    add_rewrite_tag( \'%filter_1%\', \'([^/]+)\' );
    add_rewrite_tag( \'%filter_2%\', \'([^/]+)\' );

    // ... then register the post type.
}
这应该可以修复错误,但您应该知道,您的帖子类型的重写规则将导致页面(的帖子page 键入)显示主页而不是正确的页面。

因此,您应该只使用一个唯一的重写基,例如。work 如中所示\'slug\' => \'work/%filter_1%/%filter_2%\' 避免与其他重写规则发生冲突,尤其是WordPress中的默认规则。

然而,如果您真的必须使用无重写基,那么有一种方法。

但每次创建或删除filter 您只需访问permalink设置页面,就可以手动刷新重写规则。

Note: 是的,有一种编程方式可以自动刷新重写规则,但手动执行非常简单,所以只需创建/编辑/删除filter 批量输入术语,然后手动刷新重写规则。:)

而且不应该有任何帖子(页面、帖子、CPT)或术语与您的filter 条款。一、 e.如果您有filter slug术语foo, 那你应该no 具有slug的帖子或术语(在其他分类法中)foo.

但我真正的意思是,你可以使用相同的子弹,但不是在所有情况下都要小心。例如,如果work CPT岗位有foo/bar/baz 作为永久链接,则不应该有带有该路径的页面,即带有slug的页面baz 那是一个barfoo 第页。

如果这些对您有好处,那么下面是您可以尝试的代码:

add_filter( \'rewrite_rules_array\', function ( $rules ) {
    $terms = get_terms( [
        \'taxonomy\'   => \'filter\',
        \'hide_empty\' => false,
        \'fields\'     => \'slugs\',
    ] );

    if ( ! is_wp_error( $terms ) ) {
        foreach ( $terms as $slug ) {
            $match = "^{$slug}/(.*?)/([^/]+)(?:/(\\d+)|)/?$";
            $query = \'index.php?post_type=work&work=$matches[2]&name=$matches[2]&page=$matches[3]\';
            $rules[ $match ] = $query;
        }
    }

    return $rules;
} );
And 除此之外:

英寸register_work(), 使用work 作为基础:\'slug\' => \'work/%filter_1%/%filter_2%\',

然后在custom_permalinks() 功能:

// You need to replace this:
$find = array(\'%filter_1%\',\'%filter_2%\');

// with this:
$find = array(\'work/%filter_1%\',\'%filter_2%\');

相关推荐

Filter Custom Taxonomy Posts

我有一个自定义的分类页面,它也有一个向上的滑块。问题是滑块显示来自所有分类法而非当前分类法的随机帖子。是否有办法过滤滑块中的图像,使其仅使用当前分类法?<?php global $taxonomy_location_url, $taxonomy_profile_url; $args = array( \'post_type\' => $taxonomy_profile_url, \'orderby\' => \'rand\', \'meta_que