共享子页面和自定义帖子类型的根插件(将子页面优先于帖子)

时间:2021-10-14 作者:Álvaro Franz

让我们假设一个名为“quot;不管怎样;,将根段塞设置为;随便什么;。

这使得所有帖子都是;“随便什么”;在以下位置可用site.url/whatever/post-name

我还希望在上提供一个名为Whatever的父页面site.url/whatever

为了实现这一点,我必须使用所述slug创建页面,并设置has_archive 注册时,属性为false;“随便什么”;CPT。

到目前为止还不错。

现在,我想为页面创建一些特定的子页面;不管怎样;,我希望他们在site.url/whatever/child-page-name

最后一步不起作用,因为当访问该url时,WordPress尝试加载类型为“的CPT”;“随便什么”;名称为“;子页面名称;。而且它不存在。

我想做的是在加载过程中对页面进行优先级排序,以便;“随便什么”;存在请求的名称,应始终加载该名称(即使存在具有所述名称的CPT)。

我不知道从哪里开始。我想过要单曲什么的。php文件查找具有请求的帖子名称的页面。但是,如果页面存在,我不知道该如何处理这些信息。我应该重定向吗?是否筛选加载的模板?这就是我的困境,任何帮助都将不胜感激。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我想为页面设置一些特定的子页面;不管怎样;,我希望他们在site.url/whatever/child-page-name

我想做的是在加载过程中对页面进行优先级排序,以便;“随便什么”;存在请求的名称,应始终加载该名称(即使存在具有所述名称的CPT)。

如果子页面必须是页面(page 键入),然后可以使用parse_request hook 有条件地更改请求类型,在您的情况下,请求类型是从自定义post类型请求更改为标准(子)页面请求,这意味着is_page() 将返回true,WordPress还将为以下页面加载正确的模板page-whatever.php.

Working example, 尝试(&T);在WordPress 5.8.1上测试:

注:get_page_uri() 用于检索;“目录”;子页的路径,因此如果parent 是父页slug,并且child 是子页slug,则路径为parent/child.

add_action( \'parse_request\', \'my_parse_request\' );
function my_parse_request( $wp ) {
    $post_type = \'whatever\'; // set the post type slug
    // and the "whatever" below is the Page slug

    // This code checks if the path of the current request/page URL begins with
    // "whatever/" as in https://example.com/whatever/child-page-name and also
    // https://example.com/whatever/child-page-name/page/2 (paginated request).
    // We also check if the post_type var is the post type set above.
    if ( preg_match( \'#^whatever/#\', $wp->request ) &&
        isset( $wp->query_vars[\'post_type\'], $wp->query_vars[\'name\'] ) &&
        $post_type === $wp->query_vars[\'post_type\']
    ) {
        $posts = get_posts( array(
            \'post_type\' => \'page\',
            \'name\'      => $wp->query_vars[\'name\'],
        ) );

        // If a (child) Page with the same name/slug exists, we load the Page,
        // regardless the post type post exists or not.
        if ( ! empty( $posts ) ) {
            $wp->query_vars[\'pagename\'] = get_page_uri( $posts[0] );

            unset( $wp->query_vars[\'post_type\'], $wp->query_vars[\'name\'],
                $wp->query_vars[ $post_type ] );
        }
    }
}

相关推荐