你可以用其他东西代替破折号,最好not 连字符,因为这很难解析回来。在下面的示例中,我使用了一个点。
您必须更改两个部分:传出永久链接(挂钩:"{$post_type}_link"
) 和请求(挂钩:request
) 分析“传入永久链接”。
后者更难,因为很难防止与其他post类型和分类法发生冲突。
下面是一个简单的类,其中包含两种情况的处理程序。我已经用post类型测试过了page
仅和具有永久链接设置,可放置普通帖子(帖子类型post
) 在根级别。
class Undash_Permalinks
{
/**
* What to use instead of /
*
* @var string
*/
private $replacement;
/**
* Undash_Permalinks constructor.
*
* @param string $replacement
*/
public function __construct( $replacement )
{
$this->replacement = $replacement;
}
/**
* Change the output URL
*
* @wp-hook page_link
* @param string $url
*
* @return string
*/
public function output( $url )
{
$home = home_url( \'/\' );
$start = strlen( $home );
$sub = substr( $url, $start );
$replaced = str_replace( \'/\', $this->replacement, $sub );
return $home . $replaced;
}
/**
* Help WordPress to understand the requests as page requests
*
* @wp-hook request
* @param array $request
*
* @return array
*/
public function input( array $request )
{
if ( empty ( $request[ \'name\' ] ) )
return $request;
if ( FALSE === strpos( $request[ \'name\' ], $this->replacement ) )
return $request;
$path = str_replace( $this->replacement, \'/\', $request[ \'name\' ] );
$page = get_page_by_path( $path );
if ( ! $page )
return $request;
// Convince WP that we really have a page.
$request[ \'pagename\' ] = $path;
unset( $request[ \'name\' ] );
return $request;
}
}
使用此类非常简单:
add_action( \'after_setup_theme\', function() {
$undash = new Undash_Permalinks( \'.\' );
add_filter( \'page_link\', [ $undash, \'output\' ] );
add_filter( \'request\', [ $undash, \'input\' ] );
});
这可能需要对其他帖子类型进行一些更改。对于附件,您可以使用根目录作为上载目录,也可以只使用“文件夹”。对它们的请求不会通过WordPress,所以过滤器会有所帮助。