当前位置: 首页 > 知识库问答 >
问题:

自定义永久链接结构:/%自定义后类型%/%自定义分类%/%后名称%/

康秋月
2023-03-14

我正在尝试创建一个定制的permalink结构,它将允许我完成以下任务。

  1. 我有一个自定义的帖子类型称为"项目"
  2. 我有一个自定义分类法,称为项目类别,分配给CPT项目

我希望我的永久链接结构如下所示:

项目/类别/项目-名称

/%自定义后类型%/%自定义分类%/%后名称%/

创建这样的永久链接结构会如何影响URL或其他页面?是否可以取消定义自定义永久链接结构并将其限制为单个CPT?

谢谢

共有2个答案

端木朝
2023-03-14

由于WordPress在最近几年发生了很大的变化,因此有了一个新的解决方案。

// Used for registering cpt_project custom post type
$post_type_args = array(
  'rewrite' => array(
    'slug' => '/%custom-post-type%/%custom-taxonomy%/%postname%/',
    'with_front' => true
    'walk_dirs' => false
  )
);

%自定义帖子类型%必须与自定义帖子类型%的名称匹配自定义分类法%必须与WordPress自动创建正确重写规则和链接的分类法的名称匹配

用“步行”=

通常,这种dirwalk甚至不需要,因为您只访问结构中的站点或单独的分类站点。

这样,您的重写规则将尽可能精确,并且不需要使用

add_filter( 'rewrite_rules_array', 'so23698827_add_rewrite_rules' );

然后用

add_filter( 'post_type_link', 'so23698827_filter_post_type_link', 10, 2 );

正如在接受的回答中提到的。这节省了内存和执行时间!

希望这能帮助任何人,谁是寻找这个问题与WP版本

邢博学
2023-03-14

你真幸运,我只是为了一个客户项目才这么做的。我在WordPress Stackexchange上使用了这个答案作为指导:

/**
 * Tell WordPress how to interpret our project URL structure
 *
 * @param array $rules Existing rewrite rules
 * @return array
 */
function so23698827_add_rewrite_rules( $rules ) {
  $new = array();
  $new['projects/([^/]+)/(.+)/?$'] = 'index.php?cpt_project=$matches[2]';
  $new['projects/(.+)/?$'] = 'index.php?cpt_project_category=$matches[1]';

  return array_merge( $new, $rules ); // Ensure our rules come first
}
add_filter( 'rewrite_rules_array', 'so23698827_add_rewrite_rules' );

/**
 * Handle the '%project_category%' URL placeholder
 *
 * @param str $link The link to the post
 * @param WP_Post object $post The post object
 * @return str
 */
function so23698827_filter_post_type_link( $link, $post ) {
  if ( $post->post_type == 'cpt_project' ) {
    if ( $cats = get_the_terms( $post->ID, 'cpt_project_category' ) ) {
      $link = str_replace( '%project_category%', current( $cats )->slug, $link );
    }
  }
  return $link;
}
add_filter( 'post_type_link', 'so23698827_filter_post_type_link', 10, 2 );

注册自定义帖子类型和分类时,请务必使用以下设置:

// Used for registering cpt_project custom post type
$post_type_args = array(
  'rewrite' => array(
    'slug' => 'projects/%project_category%',
    'with_front' => true
  )
);

// Some of the args being passed to register_taxonomy() for 'cpt_project_category'
$taxonomy_args = array(
  'rewrite' => array(
    'slug' => 'projects',
    'with_front' => true
  )
);

当然,完成后一定要刷新重写规则。祝你好运!

 类似资料:
  • 结构体(structure,缩写成 struct)有 3 种类型,使用 struct 关键字来创建: 元组结构体,总的来说是根据元组来命名。 C 语言风格的结构体 c_struct。 单元结构体,不带字段,在泛型中很有用。 // 单元结构体 struct Nil; // 元组结构体 struct Pair(i32, f32); // 带有两个字段的结构体 struct Point { x:

  • 我正在使用wordpress和自定义post类型的UI插件和ACF插件。试图通过自定义分类法构建具有多个自定义文章类型提要的“单个”模板。使用这段代码,通过一些变化来找出我做错了什么。 连续得到2段这样的代码 是一个分类字段。上面显示的代码只显示了所有的“产品”帖子。我还尝试使用带有taxonomy slug的文本字段。如果我不使用first if语句(

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。

  • 存在多种方法来重新定义现有类型的行为以及提供新的类型。 重写类型编译 一个常见的需求是强制更改类型的“字符串”版本,即在create table语句或其他SQL函数(如cast)中呈现的版本。例如,应用程序可能希望强制呈现 BINARY 适用于除一个平台外的所有平台 BLOB 待渲染。在本例中,使用现有的泛型类型 LargeBinary ,是大多数用例的首选。但是为了更准确地控制类型,每个方言的编

  • 1. 包含头文件 #import <AdHubSDK/AdHubSDK.h> 2. AdHubCustomView 的创建和初始化 在需要导入广告的ViewController头文件中导入头文件并声明实例以及声明代理 #import <AdHubSDK/AdHubSDK.h> @interface AdHubCustomViewController ()<AdHubCustomViewDele

  • 3.4.2 构建类型 默认情况下,Android plugin 会自动的设置工程,构建 release 和 debug 两个版本。 他们主要的差异主要在于是否可以在设备上调试应用以及APK如何签名。 debug 版本会被使用已知的名称/密码自动生成的密钥/证书签名。release 版本在构建过程中不会被签名,需要构建后再签名。 这些配置可以通过一个叫 BuildType 配置。默认情况下,已经创建