如何以编程方式更改 Wordpress 的默认帖子永久链接?
How to change Wordpress' default posts permalinks programmatically?
在 Wordpress 的后端,我使用默认的 http://localhost/sitename/example-post/
值来创建永久链接。
对于自定义 post 类型,我以这种方式定义了一个自定义 slug,这里是 services
例如:
register_post_type( 'service',
array(
'labels' => array(
'name' => __( 'Services' ),
'singular_name' => __( 'Service' )
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'services',
'with_front' => true
),
'supports' => array(
'title',
'editor',
'excerpt',
'thumbnail'
),
'taxonomies' => array( 'category' ),
)
);
它创建 services/post-name。
我也使用这个钩子来创建自定义页面来创建自定义页面永久链接:
function custom_base_rules() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/';
}
add_action( 'init', 'custom_base_rules' );
创建page/post-name
现在我唯一需要做的就是为普通的 Wordpress 创建另一个自定义永久链接路径 posts.
所以结果世界是 post 类型的 post
:
post/post-name
我不能为此使用支持,因为我已经定义了处理永久链接的默认方式。我已经设法重写了自定义 post 类型和页面的路径...
如何以编程方式在 Wordpress 中重写 post
post 类型的永久链接路径?
帖子必须使用默认的永久链接结构,它们在重写对象中没有像页面或自定义 post 类型那样的特殊条目。如果你想以编程方式更改默认结构,你可以将这样的东西添加到你的钩子中。
$wp_rewrite->permalink_structure = '/post/%postname%';
我不太明白你说的是什么意思
I can't use the backed for this because I already defined a default way of handling the permalinks. I already managed to rewrite the paths of custom post types and pages...
听起来好像您正在覆盖除 posts 以外所有地方永久链接的默认行为,因此如果您更改默认设置,它可能只会影响 posts。
GentlemanMax 建议的 permalink_structure
属性 对我不起作用。但是我找到了一个有效的方法,set_permalink_structure()。请参阅下面的代码示例。
function custom_permalinks() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/'; // custom page permalinks
$wp_rewrite->set_permalink_structure( $wp_rewrite->root . '/post/%postname%/' ); // custom post permalinks
}
add_action( 'init', 'custom_permalinks' );
您需要分两步完成。
首先为构建 post 注册启用 'with_front' => true
重写
add_filter(
'register_post_type_args',
function ($args, $post_type) {
if ($post_type !== 'post') {
return $args;
}
$args['rewrite'] = [
'slug' => 'posts',
'with_front' => true,
];
return $args;
},
10,
2
);
这样 http://foo.example/posts/a-title
这样的 url 可以工作,但生成的链接现在是错误的。
可以通过为构建 posts
强制自定义永久链接结构来修复链接
add_filter(
'pre_post_link',
function ($permalink, $post) {
if ($post->post_type !== 'post') {
return $permalink;
}
return '/posts/%postname%/';
},
10,
2
);
在 Wordpress 的后端,我使用默认的 http://localhost/sitename/example-post/
值来创建永久链接。
对于自定义 post 类型,我以这种方式定义了一个自定义 slug,这里是 services
例如:
register_post_type( 'service',
array(
'labels' => array(
'name' => __( 'Services' ),
'singular_name' => __( 'Service' )
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'services',
'with_front' => true
),
'supports' => array(
'title',
'editor',
'excerpt',
'thumbnail'
),
'taxonomies' => array( 'category' ),
)
);
它创建 services/post-name。
我也使用这个钩子来创建自定义页面来创建自定义页面永久链接:
function custom_base_rules() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/';
}
add_action( 'init', 'custom_base_rules' );
创建page/post-name
现在我唯一需要做的就是为普通的 Wordpress 创建另一个自定义永久链接路径 posts.
所以结果世界是 post 类型的 post
:
post/post-name
我不能为此使用支持,因为我已经定义了处理永久链接的默认方式。我已经设法重写了自定义 post 类型和页面的路径...
如何以编程方式在 Wordpress 中重写 post
post 类型的永久链接路径?
帖子必须使用默认的永久链接结构,它们在重写对象中没有像页面或自定义 post 类型那样的特殊条目。如果你想以编程方式更改默认结构,你可以将这样的东西添加到你的钩子中。
$wp_rewrite->permalink_structure = '/post/%postname%';
我不太明白你说的是什么意思
I can't use the backed for this because I already defined a default way of handling the permalinks. I already managed to rewrite the paths of custom post types and pages...
听起来好像您正在覆盖除 posts 以外所有地方永久链接的默认行为,因此如果您更改默认设置,它可能只会影响 posts。
GentlemanMax 建议的 permalink_structure
属性 对我不起作用。但是我找到了一个有效的方法,set_permalink_structure()。请参阅下面的代码示例。
function custom_permalinks() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/'; // custom page permalinks
$wp_rewrite->set_permalink_structure( $wp_rewrite->root . '/post/%postname%/' ); // custom post permalinks
}
add_action( 'init', 'custom_permalinks' );
您需要分两步完成。
首先为构建 post 注册启用 'with_front' => true
重写
add_filter(
'register_post_type_args',
function ($args, $post_type) {
if ($post_type !== 'post') {
return $args;
}
$args['rewrite'] = [
'slug' => 'posts',
'with_front' => true,
];
return $args;
},
10,
2
);
这样 http://foo.example/posts/a-title
这样的 url 可以工作,但生成的链接现在是错误的。
可以通过为构建 posts
强制自定义永久链接结构来修复链接add_filter(
'pre_post_link',
function ($permalink, $post) {
if ($post->post_type !== 'post') {
return $permalink;
}
return '/posts/%postname%/';
},
10,
2
);