使用自定义分类法+帖子标题或仅发布帖子标题,删除自定义postype基本子词和前缀永久链接

我想要实现的目标似乎很琐碎, 但尚未找到解决方案:
我希望能够避免使用自定义postype(即文章), 并在永久链接中包含自定义分类法(即site_topic)及其术语(即Blog), 或者如果未设置, 则避免使用它并拥有只是普通标题。
到目前为止, 已经尝试过更改永久链接结构的方法:(它确实可以在仪表板中按需交换链接, 但是访问页面时会产生404, 是的, 每次编辑时都会刷新永久链接)。

function ms_post_types_permalink_edit( $permalink, $post, $leavename ) {if ( in_array( $post-> post_type, [ 'article', 'template' ] ) || 'publish' == $post-> post_status ) { $terms = wp_get_object_terms( $post-> ID, 'site_topic' ); if( $terms ){ return str_replace( '/' . $post-> post_type . '/', '/' . $terms[0]-> slug . '/', $permalink ); } return str_replace( '/' . $post-> post_type . '/', '/', $permalink ); } return str_replace( '/' . $post-> post_type . '/', '/', $permalink ); }add_filter( 'post_type_link', 'ms_post_types_permalink_edit', 10, 3 );

我们想要实现的是一个工作的永久链接结构, 该结构在这两种情况下都适用于这些自定义邮差, 同时保留了其余邮差的常规永久链接结构:
【使用自定义分类法+帖子标题或仅发布帖子标题,删除自定义postype基本子词和前缀永久链接】domain.com/custom-taxonomy-term/custom-post-title
domain.com/post-title
作为奖励, 自定义postype在其注册中具有以下内容:
.... 'rewrite' => [ 'with_front' => false, 'slug' => false, ] ....

我还尝试结合以上内容进行以下操作或同时进行以下操作:
function ms_post_types_rewrite_rule() { add_rewrite_rule('article/([^/]*)/?$', 'index.php?article=$matches[1]', 'top'); add_rewrite_rule('article/([^/]*)/([^/]*)?$', 'index.php?site_topic=$matches[1]& article="$matches[2]', 'top'); }add_action('init', 'ms_post_types_rewrite_rule');


function ms_pre_get_posts( $query ) {if ( ! $query-> is_main_query() ) { return; }if ( 2 != count( $query-> query ) || ! isset( $query-> query['page'] ) ) { return; } if ( ! empty( $query-> query['name'] ) ) { $query-> set( 'post_type', [ 'article' ] ); } }add_action( 'pre_get_posts', 'ms_pre_get_posts' );

#1在活动主题function.php文件中使用以下代码
function remove_ra_slug( $post_link, $post, $leavename ) {$terms = get_the_terms( $post-> ID, 'site_topic' ); if ( !empty( $terms ) ){ // get the first term $term = array_shift( $terms ); if ( 'article' != $post-> post_type || 'publish' != $post-> post_status ) { return $post_link; }$post_link = str_replace( '/' . $post-> post_type . '/', '/' . $terms-> slug . '/', $post_link ); } return $post_link; } add_filter( 'post_type_link', 'remove_ra_slug', 10, 3 );

仅仅去除弹头是不够的。现在, 你将获得404页面, 因为WordPress只希望帖子和页面具有这种行为。你还需要添加以下内容:
function parse_ra_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( 'article' ) ); } } add_action( 'pre_get_posts', 'parse_ra_request' );

经过测试并运作良好

    推荐阅读