在两个URL上创建邮政类型档案的两个视图

时间:2014-01-21 作者:mrwweb

Updates 6 Feb 14 to make more specific as requested in comments.

我有一个帖子类型,我们将其称为“项目”,对于slug“Projects”,我想提供两种观点:

列表视图(default)

  • 地图视图
    1. 我希望这些视图位于以下永久链接:

      示例。组织/项目/(default post type archive page, archive-projects.php)

    当访问一个特定URL时,我如何处理指示WordPress使用特定模板的指示,否则这将意味着一个特定的项目帖子?如果该重定向能够保持默认的post类型存档查询,那就太好了,但如果必要的话,我可以在模板中编写一个辅助循环。我最初以为端点就是答案,但我很确定那不是真的。

    我有一个帖子类型——“Projects”,我想要两个帖子类型档案视图。第一个是按类别排序的项目列表,第二个是项目的映射视图。为这两个视图制作模板不是问题。

    How can I make these two different views of the Post Type Archive, each with a unique URL?

    理想情况下,我希望第一个模板是/projects/ 第二个视图位于/projects/map/.

    这似乎是一种定制端点的方式,但是this comment 有一个老问题的标题完美地描述了我正在寻找的内容,这表明,没有办法只为自定义的帖子类型归档设置终点。

    那么,我应该使用自定义重写,还是应该考虑使用更jQuery驱动的解决方案?

    2 个回复
    最合适的回答,由SO网友:Nicolai Grossherr 整理而成

    更新的方法实际上,正如你所说的,我提出的第一个想法/建议并不符合我的理解。至少我试过了,但没能弄明白。也就是说,您想要的仍然是可以实现的,但不是通过使用端点,或者至少不是通过使用add_rewrite_endpoint().

    然而,我认为通过“普通”重写设置应该是可能的。下面的代码显示了如何设置帖子类型、查询变量和重写规则,以实现帖子类型存档的自定义视图。最后但并非最不重要的一点是,我们需要确保加载正确的模板。这可以模拟端点。示例性代码应该让您朝着正确的方向前进,这样您就可以根据需要对其进行调整。

    Code:

    // minimal setup to register the new post type
    add_action( \'init\', \'wpse130664_pt_rw_ep_cpt\');
    function wpse130664_pt_rw_ep_cpt() { 
        register_post_type( \'rw_ep_cpt\', 
            array(
                \'label\' => __( \'rw_ep_cpt\', \'rw_ep_cpt_textdomain\' ),
                \'public\' => true,
                // the archive slug defaults to the post type name »rw_ep_cpt«
                \'has_archive\' => true
            )
        );  
    } 
    
    // add a new query variable
    add_filter(\'init\', \'wpse130664_pt_archive_qv\');
    function wpse130664_pt_archive_qv() {
        global $wp;
        $wp->add_query_var(\'aview\');
    }
    
    // add a new rewrite rule
    add_filter(\'init\', \'wpse130664_pt_archive_rw_rule\');
    function wpse130664_pt_archive_rw_rule() {
        // we\'re adding »aview« as a possibility to the slug 
        // of the custom post type archive we registered above
        // no need to match anything, e.g. with »$matches[1]«
        // so we\'re defaulting the aview query variable to 1
        // this kind of emulates a endpoint
        add_rewrite_rule( "rw_ep_cpt/aview$", "index.php?post_type=rw_ep_cpt" . \'&aview=1\', \'top\' );
    }
    
    // load the »aview« template
    add_filter( \'template_include\', \'wpse130664_aview_tmpl_red\' );
    function wpse130664_aview_tmpl_red( $original_template ) {
        // we\'re loading the template conditionally, 
        // but only if we\'re actually at the »aview« "endpoint"
        if ( 1 == intval(get_query_var(\'aview\')) ) {
            // you\'ve to create the template you want to use here
            return get_template_directory().\'/archive-aview.php\';
        } else {
            return $original_template;
        }
    }
    

    同时,我很好奇你为什么选择在$wp 全局而非功能get_query_var()add_query_var()?

    老实说,我重用了我不久前写的一些代码,我只是对其进行了一些修改,使其适合您的需要。在那里,我使用了上述方法$wp 全球的但这当然不能解释为什么,所以我也试图解决这个问题。

    如果我没有完全错的话add_query_var() 仅作为的函数/方法可用WP 班因此,上述方法就是这样做的。

    关于get_query_var(), 这个你可以用,但它全球化了$wp_query 并使用get() 功能/方法WP_Query 班因此,在某种程度上,差异不是或不应该很大。

    除此之外,还有一个想法WP_Query 对象可能比WP 对象,如果不总是。因此,通过全球$wp 可能真的是件好事
    但实际上我没有想过并测试这个槽,我已经这样使用了它,并且它在我的设置中工作,所以当我编写代码时我很满意。因此,在另一个设置/用例中可能存在缺陷。或者换一种方式在其他情况下可能更有价值/更有益。但正如我上面所说,这是为了让你开始,你必须自己调整它以适应你的需要。

    评论后更新Awell-timed blog post 从@MarkJaquith开始,我开始template_include 更适合包含新模板文件的过滤器。我已经更新了代码以使用该过滤器,我建议也更新示例代码。

    正如@mrwweb指出的和上面链接的文章所解释的那样template_redirect 对于选择其他模板,筛选器不是最佳的。或者正如@MarkJaquith简单总结的那样:

    → 模板_redirect 用于redirects.
    → 模板_include 用于includes.

    他说服了我,所以我改变了»aview«模板加载的方式template_include 过滤上述代码。



    <小时>

    第一个想法/方法Disclaimer:
    我保留了这个,因为它有信息价值,但这个对自定义帖子类型存档不起作用。但是使用ep_mask 可以方便地为单个自定义帖子类型的帖子创建端点。

    据我所知,在这种情况下可以完成端点。我最近读到了这篇文章,但实际上我从来没有想过要这么做。因此,据我所知,可能会有更多的人来解决问题

    你说得对:

    我的理解是,端点不适用于post类型归档。它们适用于该帖子类型中的帖子,但不适用于存档本身。


    所以利用ep_mask 如下所述的参数可用于自定义帖子类型的帖子,但not 用于存档ep_mask 可以用于创建单个自定义post类型端点。

    基本上,我所读到的内容是利用ep_mask 使用时可用的参数

    rewrite 论点

    看看相关的trac ticket 19275. 您可以在register_post_type() codex页面位于permalink_epmask 描述,尤其是trac ticket 12605.

    关于端点的概述:

    SO网友:gmazzap

    2017年12月3日更新,下面提到的插件被放弃了,我目前维护的是另一个包,Cortex

    把我的答案作为一个选择。

    我开发了一个插件,Clever Rules, 它允许指定路由、查询和(除其他外)特定模板。

    使用智能规则需要注册规则,但请注意,在当前版本中you can register rules only in plugins, not in themes.

    下载聪明的规则,激活它。现在你需要一个插件来注册你的规则:你可以创建一个新的插件,或者在你正在开发的插件中插入以下代码。。。

    add_action(\'plugins_loaded\', \'register_my_rules\');
     
    function register_my_rules() {
     
        // next line ensure function runs only if Clever Rules is installed
        if ( ! function_exists(\'register_clever_rule\') ) return;
     
        $args = array( \'route\' => \'/projects/map/\', \'query\' => \'post_type=projects\' );
    
        register_clever_rule( $args )->template(\'your-specific-template.php\');
     
    }
    
    这3行代码is the only thing you need. 如果你为此创建了一个新插件,那么当然要激活它。

    任何默认URL都不会受到影响。

    \'your-specific-template.php\' 可以是父主题甚至子主题中的模板文件。当然,您可以根据需要自定义查询并使用其他插件功能。

    如果你喜欢这个系统,你可以使用相同的插件来注册你需要的所有规则。

    注:我正在开发该插件的新版本,该插件的性能会更高(当有很多规则时,只有一个规则是没有问题的),允许在主题中注册规则,有一点不同的API和一些附加功能。它将很快公开发布,然而,当前版本也可以使用。

    结束

    相关推荐

    在两个URL上创建邮政类型档案的两个视图 - 小码农CODE - 行之有效找到问题解决它

    在两个URL上创建邮政类型档案的两个视图

    时间:2014-01-21 作者:mrwweb

    Updates 6 Feb 14 to make more specific as requested in comments.

    我有一个帖子类型,我们将其称为“项目”,对于slug“Projects”,我想提供两种观点:

    列表视图(default)

  • 地图视图
    1. 我希望这些视图位于以下永久链接:

      示例。组织/项目/(default post type archive page, archive-projects.php)

    当访问一个特定URL时,我如何处理指示WordPress使用特定模板的指示,否则这将意味着一个特定的项目帖子?如果该重定向能够保持默认的post类型存档查询,那就太好了,但如果必要的话,我可以在模板中编写一个辅助循环。我最初以为端点就是答案,但我很确定那不是真的。

    我有一个帖子类型——“Projects”,我想要两个帖子类型档案视图。第一个是按类别排序的项目列表,第二个是项目的映射视图。为这两个视图制作模板不是问题。

    How can I make these two different views of the Post Type Archive, each with a unique URL?

    理想情况下,我希望第一个模板是/projects/ 第二个视图位于/projects/map/.

    这似乎是一种定制端点的方式,但是this comment 有一个老问题的标题完美地描述了我正在寻找的内容,这表明,没有办法只为自定义的帖子类型归档设置终点。

    那么,我应该使用自定义重写,还是应该考虑使用更jQuery驱动的解决方案?

    2 个回复
    最合适的回答,由SO网友:Nicolai Grossherr 整理而成

    更新的方法实际上,正如你所说的,我提出的第一个想法/建议并不符合我的理解。至少我试过了,但没能弄明白。也就是说,您想要的仍然是可以实现的,但不是通过使用端点,或者至少不是通过使用add_rewrite_endpoint().

    然而,我认为通过“普通”重写设置应该是可能的。下面的代码显示了如何设置帖子类型、查询变量和重写规则,以实现帖子类型存档的自定义视图。最后但并非最不重要的一点是,我们需要确保加载正确的模板。这可以模拟端点。示例性代码应该让您朝着正确的方向前进,这样您就可以根据需要对其进行调整。

    Code:

    // minimal setup to register the new post type
    add_action( \'init\', \'wpse130664_pt_rw_ep_cpt\');
    function wpse130664_pt_rw_ep_cpt() { 
        register_post_type( \'rw_ep_cpt\', 
            array(
                \'label\' => __( \'rw_ep_cpt\', \'rw_ep_cpt_textdomain\' ),
                \'public\' => true,
                // the archive slug defaults to the post type name »rw_ep_cpt«
                \'has_archive\' => true
            )
        );  
    } 
    
    // add a new query variable
    add_filter(\'init\', \'wpse130664_pt_archive_qv\');
    function wpse130664_pt_archive_qv() {
        global $wp;
        $wp->add_query_var(\'aview\');
    }
    
    // add a new rewrite rule
    add_filter(\'init\', \'wpse130664_pt_archive_rw_rule\');
    function wpse130664_pt_archive_rw_rule() {
        // we\'re adding »aview« as a possibility to the slug 
        // of the custom post type archive we registered above
        // no need to match anything, e.g. with »$matches[1]«
        // so we\'re defaulting the aview query variable to 1
        // this kind of emulates a endpoint
        add_rewrite_rule( "rw_ep_cpt/aview$", "index.php?post_type=rw_ep_cpt" . \'&aview=1\', \'top\' );
    }
    
    // load the »aview« template
    add_filter( \'template_include\', \'wpse130664_aview_tmpl_red\' );
    function wpse130664_aview_tmpl_red( $original_template ) {
        // we\'re loading the template conditionally, 
        // but only if we\'re actually at the »aview« "endpoint"
        if ( 1 == intval(get_query_var(\'aview\')) ) {
            // you\'ve to create the template you want to use here
            return get_template_directory().\'/archive-aview.php\';
        } else {
            return $original_template;
        }
    }
    

    同时,我很好奇你为什么选择在$wp 全局而非功能get_query_var()add_query_var()?

    老实说,我重用了我不久前写的一些代码,我只是对其进行了一些修改,使其适合您的需要。在那里,我使用了上述方法$wp 全球的但这当然不能解释为什么,所以我也试图解决这个问题。

    如果我没有完全错的话add_query_var() 仅作为的函数/方法可用WP 班因此,上述方法就是这样做的。

    关于get_query_var(), 这个你可以用,但它全球化了$wp_query 并使用get() 功能/方法WP_Query 班因此,在某种程度上,差异不是或不应该很大。

    除此之外,还有一个想法WP_Query 对象可能比WP 对象,如果不总是。因此,通过全球$wp 可能真的是件好事
    但实际上我没有想过并测试这个槽,我已经这样使用了它,并且它在我的设置中工作,所以当我编写代码时我很满意。因此,在另一个设置/用例中可能存在缺陷。或者换一种方式在其他情况下可能更有价值/更有益。但正如我上面所说,这是为了让你开始,你必须自己调整它以适应你的需要。

    评论后更新Awell-timed blog post 从@MarkJaquith开始,我开始template_include 更适合包含新模板文件的过滤器。我已经更新了代码以使用该过滤器,我建议也更新示例代码。

    正如@mrwweb指出的和上面链接的文章所解释的那样template_redirect 对于选择其他模板,筛选器不是最佳的。或者正如@MarkJaquith简单总结的那样:

    → 模板_redirect 用于redirects.
    → 模板_include 用于includes.

    他说服了我,所以我改变了»aview«模板加载的方式template_include 过滤上述代码。



    <小时>

    第一个想法/方法Disclaimer:
    我保留了这个,因为它有信息价值,但这个对自定义帖子类型存档不起作用。但是使用ep_mask 可以方便地为单个自定义帖子类型的帖子创建端点。

    据我所知,在这种情况下可以完成端点。我最近读到了这篇文章,但实际上我从来没有想过要这么做。因此,据我所知,可能会有更多的人来解决问题

    你说得对:

    我的理解是,端点不适用于post类型归档。它们适用于该帖子类型中的帖子,但不适用于存档本身。


    所以利用ep_mask 如下所述的参数可用于自定义帖子类型的帖子,但not 用于存档ep_mask 可以用于创建单个自定义post类型端点。

    基本上,我所读到的内容是利用ep_mask 使用时可用的参数

    rewrite 论点

    看看相关的trac ticket 19275. 您可以在register_post_type() codex页面位于permalink_epmask 描述,尤其是trac ticket 12605.

    关于端点的概述:

    SO网友:gmazzap

    2017年12月3日更新,下面提到的插件被放弃了,我目前维护的是另一个包,Cortex

    把我的答案作为一个选择。

    我开发了一个插件,Clever Rules, 它允许指定路由、查询和(除其他外)特定模板。

    使用智能规则需要注册规则,但请注意,在当前版本中you can register rules only in plugins, not in themes.

    下载聪明的规则,激活它。现在你需要一个插件来注册你的规则:你可以创建一个新的插件,或者在你正在开发的插件中插入以下代码。。。

    add_action(\'plugins_loaded\', \'register_my_rules\');
     
    function register_my_rules() {
     
        // next line ensure function runs only if Clever Rules is installed
        if ( ! function_exists(\'register_clever_rule\') ) return;
     
        $args = array( \'route\' => \'/projects/map/\', \'query\' => \'post_type=projects\' );
    
        register_clever_rule( $args )->template(\'your-specific-template.php\');
     
    }
    
    这3行代码is the only thing you need. 如果你为此创建了一个新插件,那么当然要激活它。

    任何默认URL都不会受到影响。

    \'your-specific-template.php\' 可以是父主题甚至子主题中的模板文件。当然,您可以根据需要自定义查询并使用其他插件功能。

    如果你喜欢这个系统,你可以使用相同的插件来注册你需要的所有规则。

    注:我正在开发该插件的新版本,该插件的性能会更高(当有很多规则时,只有一个规则是没有问题的),允许在主题中注册规则,有一点不同的API和一些附加功能。它将很快公开发布,然而,当前版本也可以使用。

    相关推荐

    Dynamic Endpoints

    我在WordPress外部有一个数据库表,需要为其创建端点。我已经创建了一个页面/cars/ 我计划使用页面模板生成链接。我希望url看起来像/cars/camaro/ ()/cars/%model%/ ). 起初,我认为我可以使用端点,但不知道如何根据从模型表中提取的段塞使它们动态。我也不确定使用Permalink结构标签是更容易还是更好。我甚至不完全确定从哪里开始,我以前创建过“静态”端点,所以我有一个基础可以跳出,但当我到达request 我不知道该怎么办。/** * Add endpoi