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

前端之家收集整理的这篇文章主要介绍了php – 具有相同slug的自定义帖子使用相同的slug重定向到错误的帖子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有2个自定义帖子类型的帖子.视频帖子和城市指南帖子
第一个帖子(Video Post)包含url: 104.130.239.132/rick-owens/和第二个Post(City-Guide Post)conatins url: http://104.130.239.132/city-guide/rick-owens/(city-guide是永久链接结构,它是自定义帖子类型的名称).
因此,每当我们尝试访问第一个网址时,问题就出现了,它显示了第二个网址的模板和内容.第二个网址是最新发布的.我试图通过禁用Yoast SEO插件解决仍然没有变化,也完成了我的永久链接刷新仍然得到相同的结果.

附加Yoast SEO片段为第一个url帖子:和Yoast SEO片段的第二个url帖子
任何帮助将不胜感激,谢谢.

加成:

这是我的CPT代码.

1.视频帖子:

$labels = array(
'name'                => _x( 'Videos','Post Type General Name','roots' ),'singular_name'       => _x( 'Video','Post Type Singular Name','menu_name'           => __( 'Video Posts','parent_item_colon'   => __( 'Parent Video:','all_items'           => __( 'All Videos','view_item'           => __( 'View Video','add_new_item'        => __( 'Add New Video','add_new'             => __( 'Add New','edit_item'           => __( 'Edit Video','update_item'         => __( 'Update Video','search_items'        => __( 'Search Video','not_found'           => __( 'Not found','not_found_in_trash'  => __( 'Not found in Trash',);
$rewrite = array(
'slug'                => 'rewrite','with_front'          => true,'pages'               => true,'Feeds'               => true,);
$args = array(
'label'               => __( 'video','description'         => __( 'Videos Post Type','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','title','excerpt'],'taxonomies' => array('post_tag')
] );
add_image_size( 'ipad-city-thumb',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;
    }
这个问题非常普遍,因为两个帖子类型的slug名称相似,将显示最新的一个.它现在没有反映到帖子类型.我假设你在永久链接结构中选择了“post-name”或%postname%.
解决这个问题,第一个也是最简单的方法是更改​​其中一个帖子的帖子.

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

我在本地安装中实现了您提供的代码.现在我有2个自定义的帖子类型和你的名字“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');

以上代码适用于我并经过测试,也应该适合您.

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

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

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

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

希望这会奏效.

Updated Answer as from your updated process

请使用此代码将您的帖子类型更新为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' );

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

谢谢

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

猜你在找的PHP相关文章