防止页面插件干扰自定义POST类型档案固定链接?

时间:2013-08-05 作者:Ben Miller - Remember Monica

在我的插件中,我创建了一个自定义的帖子类型,它有一个归档文件,并使用rewrite参数选择一个slug:

$args = array (
    \'public\' => true,
    \'has_archive\' => true,
    \'rewrite\' => array(\'slug\' => \'lessons\', \'with_front\' => false)
);
register_post_type (\'my_plugin_lesson\', $args);
有了这段代码,我可以在example.com/lessons/.

然而,我也可以创建一个标题为“课程”的页面,WordPress会将其命名为slug“课程”。此页面的“管理”面板上的“查看页面”链接将为example.com/lessons/, 但该页面无法访问,因为WordPress显示了我自定义帖子类型的存档。

有没有办法防止WordPress为干扰我自定义帖子类型的slug的页面或帖子选择slug?

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

我知道你已经找到了解决方案,因为你发现这个问题已经被问到并得到了回答。。。

然而,一旦这个问题是悬赏问题,并且不能作为重复问题关闭,我想对此做出解释,并在已经发布的答案上添加(一点)附加值。

在这些答案中做了什么one 通过@RachelCarden 而在这里发布的@matthew-boynes) 是您所需要的,但它是硬编码的,即您必须手动在过滤器功能中添加cpt存档段塞。

我想要得到的是一个以同样方式工作的过滤器,但它是友好的,类似于:

add_filter(\'wp_unique_post_slug_is_bad_hierarchical_slug\', \'prevent_slug_override\', 99, 3);
add_filter(\'wp_unique_post_slug_is_bad_flat_slug\', \'prevent_slug_override\', 99, 3);

function prevent_slug_override( $now, $slug, $type ) {
  if ( in_array($type, array(\'nav_menu_item\', \'revision\', \'attachment\') ) )
    return $now;
  $cpts = get_post_types( array(\'_builtin\' => false), \'objects\' );
  $check_bad = array();
  foreach ( $cpts as $cpt => $object ) {
    if ( $object->has_archive ) {
      if (
        ! empty($object->rewrite) && isset($object->rewrite[\'slug\']) &&
        ! empty($object->rewrite[\'slug\']) && ($object->rewrite[\'slug\'] != $cpt)
      ) {
        $check_bad[] = $object->rewrite[\'slug\'];
      } else {
        $check_bad[] = is_string($object->has_archive) ? $object->has_archive : $cpt;
      }
    }
  }
  if ( in_array($slug, $check_bad) ) return true;
  return $now;
} 

SO网友:Matthew Boynes

我相信你可以利用wp_unique_post_slug 以防止这种冲突。尝试以下操作

function wpse_109072_is_slug_conflict( $false, $slug, $post_type ) {
    return ( \'page\' == $post_type && \'lessons\' == $slug );
}
add_filter( \'wp_unique_post_slug_is_bad_hierarchical_slug\', \'wpse_109072_is_slug_conflict\', 10, 3 );
add_filter( \'wp_unique_post_slug_is_bad_flat_slug\', \'wpse_109072_is_slug_conflict\', 10, 3 );

结束

相关推荐

Permalinks not working

我知道,问了无数次,回答了无数次。我一生都找不到我的错误。正在尝试将永久链接设置为使用post name,/%postname%/尝试访问主页以外的任何其他地方都会产生404错误。默认的永久链接设置工作正常。任何帮助都将不胜感激。.htaccess在web根目录中 # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\\.ph