用作永久链接结构分隔符的破折号而不是斜杠

时间:2015-12-19 作者:Adam Michael Wood

我有一个奇怪的问题,是由一个不好的需求造成的。(我这么说是因为很多评论告诉我这是一件坏事,我不想这样做。我知道。我不想这样做。)

是否有可能更改永久链接分隔符(/ ) 到破折号(- ), 专门针对分层页面?

因此页面的URL如下所示:示例。com/page子页孙页

甚至

实例com/page--子页--孙页

--

为什么?

我需要子-父关系才能显示面包屑以及子页面和兄弟页面列表。

但是客户/老板(出于让我困惑的原因)不想要(我引用的话)“这么多文件夹”

think 完成后,站点可能会编译为静态web服务器,因此这几乎是有意义的。请不要告诉我这是愚蠢的。我知道这很愚蠢。

--

备选方案

不要使用WP的页面层次结构。使用ACF或Posts-to-Posts(或类似工具)创建替代父子关系,然后滚动我自己的面包屑和子页面列表功能。

欢迎就这是否是一个从根本上更好的想法发表评论。

谢谢

1 个回复
SO网友:fuxia

你可以用其他东西代替破折号,最好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,所以过滤器会有所帮助。

相关推荐

Permalinks - Archives

WordPress文档说:WordPress offers you the ability to create a custom URL structure for your permalinks and archives. https://codex.wordpress.org/Settings_Permalinks_Screen 我看到此屏幕将如何为特定帖子/页面创建永久链接,但我没有看到此设置屏幕上关于如何为存档帖子/页面创建链接的任何其他详细信息。有人能澄清一下吗?