Wordpress自定义的带有分类法的帖子永久链接会破坏正常页面



对于我正在进行的项目,我想为我的帖子实现以下永久链接结构:

domain.com/special/my-postplug

其中special是自定义分类法。

我做了什么:

  • 进入设置>永久链接
  • 选择自定义选项并将其转换为:/%specials%/%postname%/
  • 钩住以下Wordpress钩子,如下所示:
<?php
// in functions.php

add_filter('post_link', 'specials_permalink', 10, 3);
add_filter('post_type_link', 'specials_permalink', 10, 3);
function specials_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%specials%') === FALSE) {
return $permalink;
}
$post = get_post($post_id);
if (!$post) {
return $permalink;
}
$terms = wp_get_object_terms($post->ID, 'specials');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
$taxonomy_slug = $terms[0]->slug;
} else {
$categories = wp_get_post_categories($post_id->ID, array('fields' => 'all'));
if(isset($categories[0])) {
$taxonomy_slug = $categories[0]->slug;
} else {
$taxonomy_slug = 'general';
}
}
$permalink = str_replace('%specials%', $taxonomy_slug, $permalink);
return $permalink;
}

这个代码运行得很好,但由于我为我的帖子添加了永久链接结构的特殊功能,我的页面将不再加载。它们的结果都是404。一旦我从永久链接结构中删除%specials%,它们就会重新工作。

在调试过程中,我发现Wordpress与我的URL匹配如下:

请求:

fr/我的子弹

查询字符串:

lang=fr&特价=我的子弹

匹配重写规则:

(fr|nl|en)/([^/]+)/?$

匹配重写查询:

lang=fr&特价=我的子弹

但它必须是"页面名称"加上"特价商品"。我已经尝试过重新映射一些url并添加自定义重写规则之类的东西,但我找不到任何解决方案。最奇怪的是,根据WP Codex,永久链接结构只适用于帖子和存档页面,而不适用于页面。我的函数挂在链接中,在加载页面时不会被触发。但出于某种原因,Wordpress认为我的页面很特别。

我试着添加尽可能多的信息,但如果缺少什么,请询问。

如果你在设置->永久链接下更改永久链接结构,你就可以为所有帖子类型更改它(我认为)。

我的建议:保持permalink结构默认为(/%postname%/),并在您的过滤函数中添加post-type检查:

function specials_permalink($permalink, $post_id, $leavename) {
if ( 'post' != get_post_type( $post_id ) ) {
return $permalink;
}
// rest of your code
}

最新更新