我正在努力用自定义分类法设置自定义permalink结构。我在这里阅读了许多问题/答案,但我无法将其付诸实施(最令人沮丧的是,我不知道如何调试并自己找到问题)。非常感谢您的帮助!
What you need to know
<我有一个自定义的帖子类型,叫做
items
items
有两种自定义分类法:types
和locations
. 每个项目都与one type
和multiple (1+) locations
我正在尝试为每个item
:http://domain.com/type/location
然而,我只想在这个链接结构中使用第一个位置术语。
我还没有尝试实现/location
链接结构的一部分(我想这有点复杂),因为我已经在努力/type/
部分因此,我的代码目前看起来是这样的,这不会对我的永久链接产生任何更改:
in a plugin
register_post_type( \'item\',
array(
\'labels\' => $labels,
\'supports\' => array( \'title\', \'editor\', \'thumbnail\', \'comments\'),
\'public\' => true,
\'has_archive\' => true,
\'rewrite\' => true,
\'menu_icon\' => plugins_url( \'/img/icon.png\'),
\'menu_position\' => 42,
\'categories\' => array( ),
)
);
register_taxonomy( \'types\', \'item\', array(
\'labels\' => $item_types_labels,
\'hierarchical\' => true,
\'query_var\' => \'type\',
\'rewrite\' => true,
\'public\' => true,
\'show_ui\' => true,
) );
in functions.php
add_filter(\'post_link\', \'types_permalink\', 10, 3);
add_filter(\'post_type_link\', \'types_permalink\', 10, 3);
function types_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, \'%types%\') === FALSE) return $permalink;
// Get post
$post = get_post($post_id);
if (!$post) return $permalink;
// Get taxonomy terms
$terms = wp_get_object_terms($post->ID, \'types\');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug;
else $taxonomy_slug = \'no-type\';
return str_replace(\'%types%\', $taxonomy_slug, $permalink);
}
我将永久链接结构设置为自定义结构/%types%/%postname%/
. 我的URL仍然如下所示domain.com/item/postname
.还有:无论我做什么/item/
(例如。domain.com/this-doesn-make-sense-to-me/postname
), 我被重定向到domain.com/item/postname
.
最合适的回答,由SO网友:Milo 整理而成
第一个问题-设置中的永久链接结构仅适用于post
post类型,因此您的post_type_link
函数没有%types%
要替换的标记。
其次,除非您想要一个非常复杂(且性能较差)的解决方案,否则更简单的解决方案是在post类型slug中有一个静态前缀。使用URLhttp://domain.com/type/location/post-name/
, WordPress无法知道您的要求。是type
包含子页的页location
, 或者是types
分类术语?使用标准重写系统,一条规则始终优先,其他请求始终为404。使用URL格式http://domain.com/item/type/location/post-name/
, WordPress会确切地知道你想要什么,因为只有一种帖子类型的前缀是item
.
至于细节,在您的post type注册中,设置slug
的参数rewrite
到所需URL的格式:
\'rewrite\' => array( \'slug\' => \'item/%types%\' ),
…和您的
post_type_link
过滤器应该工作。如果要添加位置,只需将该标记添加到slug中,并添加代码来替换
post_type_link
过滤器-
\'rewrite\' => array( \'slug\' => \'item/%types%/%locations%\' ),