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

时间:2017-02-10 07:18:55

标签: php wordpress redirect custom-post-type permalinks

我有2个自定义帖子类型的帖子。视频帖子和城市指南帖子 第一篇帖子(视频帖子)包含网址:104.130.239.132/rick-owens/和第二篇帖子(城市指南帖子)网址:http://104.130.239.132/city-guide/rick-owens/(city-guide是永久链接结构,是自定义帖子类型的名称)。                                                                                因此,每当我们尝试访问第一个网址时,问题就出现了,它显示了第二个网址的模板和内容。第二个网址是最新发布的。我试图通过禁用Yoast Seo插件来解决仍然没有变化,也完成了我的永久链接刷新仍然得到相同的结果。

为第一个网址发布Yoast SEO代码:enter image description here和第二个网址enter image description here的Yoast SEO代码段 任何帮助将不胜感激,谢谢。

增加:

以下是我的CPT代码。

1.视频帖子:

$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.城市指南帖子:

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;
    }

3 个答案:

答案 0 :(得分:2)

使用以下代码更新注册帖子类型代码,如果可能,请使用相同的城市指南帖子类型代码

$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 );

答案 1 :(得分:1)

这个问题很常见,因为两个帖子类型的slug名称相似,将会显示最新的一个。它现在没有反映到帖子类型。我假设你选择了"后名"或永久链接结构中的%postname%。 要解决这个问题,第一个也是最简单的方法是更改​​其中一个帖子的帖子。

另一种方法是通过WordPress的重写类函数从functions.php更改post类型的永久链接结构。为此,您必须查看帖子标题下方的链接。这是因为要找出特定自定义帖子类型的帖子类型的slu ..

我已在本地安装中实现了您提供的代码。现在我有两个自定义的帖子类型,以及两个名字中的帖子" rick owens"哪个slu will将是" 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');

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

正如我已经提到的,您应该知道该特定帖子的编辑页面中的帖子网址。

对于视频自定义帖子类型,帖子网址应如下所示:

www.siteurl.com/rewrite/rick-owens

对于城市指南帖子类型,帖子网址应如下所示:

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

如果我是正确的,同样的链接结构也应该在你的页面中,所以代码应该在我提供的顶部。如果你有不同于我上面提到的链接,那么在我提供的functions.php代码中根据它进行更改。例如, 如果您有视频自定义帖子类型,

www.siteurl.com/video/rick-owens

然后将functions.php代码更改为

$structure   = 'video/%rewrite%';

see img for video url check

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

www.siteurl.com/city_guide/rick-owens

$structure1   = 'city_guide/%rewrite%';

see img for city-guide url check

这是另一个选项,如果在我的项目中发生任何类似的冲突,我通常会这样做。如果你没有得到它,请在这篇文章中提及我。

希望这会奏效。

  

根据您更新的流程更新了答案

请使用此代码将您的帖子类型更新为Wordpress Core功能

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' );

希望此代码对您有用,请删除上面提到的代码,不要忘记更新永久链接。

谢谢

  

注意:一旦放入代码,请不要忘记更新永久链接   的functions.php

答案 2 :(得分:-1)

在你的Wordpress固定链接设置中,将自定义结构设置为/%category%/%postname%/,然后在你的第一篇采访帖子中,注意yoast seo的齿轮标签?你可以把/ rick-owens /作为Canonical URL。