从自定义帖子类型帖子URL中删除插件

时间:2015-09-28 作者:Ben Racicot

似乎所有的web资源都基于删除自定义post类型slug ie的主题

yourdomain.com/CPT-SLUG/post-name 
现在是非常过时的解决方案,通常引用WP 3.5版之前的安装。常见的做法是:

\'rewrite\'   => array( \'slug\' => false, \'with_front\' => false ),  
在您的register_post_type 作用这已不再有效,并且具有误导性。所以我在2020年第四季度询问社区。。。

What are the modern and efficient ways to remove the Post Type Slug from a Custom Post Type post\'s URL from within the rewrite argument or anywhere else?

更新:似乎有几种方法可以迫使它与regex一起工作。特别是Jan Beck的回答是,你应该始终愿意监控内容的创建,以确保没有创建冲突的页面/帖子名称。。。。然而,我相信这是WP核心的一个主要弱点,应该为我们处理。在创建CPT或permalinks的高级选项集时,都可以作为选项/挂钩。请支持轨道票。

脚注:请通过观看/宣传来支持此trac票证:https://core.trac.wordpress.org/ticket/34136#ticket

14 个回复
最合适的回答,由SO网友:Nate Allen 整理而成

下面的代码可以工作,但您只需记住,如果自定义帖子类型的slug与页面或帖子的slug相同,则很容易发生冲突。。。

首先,我们将从permalink中移除段塞:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( \'events\' != $post->post_type || \'publish\' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link );

    return $post_link;
}
add_filter( \'post_type_link\', \'na_remove_slug\', 10, 3 );
仅仅去掉鼻涕虫是不够的。现在,您将得到404页,因为WordPress只希望帖子和页面以这种方式运行。您还需要添加以下内容:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[\'page\'] ) ) {
        return;
    }

    if ( ! empty( $query->query[\'name\'] ) ) {
        $query->set( \'post_type\', array( \'post\', \'events\', \'page\' ) );
    }
}
add_action( \'pre_get_posts\', \'na_parse_request\' );
只要将“事件”更改为您的自定义帖子类型,您就可以开始了。您可能需要刷新永久链接。

SO网友:Mayank Dudakiya

将以下代码写入分类法注册。

\'rewrite\' => [
  \'slug\' => \'/\',
  \'with_front\' => false
]
更改代码后必须做的最重要的事情

更改自定义帖子类型分类法文档后,请尝试转到Settings > Permalinksre-save your settings, 否则您将得到404页未找到。

SO网友:Matt Keys

综观这里的答案,我认为有一个更好的解决方案的空间,它结合了我在上面学到的一些东西,并添加了自动检测和防止重复的post段塞。

注意:在下面的示例中,请确保为自己的CPT名称更改“custom\\u post\\u type”。出现的情况很多,“查找/替换”是一种简单的方法,可以捕获所有这些情况。所有这些代码都可以放入您的函数中。php或插件

Step 1: 注册帖子时,通过将“重写”设置为“false”,禁用自定义帖子类型的重写:

register_post_type( \'custom_post_type\',
    array(
        \'rewrite\' => false
    )
);
Step 2: 手动将自定义重写添加到WordPress重写的底部

function custom_post_type_rewrites() {
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/?$\', \'index.php?attachment=$matches[1]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/trackback/?$\', \'index.php?attachment=$matches[1]&tb=1\', \'bottom\');
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\', \'index.php?attachment=$matches[1]&feed=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\', \'index.php?attachment=$matches[1]&feed=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\', \'index.php?attachment=$matches[1]&cpage=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/attachment/([^/]+)/embed/?$\', \'index.php?attachment=$matches[1]&embed=true\', \'bottom\');
    add_rewrite_rule( \'([^/]+)/embed/?$\', \'index.php?custom_post_type=$matches[1]&embed=true\', \'bottom\');
    add_rewrite_rule( \'([^/]+)/trackback/?$\', \'index.php?custom_post_type=$matches[1]&tb=1\', \'bottom\');
    add_rewrite_rule( \'([^/]+)/page/?([0-9]{1,})/?$\', \'index.php?custom_post_type=$matches[1]&paged=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'([^/]+)/comment-page-([0-9]{1,})/?$\', \'index.php?custom_post_type=$matches[1]&cpage=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'([^/]+)(?:/([0-9]+))?/?$\', \'index.php?custom_post_type=$matches[1]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/?$\', \'index.php?attachment=$matches[1]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/trackback/?$\', \'index.php?attachment=$matches[1]&tb=1\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\', \'index.php?attachment=$matches[1]&feed=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\', \'index.php?attachment=$matches[1]&feed=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\', \'index.php?attachment=$matches[1]&cpage=$matches[2]\', \'bottom\');
    add_rewrite_rule( \'[^/]+/([^/]+)/embed/?$\', \'index.php?attachment=$matches[1]&embed=true\', \'bottom\');
}
add_action( \'init\', \'custom_post_type_rewrites\' );
注意:根据需要,您可能需要修改上述重写(禁用trackback?feeds?等)。这些表示如果没有在步骤1中禁用重写,将生成的“默认”重写类型

Step 3: 再次将永久链接到自定义帖子类型“pretty”

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && \'custom_post_type\' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( \'post_type_link\', \'custom_post_type_permalinks\', 10, 3 );
注意:如果您不担心您的用户在另一种帖子类型中创建冲突(重复)的帖子,那么您可以到此为止,这将导致在请求页面时,只有其中一人可以加载

Step 4: 防止重复post段塞

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        \'post\',
        \'page\',
        \'custom_post_type\'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( \'custom_post_type\' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, \'OBJECT\', \'post\' );
        $page_match = get_page_by_path( $slug, \'OBJECT\', \'page\' );

        if ( $post_match || $page_match ) {
            $slug .= \'-duplicate\';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, \'OBJECT\', \'custom_post_type\' );

        if ( $custom_post_type_match ) {
            $slug .= \'-duplicate\';
        }
    }

    return $slug;
}
add_filter( \'wp_unique_post_slug\', \'prevent_slug_duplicates\', 10, 6 );
注意:这将在任何重复段塞的末尾附加字符串“-duplicate”。如果在实现此解决方案之前已经存在重复的段塞,则此代码无法防止重复的段塞。确保首先检查重复项

我很想听听其他人的反馈,看看这对他们是否也有效。

SO网友:Jan Beck

不久前,我试图弄明白这一点,我所知道的简短答案是no. 至少不是从重写参数内部。

如果您查看register_post_type 在里面wp-includes/post.php line 1454:

add_permastruct( $post_type, "{$args->rewrite[\'slug\']}/%$post_type%", $permastruct_args );
你可以看到它的前缀$args->rewrite[\'slug\']%$post_type% 重写标记。有人可能会想,“让我们把子弹null 然后“直到你看了几行:

if ( empty( $args->rewrite[\'slug\'] ) )
    $args->rewrite[\'slug\'] = $post_type;
您可以看到,函数总是要求slug值不是空的,否则使用post类型。

SO网友:squarecandy

插件综述(Plugin-Roundup)

现在快到2020年了,这些答案中有很多都不起作用。以下是我自己对当前选项的总结:

  • Matt Keys answer 如果您想要自定义代码解决方案,那么它似乎是唯一正确的解决方案。我发现没有一个插件可以完成这里列出的所有事情,尤其是重复检查。如果有人想采用这种方法,那么这种方法对于插件来说似乎是一个很好的机会
  • Permalink Manager Lite<我尝试过的免费插件中最好的
  • 提供对所有页面/帖子/CPT完整永久链接结构的完全控制,并允许它们保持相同。GUI是迄今为止功能最丰富的还允许对每篇文章进行完全覆盖,并允许您查看原始/默认值,并在需要时重置为默认值支持多站点not 检查帖子类型之间是否存在重复,这很令人遗憾。如果页面和CPT具有相同的URL,则页面将加载,CPT将无法访问。没有警告或错误,您只需自己手动检查重复项
  • Custom Permalinks<免费版做了很多事情。分类permalinks和premium支持似乎是pro版本中唯一保留的内容full 任何单独页面/帖子/CPT的永久链接
  • 支持多站点not 允许您更改默认结构,以便您的自定义帖子类型仍然是示例。com/cpt slug/post标题,但您可以单独更改它们not 检查帖子类型之间是否存在重复,这很令人遗憾
  • Custom Post Type Permalinks<允许非开发人员用户更改已经很容易更改的内容register_post_typenot 允许您更改CPT base slug-仅更改之后的部分-对于开发人员和本问题而言,这是非常无用的
  • remove base slug... - 已经死了好几年了。。。请勿使用
  • SO网友:Jan Beck

    作为回应my previous answer:您当然可以设置rewrite 参数到false 注册新的帖子类型时,自己处理重写规则

    <?php
    function wpsx203951_custom_init() {
    
        $post_type = \'event\';
        $args = (object) array(
            \'public\'      => true,
            \'label\'       => \'Events\',
            \'rewrite\'     => false, // always set this to false
            \'has_archive\' => true
        );
        register_post_type( $post_type, $args );
    
        // these are your actual rewrite arguments
        $args->rewrite = array(
            \'slug\' => \'calendar\'
        );
    
        // everything what follows is from the register_post_type function
        if ( is_admin() || \'\' != get_option( \'permalink_structure\' ) ) {
    
            if ( ! is_array( $args->rewrite ) )
                $args->rewrite = array();
            if ( empty( $args->rewrite[\'slug\'] ) )
                $args->rewrite[\'slug\'] = $post_type;
            if ( ! isset( $args->rewrite[\'with_front\'] ) )
                $args->rewrite[\'with_front\'] = true;
            if ( ! isset( $args->rewrite[\'pages\'] ) )
                $args->rewrite[\'pages\'] = true;
            if ( ! isset( $args->rewrite[\'feeds\'] ) || ! $args->has_archive )
                $args->rewrite[\'feeds\'] = (bool) $args->has_archive;
            if ( ! isset( $args->rewrite[\'ep_mask\'] ) ) {
                if ( isset( $args->permalink_epmask ) )
                    $args->rewrite[\'ep_mask\'] = $args->permalink_epmask;
                else
                    $args->rewrite[\'ep_mask\'] = EP_PERMALINK;
            }
    
            if ( $args->hierarchical )
                add_rewrite_tag( "%$post_type%", \'(.+?)\', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
            else
                add_rewrite_tag( "%$post_type%", \'([^/]+)\', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );
    
            if ( $args->has_archive ) {
                $archive_slug = $args->has_archive === true ? $args->rewrite[\'slug\'] : $args->has_archive;
                if ( $args->rewrite[\'with_front\'] )
                    $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
                else
                    $archive_slug = $wp_rewrite->root . $archive_slug;
    
                add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", \'top\' );
                if ( $args->rewrite[\'feeds\'] && $wp_rewrite->feeds ) {
                    $feeds = \'(\' . trim( implode( \'|\', $wp_rewrite->feeds ) ) . \')\';
                    add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . \'&feed=$matches[1]\', \'top\' );
                    add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . \'&feed=$matches[1]\', \'top\' );
                }
                if ( $args->rewrite[\'pages\'] )
                    add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . \'&paged=$matches[1]\', \'top\' );
            }
    
            $permastruct_args = $args->rewrite;
            $permastruct_args[\'feed\'] = $permastruct_args[\'feeds\'];
            add_permastruct( $post_type, "%$post_type%", $permastruct_args );
        }
    }
    add_action( \'init\', \'wpsx203951_custom_init\' );
    
    您可以看到add_permastruct 现在的通话不再包括slug。我测试了两个场景:

    当我创建了一个带有slug“calendar”的页面时,该页面被post-type归档文件覆盖,该文件也使用了“calendar”slug

    enter image description here

    <当我创建一个带有slug“my event”的页面和一个带有slug“my event”的事件(CPT)时,会显示自定义帖子类型

    enter image description here

    <任何其他页面也不起作用。如果你看上面的图片,就会明白为什么:自定义帖子类型规则将始终与页面段塞匹配。因为WordPress无法识别它是一个不存在的页面还是一个自定义帖子类型,所以它将返回404。这就是为什么您需要一个slug来识别页面或CPT。一种可能的解决方案是拦截错误并查找可能存在的页面similar to this answer.

    SO网友:arafat

    即使到处看看,我也找不到一个合适的解决方案来从永久链接中删除CPT slug,这个解决方案实际上是可行的,并且与WordPress解析请求的方式一致。看起来,其他所有寻求相同解决方案的人都和我在同一条船上。

    事实证明,这实际上是一个由两部分组成的解决方案。

    从permalinks中删除CPT slug指导WordPress如何从新的permalinks中查找帖子第一部分非常简单,许多现有答案已经正确无误。它看起来是这样的:

    // remove cpt slug from permalinks
    function remove_cpt_slug( $post_link, $post, $leavename ) {
    
        if ( $post->post_type != \'custom_post_type\' ) {
            return $post_link;
        } else {
            $post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link );
            return $post_link;
        }
    }
    add_filter( \'post_type_link\', \'remove_cpt_slug\', 10, 3 );
    
    现在,第二部分是事情变得丑陋的地方。解决第一部分后,您的CPT permalinks不再有CPT段塞。但是,现在的问题是WordPress不知道如何从这些新的永久链接中找到你的帖子,因为它只知道CPT永久链接有CPT slug。因此,如果permalink中没有CPT slug,它就无法找到您的帖子。这就是为什么当您在此时请求帖子时,会抛出404 not found错误。

    所以,你现在需要做的就是指导WordPress如何使用新的永久链接找到你的帖子。但这是现有答案做得不好的部分。让我们看看其中的一些答案,例如:

    下面的函数工作得很好,但只有当permalink结构设置为Post name时,它才会工作。

    function parse_request_remove_cpt_slug( $query ) {
    
        if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[\'page\'] ) ) {
            return;
        }
    
        if ( ! empty( $query->query[\'name\'] ) ) {
            global $wpdb;
            $cpt = $wpdb->get_var("SELECT post_type FROM $wpdb->posts WHERE post_name = \'{$query->query[\'name\']}\'");
    
            // Add CPT to the list of post types WP will include when it queries based on the post name.
            $query->set( \'post_type\', $cpt );
        }
    }
    add_action( \'pre_get_posts\', \'parse_request_remove_cpt_slug\' );
    
    无论permalink结构如何,下面的函数都适用于自定义帖子类型,但它会在所有其他帖子类型上引发错误。

    function rewrite_rule_remove_cpt_slug() {
    
        add_rewrite_rule(
            \'(.?.+?)(?:/([0-9]+))?/?$\',
            \'index.php?custom_post_type=$matches[1]/$matches[2]&post_type=custom_post_type\',
            \'bottom\'
        );
    }
    add_action( \'init\', \'rewrite_rule_remove_cpt_slug\', 1, 1 );
    
    还有一个答案应该是作为一个独立的解决方案工作,但最终导致的问题比解决方案更多,比如在您的CPT帖子以及其他帖子中抛出错误。这需要修改CPT注册中的重写参数,如下所示:

    \'rewrite\' => array( \'slug\' => \'/\', \'with_front\' => false )
    
    到目前为止,我找到的所有现有答案都与上述答案类似。要么部分工作,要么不再工作。这可能是因为WordPress没有提供一种从自定义post类型的永久链接中删除CPT slug的简化方法,因此这些答案要么基于考虑特定场景,要么基于一种黑客方式。

    答案

    这是我在尝试创建适用于大多数(如果不是所有)场景的解决方案时想到的。这将正确地从CPT permalinks中删除CPT slug,并指导WordPress从这些新的permalinks中查找CPT帖子。它不会重写数据库中的规则,因此不需要重新保存永久链接结构。此外,此解决方案与WordPress实际解析请求以从永久链接中查找帖子的方式一致,这有助于使其成为一个更可接受的解决方案。

    Make sure to replace custom_post_type with your own custom post type name. It appears once in every function so two occurrences in total.

    // remove cpt slug from permalinks
    function remove_cpt_slug( $post_link, $post, $leavename ) {
    
        if ( $post->post_type != \'custom_post_type\' ) {
            return $post_link;
        } else {
            $post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link );
            return $post_link;
        }
    }
    add_filter( \'post_type_link\', \'remove_cpt_slug\', 10, 3 );
    
    
    // instruct wordpress on how to find posts from the new permalinks
    function parse_request_remove_cpt_slug( $query_vars ) {
    
        // return if admin dashboard 
        if ( is_admin() ) {
            return $query_vars;
        }
    
        // return if pretty permalink isn\'t enabled
        if ( ! get_option( \'permalink_structure\' ) ) {
            return $query_vars;
        }
    
        $cpt = \'custom_post_type\';
    
        // store post slug value to a variable
        if ( isset( $query_vars[\'pagename\'] ) ) {
            $slug = $query_vars[\'pagename\'];
        } elseif ( isset( $query_vars[\'name\'] ) ) {
            $slug = $query_vars[\'name\'];
        } else {
            global $wp;
            
            $path = $wp->request;
    
            // use url path as slug
            if ( $path && strpos( $path, \'/\' ) === false ) {
                $slug = $path;
            } else {
                $slug = false;
            }
        }
    
        if ( $slug ) {
            $post_match = get_page_by_path( $slug, \'OBJECT\', $cpt );
    
            if ( ! is_admin() && $post_match ) {
    
                // remove any 404 not found error element from the query_vars array because a post match already exists in cpt
                if ( isset( $query_vars[\'error\'] ) && $query_vars[\'error\'] == 404 ) {
                    unset( $query_vars[\'error\'] );
                }
    
                // remove unnecessary elements from the original query_vars array
                unset( $query_vars[\'pagename\'] );
        
                // add necessary elements in the the query_vars array
                $query_vars[\'post_type\'] = $cpt;
                $query_vars[\'name\'] = $slug;
                $query_vars[$cpt] = $slug; // this constructs the "cpt=>post_slug" element
            }
        }
    
        return $query_vars;
    }
    add_filter( \'request\', "parse_request_remove_cpt_slug" , 1, 1 );
    

    Considerations:

    <这种解决方案有意将普通的permalink结构排除在其范围之外,因为它不是一种漂亮的permalink结构。因此,它将适用于除平原以外的所有永久性构造。

    由于WordPress不会自动阻止在不同的帖子类型之间创建重复的slug,因此在删除CPT slug后,您可能会发现访问具有相同帖子slug的帖子时出现问题,因为在CPT永久链接中失去了唯一性。这段代码不包含任何防止这种行为的功能,因此您可能希望找到一个单独的解决方案来解决这个问题。

    如果有重复的permalink,此代码将优先考虑您的CPT,从而在需要时在您的CPT中显示帖子。

    SO网友:Max Kondrachuk

    我们可以对上述功能进行一些更改:

    function na_parse_request( $query ) {
    
    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[\'page\'] ) ) {
        return;
    }
    
    if ( ! empty( $query->query[\'name\'] ) ) {
        $query->set( \'post_type\', array( \'post\', \'events\', \'page\' ) );
    }
    }
    
    收件人:

    function na_parse_request( $query ) {
    
    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[\'page\'] ) ) {
        return;
    }
    
    if ( ! empty( $query->query[\'name\'] ) ) {
    
        global $wpdb;
        $pt = $wpdb->get_var(
            "SELECT post_type FROM `{$wpdb->posts}` " .
            "WHERE post_name = \'{$query->query[\'name\']}\'"
        );
        $query->set( \'post_type\', $pt );
    }
    }
    
    以设置右post\\U类型值。

    SO网友:Malki Mohamed

    This worked for me: \'rewrite\' => array(\'slug\' => \'/\')

    SO网友:Moe Loubani

    对于任何一个像我这样在儿童帖子上遇到麻烦的人来说,我发现最好的方法就是添加自己的重写规则。

    我遇到的主要问题是,WordPress对2级(子帖子)页面重定向的处理方式与对3级(子帖子的子帖子)页面重定向的处理方式略有不同。

    这意味着当我有/post-type/post-name/post-child/I可以使用/post-name/post-child时,它会将我重定向到前面有post-type的位置,但如果我有post-type/post-name/post-child/post-孙子,那么我就不能使用post-name/post-child/post-孙子。

    查看一下重写规则,它看起来与第一级和第二级的pagename以外的内容相匹配(我认为第二级与附件相匹配),然后在那里执行一些操作,将您重定向到正确的帖子。在三个层次上,它不起作用。

    您需要做的第一件事就是从子级中删除帖子类型链接。如果你看看内特·艾伦(Nate Allen)上面的回答,这种逻辑应该发生在这里:

    $post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link );
    
    我自己,为了找到正确的永久链接,我混合使用了不同的条件来检查帖子是否有孩子等等。这一部分不太复杂,你可以在其他地方找到这样做的例子。

    然而,下一步就是改变给定答案的地方。我没有在主查询中添加内容(这对自定义帖子及其子项有效,但对其他子项无效),而是在WordPress规则的底部添加了一个重写,这样,如果pagename没有签出,并且它即将遇到404,它将进行最后一次检查,以查看自定义帖子类型中的页面是否具有相同的名称,否则它将抛出404。

    这里是我使用的重写规则,假设“event”是您的CPT的名称

    function rewrite_rules_for_removing_post_type_slug()
    {
        add_rewrite_rule(
            \'(.?.+?)(?:/([0-9]+))?/?$\',
            \'index.php?event=$matches[1]/$matches[2]&post_type=event\',
            \'bottom\'
        );
    }
    
    add_action(\'init\', \'rewrite_rules_for_removing_post_type_slug\', 1, 1);
    
    希望这对其他人有所帮助,我找不到任何其他与child of child帖子有关的内容,也没有从这些帖子中删除slug。

    SO网友:Friedrich Siever

    这里也有同样的问题,wordpress网站上似乎没有任何变动。在我的特殊情况下,对于单个博客帖子,结构/博客/%postname%/需要此解决方案

    https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

    以一堆404结尾

    但是,再加上这种出色的方法,即不使用后端permalink结构来撰写博客文章,它最终会像charme一样工作。https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

    非常感谢。

    SO网友:Tiago

    对我来说,现在工作:

    \'rewrite\' => array( 
    \'slug\' => \'/\',
    \'with_front\' => false
    )
    
    在register\\u post\\u type()函数中插入。

    SO网友:Lucas Bustamante

    这对我来说很有用。代替podcast 使用您的CPT slug:

    add_action(\'init\', function () {
        register_post_type(
            \'podcast\',
            [
                \'rewrite\' => false,
            ]
        );
    });
    
    add_filter(\'post_type_link\', function ($post_link, $post, $leavename) {
        if (isset($post->post_type) && $post->post_type === \'podcast\') {
            $post_link = home_url($post->post_name);
        }
    
        return $post_link;
    }, 10, 3);
    
    add_action(\'init\', function () {
        add_rewrite_rule(\'(.+?)/?$\', \'index.php?podcast=$matches[1]\', \'bottom\');
    });
    

    SO网友:T.Todua

    你不需要那么多硬代码。只需使用轻量级插件:

    它有可定制的选项。

    相关推荐

    get_posts custom field

    这是一个愚蠢的问题,但我找不到合适的方式问谷歌。所以,如果这是一个重复的问题,很抱歉。我提供了一个带有复选框的自定义字段,用户可以检查是否希望此特定帖子进入主页。因此,在我的主页上,我呼吁所有已激活选中的帖子。我正在为自定义帖子类型CV创建自定义字段:function add_custom_post_meta_box() { add_meta_box( \'custom_post_meta_box\', // $id \'Campos Per