在上一个代码示例中,您为post_format_rewrite_base
. 它应该是字符串,而不是数组。然而,你的想法是正确的。
您必须注意WordPress为post格式创建的默认重写规则所隐含的所有«路由»:
type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$ => index.php?post_format=$matches[1]&feed=$matches[2]
type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$ => index.php?post_format=$matches[1]&feed=$matches[2]
type/([^/]+)/embed/?$ => index.php?post_format=$matches[1]&embed=true
type/([^/]+)/page/?([0-9]{1,})/?$ => index.php?post_format=$matches[1]&paged=$matches[2]
type/([^/]+)/?$ => index.php?post_format=$matches[1]
使用如何
Cortex? 它允许您将路线直接映射到查询参数。下面是一个如何使用它的示例。
<?php
use
Brain\\Cortex,
Brain\\Cortex\\Route;
add_action( \'wp_loaded\', function() {
Cortex::boot();
$post_format_slugs = get_post_format_slugs();
$post_format_slugs_pattern = implode( \'|\', $post_format_slugs );
add_action(
\'cortex.routes\',
function ( Route\\RouteCollectionInterface $collection ) use ( $post_format_slugs_pattern ) {
/**
* Default route for post format slugs
*
* /(standard|aside|chat|gallery|...)
*/
$collection->addRoute(
new Route\\QueryRoute(
"/{slug:{$post_format_slugs_pattern}}",
function( $matches ) {
return [
\'post_format\' => $matches[ \'slug\' ]
];
}
)
);
/**
* Route for feed endpoints 1
*
* /(standard|aside|chat|gallery|...)/feed/(feed/rdf/rss/rss2/atom)
*/
$collection->addRoute(
new Route\\QueryRoute(
"/{slug:{$post_format_slugs_pattern}}/feed/{feed:feed|rdf|rss|rss2|atom}",
function( $matches ) {
return [
\'post_format\' => $matches[ \'slug\' ],
\'feed\' => $matches[ \'feed\' ]
];
}
)
);
/**
* Route for feed endpoints 2
*
* /(standard|aside|chat|gallery|...)/(feed/rdf/rss/rss2/atom)
*/
$collection->addRoute(
new Route\\QueryRoute(
"/{slug:{$post_format_slugs_pattern}}/{feed:feed|rdf|rss|rss2|atom}",
function( $matches ) {
return [
\'post_format\' => $matches[ \'slug\' ],
\'feed\' => $matches[ \'feed\' ]
];
}
)
);
/**
* Route for embed
*
* /(standard|aside|chat|gallery|...)/embed
*/
$collection->addRoute(
new Route\\QueryRoute(
"/{slug:{$post_format_slugs_pattern}}/embed",
function( $matches ) {
return [
\'post_format\' => $matches[ \'slug\' ],
\'embed\' => TRUE
];
}
)
);
/**
* Route for pagination
*
* ^/(standard|aside|chat|gallery|...)/page/(\\d+)$
*/
$collection->addRoute(
new Route\\QueryRoute(
"/{slug:{$post_format_slugs_pattern}}/page/{page:[0-9]+}",
function( $matches ) {
return [
\'post_format\' => $matches[ \'slug\' ],
\'paged\' => $matches[ \'page\' ]
];
}
)
);
}
);
} );
Cortex的优势在于,您不必刷新重写规则。内部it使用
FastRoute 为了匹配模式,您可以使用任何模式语言,
FastRoute 提供。Cortext不会覆盖WordPress的内部路由过程,它只会在之前操作,如果没有路由匹配,它会将请求传递给WordPress。
这个例子展示了如何使用皮质的本质。有些路由可能会被合并甚至删除,因为它们只是为了向后兼容(尤其是冗余的馈送路由)。
请记住,您的概念需要重叠的路由,这意味着您将无法创建包含任何post格式术语的页面:标准、旁白、聊天室、图库、链接、图像、引用、状态、视频、音频。
您可能希望实现一种自动检查,以影响独特的段塞后生成:
add_filter( \'wp_unique_post_slug_is_bad_hierarchical_slug\', function( $is_bad, $slug, $post_type, $post_parent ) {
if ( \'page\' !== $post_type )
return $is_bad;
return in_array( $slug, get_post_format_slugs() );
} );
另一个优化是只使用当前主题实际支持的post格式slug。但如果主题发生变化,这将使现有URL无效。
如果您不想使用Cortex,原则基本相同,但您必须手动删除默认的post格式规则,并将其替换为custom rewrite rules 这遵循上述路线的模式。请记住,仅在激活挂钩上执行此操作,然后在将重写规则缓存到数据库中时刷新这些规则。