使用 Post 类型模板重写自定义 Post 类型 URL
Custom Post Type URL rewrite with Post Type Template
我正在为一家视频制作公司建立一个 Wordpress 网站。他们为成人和儿童制作视频,因此我在后端拆分 post 以保持结构。所以设置如下:
- 两个自定义 Post 类型命名为 productions_big 和 productions_small
- 一个名为 Productions 的页面,位于主导航中,带有指向
对于大 和对于小 页面
- 一页列出 productions_big 的 post,一页列出 post 的
productions_small。页面名称是 for-big 和 for-small 并且都是 Productions 页面的子页面
- URL 非常适合页面,因为我对相关页面建立了 parent/child 关系。 example.com/productions 导致正确的页面以及 example.com/productions/for-big 和 例子。com/productions/for-small do.
- 由于与此问题无关的原因,模板
CPT 不同,但在某些情况下,template-big 用于 productions_small,反之亦然。这背后没有实际的逻辑,因此决定使用哪个模板是在后端通过 Wordpress 4.7
引入的 Post Type Template 功能完成的
我想要实现的是一个符合逻辑的 URL 结构,例如 example.com/productions/for-big/name-of-adult-production。现在我有 URLs 像 example.com/productions_big/name-of-adult-production 因为 productions_big 是 CPT 的名称。
我熟悉在注册自定义 post 类型时应该传递的 rewrite 参数。我已经按照 Whosebug 上建议的所有方式完成了此操作,但它只是行不通。这是我用来注册 CPT 的代码的摘录:
add_action('init', 'all_custom_post_types');
function all_custom_post_types() {
$types = array(
array('the_type' => 'productions_big',
...
array('the_type' => 'productions_small',
...
);
foreach ($types as $type) {
$the_type = $type['the_type'];
...
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capabilities' => array(
...),
'rewrite' => array('has_archive' => false, 'slug' => 'bla', 'with_front' => false),
'has_archive' => false,
'map_meta_cap' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title','editor','thumbnail', 'taxonomies'),
'taxonomies' => array( 'category' )
);
register_post_type($the_type, $args);
}
}
如你所见,我尝试了 'rewrite' => array('slug' => 'bla') 因为我想知道它是否当我写 'rewrite' => array('slug' => 'productions/for-big')
时,因为页面名称冲突而无法工作
但是无论我给 slug 什么值,它总是将我重定向到 index.php.
我认为它不起作用的原因是我分配 post 模板的方式造成的(记住:作为后端的 post 属性,而不是专用的 single-xxx.php 文件)但我无法在任何地方找到解决方案。所有寻求解决方案的人 post 都在用老式的 单一 name_of_cpt.php 方式分配模板(这对我来说是不可能的)。
旁注:最终目标是制造子弹 "dynamic"。这意味着它会随着后端页面名称的更改而改变。我可能会尝试 this approach,但在此之前我必须解决此处描述的基本问题。
非常感谢任何想法。感谢您阅读到这里。
哦,孩子,看来你必须 post 你的问题才能自己找到答案。在尝试设置另一个 CPT 之后,一切都很顺利。
这让我调查了以前 CPT 的注册情况。正如您在上面看到的,我尝试在 one 函数
中注册我的 CPT
function all_custom_post_types() {
$types = array(
array('the_type' => 'productions_big', ...
array('the_type' => 'productions_small', ...
);
foreach ($types as $type) {
$args = array(...
'rewrite' => array('slug' => 'bla'),...
);
register_post_type($the_type, $args);
}
}
所以最终我的页面的 slug 和自定义 post 类型之间没有冲突,但是将同一个 slug 分配给两种不同的 post 类型会发生冲突。
我正在为一家视频制作公司建立一个 Wordpress 网站。他们为成人和儿童制作视频,因此我在后端拆分 post 以保持结构。所以设置如下:
- 两个自定义 Post 类型命名为 productions_big 和 productions_small
- 一个名为 Productions 的页面,位于主导航中,带有指向 对于大 和对于小 页面
- 一页列出 productions_big 的 post,一页列出 post 的 productions_small。页面名称是 for-big 和 for-small 并且都是 Productions 页面的子页面
- URL 非常适合页面,因为我对相关页面建立了 parent/child 关系。 example.com/productions 导致正确的页面以及 example.com/productions/for-big 和 例子。com/productions/for-small do.
- 由于与此问题无关的原因,模板 CPT 不同,但在某些情况下,template-big 用于 productions_small,反之亦然。这背后没有实际的逻辑,因此决定使用哪个模板是在后端通过 Wordpress 4.7 引入的 Post Type Template 功能完成的
我想要实现的是一个符合逻辑的 URL 结构,例如 example.com/productions/for-big/name-of-adult-production。现在我有 URLs 像 example.com/productions_big/name-of-adult-production 因为 productions_big 是 CPT 的名称。
我熟悉在注册自定义 post 类型时应该传递的 rewrite 参数。我已经按照 Whosebug 上建议的所有方式完成了此操作,但它只是行不通。这是我用来注册 CPT 的代码的摘录:
add_action('init', 'all_custom_post_types');
function all_custom_post_types() {
$types = array(
array('the_type' => 'productions_big',
...
array('the_type' => 'productions_small',
...
);
foreach ($types as $type) {
$the_type = $type['the_type'];
...
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capabilities' => array(
...),
'rewrite' => array('has_archive' => false, 'slug' => 'bla', 'with_front' => false),
'has_archive' => false,
'map_meta_cap' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title','editor','thumbnail', 'taxonomies'),
'taxonomies' => array( 'category' )
);
register_post_type($the_type, $args);
}
}
如你所见,我尝试了 'rewrite' => array('slug' => 'bla') 因为我想知道它是否当我写 'rewrite' => array('slug' => 'productions/for-big')
时,因为页面名称冲突而无法工作但是无论我给 slug 什么值,它总是将我重定向到 index.php.
我认为它不起作用的原因是我分配 post 模板的方式造成的(记住:作为后端的 post 属性,而不是专用的 single-xxx.php 文件)但我无法在任何地方找到解决方案。所有寻求解决方案的人 post 都在用老式的 单一 name_of_cpt.php 方式分配模板(这对我来说是不可能的)。
旁注:最终目标是制造子弹 "dynamic"。这意味着它会随着后端页面名称的更改而改变。我可能会尝试 this approach,但在此之前我必须解决此处描述的基本问题。
非常感谢任何想法。感谢您阅读到这里。
哦,孩子,看来你必须 post 你的问题才能自己找到答案。在尝试设置另一个 CPT 之后,一切都很顺利。
这让我调查了以前 CPT 的注册情况。正如您在上面看到的,我尝试在 one 函数
中注册我的 CPTfunction all_custom_post_types() {
$types = array(
array('the_type' => 'productions_big', ...
array('the_type' => 'productions_small', ...
);
foreach ($types as $type) {
$args = array(...
'rewrite' => array('slug' => 'bla'),...
);
register_post_type($the_type, $args);
}
}
所以最终我的页面的 slug 和自定义 post 类型之间没有冲突,但是将同一个 slug 分配给两种不同的 post 类型会发生冲突。