具有相同 slug 的自定义帖子重定向到具有相同 slug 的错误 post

Custom Posts with same slug Redirecting to wrong post with same slug

我有 2 个自定义 Post 类型 posts.The 视频 Post 和城市指南 Post 第一个 Post(视频 Post)包含 url:104.130.239.132/rick-owens/ and the second Post(City-Guide Post) conatins url:http://104.130.239.132/city-guide/rick-owens/(城市指南是永久链接结构,是自定义 post 类型的名称)。 因此,每当我们尝试访问第一个 url 时,问题就会出现在这里,它显示第二个 url.The 的模板和内容 第二个 url 是最新的 published.I 我自己尝试通过禁用来解决Yoast Seo 插件仍然没有变化,并且刷新了我的永久链接仍然得到了相同的结果。

首先附上 Yoast SEO 片段 url post: and the Yoast SEO snippet of second url post 任何帮助将不胜感激,谢谢。

加法:

这是我的 CPT 代码。

1.Video Posts :

$labels = array(
'name'                => _x( 'Videos', 'Post Type General Name', 'roots' ),
'singular_name'       => _x( 'Video', 'Post Type Singular Name', 'roots' ),
'menu_name'           => __( 'Video Posts', 'roots' ),
'parent_item_colon'   => __( 'Parent Video:', 'roots' ),
'all_items'           => __( 'All Videos', 'roots' ),
'view_item'           => __( 'View Video', 'roots' ),
'add_new_item'        => __( 'Add New Video', 'roots' ),
'add_new'             => __( 'Add New', 'roots' ),
'edit_item'           => __( 'Edit Video', 'roots' ),
'update_item'         => __( 'Update Video', 'roots' ),
'search_items'        => __( 'Search Video', 'roots' ),
'not_found'           => __( 'Not found', 'roots' ),
'not_found_in_trash'  => __( 'Not found in Trash', 'roots' ),
);
$rewrite = array(
'slug'                => 'rewrite',
'with_front'          => true,
'pages'               => true,
'feeds'               => true,
);
$args = array(
'label'               => __( 'video', 'roots' ),
'description'         => __( 'Videos Post Type', 'roots' ),
'labels'              => $labels,
'supports'            => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'trackbacks', 'revisions', 'custom-fields', ),
'taxonomies'          => array( 'category', 'post_tag' ),
'hierarchical'        => false,
'public'              => true,
'show_ui'             => true,
'show_in_menu'        => true,
'show_in_nav_menus'   => true,
'show_in_admin_bar'   => true,
'menu_position'       => 5,
'can_export'          => true,
'has_archive'         => true,
'exclude_from_search' => false,
'publicly_queryable'  => true,
'rewrite'       => $rewrite,
'capability_type'     => 'post',
'yarpp_support'    => TRUE
);
register_post_type( 'video', $args );

2.City 指南 Posts :

function register_post_types(){
register_post_type( 'city-guide', [
'has_archive' => TRUE,
'hierarchical' => TRUE,
'labels' => [
'name' => 'City Guide'
],
'public' => TRUE,
'supports' => ['editor', 'page-attributes', 'revisions', 'thumbnail', 'title','custom-fields','excerpt'],
'taxonomies' => array('post_tag')
] );
add_image_size( 'ipad-city-thumb', 650, 650, TRUE );
}
add_action( 'init', __NAMESPACE__.'\register_post_types', 20 );

我的代码中有这个

remove /rewrite/ slug from custom permalinks, to allow domain/slug for all post types
public function post_link_rewrite( $post_link, $post, $leavename ){
      $post_link = str_replace( '/rewrite/', '/', $post_link );

      return $post_link;
    }

这个问题很常见,因为两个post类型的slug名称相似,所以会显示最新的那个。它现在不反映到 post 类型。我假设您在 permalink 结构中选择了 "post-name" 或 %postname%。 要解决此问题,第一个也是最简单的方法是更改​​其中一个 post 的 post slug。

另一种是通过重写WordPress的class函数来改变functions.php类型的post类型的permalink结构。为此,您必须查看 post 标题下方的 link。这是因为要找出特定自定义 post 类型的 post 类型的 slug。

我已经在本地安装中实现了您提供的代码。现在我有 2 个自定义的 post 类型和你的 post 两个名字 "rick owens" 中的 "rick-owens"。首先,显示与上述相同的错误。

我通过在functions.php

中添加这个函数解决了这个问题
function add_rewrite_rules_custom_post(){

global $wp_rewrite;

    $structure   = 'rewrite/%rewrite%';
    $structure1  = 'city-guide/%city-guide%';

    $wp_rewrite->add_permastruct('%rewrite%', $structure, false);
    $wp_rewrite->add_permastruct('%city-guide%', $structure1, false);
}
add_action('init', 'add_rewrite_rules_custom_post');

上面这段代码对我有用并经过测试,应该也对你有用。

正如我已经提到的,您应该从那个特定 post 的编辑页面知道 post url。

对于视频自定义 post 类型,post url 应该是这样的:

www.siteurl.com/rewrite/rick-owens

对于城市指南post类型,posturl应该是这样的:

www.siteurl.com/city-guide/rick-owens

如果我是正确的,相同的 link 结构也应该在您的页面中,所以我在顶部提供的代码应该可以工作。如果您与我上面提到的 link 不同,请在我提供的 functions.php 代码中根据它进行更改。例如, 如果您有视频自定义 post 类型,

www.siteurl.com/video/rick-owens

然后把functions.php代码改成

$structure   = 'video/%rewrite%';

see img for video url check

如果您有城市指南自定义 post 类型,

www.siteurl.com/city_guide/rick-owens

$structure1   = 'city_guide/%rewrite%';

see img for city-guide url check

这是另一种选择,如果在我的项目中发生与您类似的冲突,我通常会这样做。如果你没听懂,请在 post 上提到我。

希望这会奏效。

Updated Answer as from your updated process

请使用此代码将您的 post 类型更新为 Wordpress 核心功能

function update_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', 'page', 'video', 'rewrite' ) );
    }
}
add_action( 'pre_get_posts', 'update_parse_request' );

希望这段代码对你有用,请删除我上面提到的代码,不要忘记更新 permalink。

谢谢

NOTE: Don't forget to update you permalink once you placed the code in functions.php

使用以下代码更新寄存器post类型代码,如果可能,使用相同的城市指南代码post类型

$labels = array(
'name'                => _x( 'Videos', 'Post Type General Name', 'roots' ),
'singular_name'       => _x( 'Video', 'Post Type Singular Name', 'roots' ),
'menu_name'           => __( 'Video Posts', 'roots' ),
'parent_item_colon'   => __( 'Parent Video:', 'roots' ),
'all_items'           => __( 'All Videos', 'roots' ),
'view_item'           => __( 'View Video', 'roots' ),
'add_new_item'        => __( 'Add New Video', 'roots' ),
'add_new'             => __( 'Add New', 'roots' ),
'edit_item'           => __( 'Edit Video', 'roots' ),
'update_item'         => __( 'Update Video', 'roots' ),
'search_items'        => __( 'Search Video', 'roots' ),
'not_found'           => __( 'Not found', 'roots' ),
'not_found_in_trash'  => __( 'Not found in Trash', 'roots' ),
);

$args = array(
'labels'              => $labels,
'supports'            => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments',         'trackbacks', 'revisions', 'custom-fields', ),
'taxonomies'          => array( 'category', 'post_tag' ),
'hierarchical'        => false,
'public'              => true,
'show_ui'             => true,
'show_in_menu'        => true,
'show_in_nav_menus'   => true,
'show_in_admin_bar'   => true,
'menu_position'       => 5,
'can_export'          => true,
'has_archive'         => true,
'exclude_from_search' => false,
'publicly_queryable'  => true,
'query_var' => true,
'rewrite'       => true,
'capability_type'     => 'post',
'yarpp_support'    => TRUE
);
register_post_type( 'video', $args );

在您的 Wordpress 永久链接设置中,放置自定义结构,例如 /%category%/%postname%/,然后在您的第一次面试中 post,注意到 yoast seo 的齿轮标签了吗?你可以把 /rick-owens/ 作为 Canonical URL.