如何在多个视图下显示自定义支柱类型?

时间:2012-03-15 作者:JR.

我想基于URL创建具有多个视图的自定义帖子类型。

E、 例如,假设我有一个“Product”post类型。我想要以下内容:

2 个回复
SO网友:chrisguitarguy

你想要的是rewrite endpoint.

您已经熟悉这些。WordPress的URL以结尾feed 是一个简单的重写端点,您可以添加自己的端点!

add_rewrite_endpoint 接受两个参数:所需的端点和所需位置的“掩码”。“mask”只是一个数字,您可以使用它进行一些位运算,以指定端点的位置。从WP 3.4开始,您可以指定自定义ep_mask 注册帖子类型时。

基本要点:勾入init, 呼叫add_rewrite_endpoint, 指定帖子类型的自定义EP掩码。下面是一个非常快速的示例(作为插件here):

<?php
class WPSE45713
{
    const EP = 262144;

    private static $ins = null;

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public static function init()
    {
        add_action(\'plugins_loaded\', array(self::instance(), \'_setup\'));
        register_activation_hook(__FILE__, array(__CLASS__, \'activate\'));
        register_deactivation_hook(__FILE__, array(__CLASS__, \'deactivate\'));
    }

    public static function activate()
    {
        self::instance()->register();
        self::instance()->endpoints();
        flush_rewrite_rules();
    }

    public static function deactivate()
    {
        flush_rewrite_rules();
    }

    public function _setup()
    {
        add_action(\'init\', array($this, \'register\'));
        add_action(\'init\', array($this, \'endpoints\'), 15);
        add_filter(\'request\', array($this, \'filter_request\'));
    }

    public function register()
    {
        register_post_type(\'product\', array(
            \'label\'     => __(\'Products\', \'wpse\'),
            \'public\'    => true,
            \'rewrite\'   => array(
                \'ep_mask\'   => self::EP,
            ),
        ));
    }

    public function endpoints()
    {
        add_rewrite_endpoint(\'detailed\', self::EP);
    }

    public function filter_request($vars)
    {
        if(isset($vars[\'detailed\']))
            $vars[\'detailed\'] = true;

        return $vars;
    }
}
唯一的缺点是端点被用作/<endpoint_name>/<some_value>. 所以没有<some_value> 从技术上讲,呈现端点将不起作用--因此过滤器连接到request. 检查端点是否已设置,如果已设置,请将其设置为true。

这也意味着/detailed/asdf 也能很好地工作/detailed/. 这不是一个大问题,但需要注意。

在前端,您可以使用get_query_var:

<?php
if(get_query_var(\'detailed\'))
{
    // we\'re on /product/some-product/detailed/
    // do stuff!
}
add_rewrite_endpoint 添加与为端点指定的名称相同的查询变量。detailed 在这种情况下。

SO网友:moraleida

可能不是最好的方法,但有一种方法可以做到这一点:将您的CPT设置为层次结构,这样它将允许家长,并允许它使用this, this 或其他方法。

一旦您以这种方式设置了内容,请组织您的CPT,使每个CPT都是“详细”、“摘要”和“xml”子页面的父页面(我几乎可以肯定,您可以自动执行此操作,并连接到Save post挂钩,我现在记不起它的名称)。

这样,您就可以为每种“类型”的子页面调整模板(您可能希望用自定义值标识它们),以便它们以您想要的方式收集信息。

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register