自定义帖子类型 Slug 冲突

Posted

技术标签:

【中文标题】自定义帖子类型 Slug 冲突【英文标题】:Custom Post Type Slug *** 【发布时间】:2018-11-23 14:19:06 【问题描述】:

我有多个带有自定义分类法的自定义帖子类型。尽管有不同的父母,但我还是发生了冲突。

这是我的网址结构: /work/%client_name%/%project_name%

我有一个客户端 (client1) 和一个项目 (some-cool-project-name) 会生成这个 slug:“/work/client1/some-cool-project-name”。

当我在不同的父(客户端)下创建新帖子并为帖子提供相同的名称(和 slug)时,wordpress 会将 -2 附加到 slug:“/work/client2/some-cool-project-name -2"

自定义帖子类型为:

// Custom taxonomies.
function custom_taxonomies() 
    $args = array(
        'label' => __( 'Work', '' ),
        'labels' => array(
            'name' => __( 'Work', '' ),
            'singular_name' => __( 'Work', '' ),
        ),
        'description' => '',
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_rest' => false,
        'rest_base' => '',
        'has_archive' => true,
        'show_in_menu' => true,
        'exclude_from_search' => false,
        'capability_type' => 'post',
        'map_meta_cap' => true,
        'hierarchical' => true,
        'rewrite' => array( 'slug' => 'work/%client_name%', 'with_front' => true ),
        'query_var' => true,
        'menu_icon' => 'dashicons-hammer',
        'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'page-attributes' ),
        'taxonomies' => array( 'client_name' ),
    );
    register_post_type( 'work', $args );

    $args = array(
        'label' => __( 'Clients', '' ),
        'labels' => array(
            'name' => __( 'Clients', '' ),
            'singular_name' => __( 'Client', '' ),
        ),
        'public' => true,
        'hierarchical' => false,
        'label' => 'Clients',
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'work/client_name', 'with_front' => false, ),
        'show_admin_column' => false,
        'show_in_rest' => false,
        'rest_base' => '',
        'show_in_quick_edit' => false,
    );
    register_taxonomy( 'client_name', array( 'work' ), $args );

add_action( 'init', 'custom_taxonomies' );

我的永久链接重写:

// Replace URL with proper taxonomy structure.
function permalink_rewrites( $link, $post ) 
    if ( $post->post_status !== 'publish' || $post->post_type != 'work' ) 
        return $link;
    

    if ( $post->post_type == 'work' ) 
        $type = '%client_name%/';
        $filters = get_the_terms( $post->ID, 'client_name' );
        $slug = $filters[0]->slug . '/';
    

    if ( isset( $slug ) ) 
        $link = str_replace( $type, $slug, $link );
    

    return $link;

add_filter( 'post_type_link', 'permalink_rewrites', 10, 2 );

有什么建议可以解决这个问题吗?

谢谢。

【问题讨论】:

在 wordpress 中,任何帖子、分类、自定义帖子类型、页面等都必须有唯一的 slug,wordpress 绝不允许创建页面并使用相同的 slug 发布。 【参考方案1】:

不幸的是,WordPress 并不是这样设计的。为什么即使在不同的类别中,这对于 2 个帖子/CPT 也不起作用,部分原因是 当一个帖子/CPT 在两个类别中时会发生什么?您必须开始获得一些令人讨厌的重写规则和涉及的 redirect_canonical() 函数 - 此时您只是 要求 404 错误退出 wazoo。

幸运的是,您可以做一些事情,而不是依赖具有相同 slug 的分类法和 CPT。您可以改为删除其中的分类部分并使用自定义帖子类型的分层格式。

之所以可行,部分原因是您不能将多个父级分配给一个帖子/CPT,因此不会发生永久结构冲突。

创建一个名为Client 1 的新“工作”和一个名为Client 2 的第二个“工作”。

现在,创建了这些“父作品”后,您可以创建名为Cool Project 的第三个“作品”并将父级设置为Client 1,然后创建第四个名为Cool Project 并将父级设置为@ 987654335@.

这将为您提供以下永久链接结构:

https://example.com/work/client-1/cool-project
https://example.com/work/client-2/cool-project

您现在可以在这里看到它的实际效果:

https://xhynk.com/content-mask/policies/rewrite-parent-a/rewrite-child/ https://xhynk.com/content-mask/policies/rewrite-parent-b/rewrite-child/

这些都是按照我提到的方式设置的:

这样做的缺点是,如果您使用 /work/client-name 页面显示任何内容,您现在必须设置 Post Type Template(自 WP 4.7.0 起可用)来实现您拥有的功能而是使用存档模板。

但是它避免了重定向和重写规则的需要。

这是永久链接结构的屏幕截图:

以下是 CPT 概览管理页面的屏幕截图:

【讨论】:

感谢您的回复@Xhynk。您能否详细说明“删除其中的分类部分并使用自定义帖子类型的分层格式”?我可以看到这是如何工作的。但是好像太丑了。 :(这是唯一的方法吗? 当然 - 现在您依靠分类法 (client_name) 获取永久链接。所以你有example.com/client-1/project-1。为了在客户端 1 和 2 上都有带有“cool-project”的“Cool Project”,您不能在永久链接结构中使用类似的分类法。我不会说它是,因为example.com/parent/child 是一个非常常见的命名约定,即使它不是您想要的example.com/taxonomy/post。您为了拥有相同的帖子名称和 slug,您不能依赖固定链接的分类,而需要使用父帖子。 “最丑陋”的部分是您需要将“客户端 1”和“客户端 2”创建为“项目”,但我认为它仍然有一些相似之处。不幸的是,WordPress 的设计并不是围绕在多个地方拥有相同的帖子 slug 感谢您的解释。 @Xhynk

以上是关于自定义帖子类型 Slug 冲突的主要内容,如果未能解决你的问题,请参考以下文章

没有自定义帖子类型 slug 的 WordPress slug

带有自定义 slug 的 wordpress 自定义帖子类型并获取变量

自定义帖子类型 Slug 重写问题

在函数文件中更改自定义帖子类型 slug

Wordpress - 如何通过 slug 获取自定义帖子类型?

如何根据语言重写自定义帖子类型 slug?