如何在不让WordPress分配URL的情况下创建自定义帖子类型

时间:2018-03-16 作者:danielle

让我给你一个我想做的场景。我有一个自定义的帖子类型“customer”,我可以进入并“添加新客户”。这里我看到了我的自定义字段,如名称、徽标、评论等。问题是Wordpress为此生成了一个URL。这不是一个页面,所以我只是重定向所有http://website.com/customers/* 去其他地方,这样就没有人去这些页面了(现在)。

有没有办法在函数中注册我的自定义帖子类型。php文件(或其他方式)告诉Wordpress不要为其生成URL/实际页面?它实际上只是一个用来存放我的数据的插槽。

我的想法是,这可能与:\'capability\\u type=>\'post\'有关,或者与我过度关注的类似内容有关。

谢谢

3 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,这里有一些register_post_type 您应该使用的。

你的关键论点是:

  • public - 控制类型对作者可见的方式(show_in_nav_menus, show_ui) 和读者(exclude_from_search, publicly_queryable). 如果是假的,那么exclude_from_search 都是真的,publicly_queryable -错误的show_in_nav_menus - 错误,以及show_ui - 错误的So the CPT will be hidden all the way.

  • exclude_from_search - 是否从前端搜索结果中排除具有此帖子类型的帖子。默认值:与public 论点

  • publicly_queryable - 查询是否可以作为parse\\u request()的一部分在前端执行。默认值:的值public 论点So we have to et it true.

    show\\u ui-是否在管理员中生成用于管理此帖子类型的默认ui。默认值:的值public 论点

  • rewrite - 触发此帖子类型的重写处理。要防止重写,请设置为false。默认值:true,并将$post\\U type用作slug。So we have to set it false.

    您可以在下面找到代码:

    $labels = array( /*removed for example*/ );
    
    $args = array(
        \'labels\'             => $labels,
        \'description\'        => __( \'Description.\', \'your-plugin-textdomain\' ),
        \'public\'             => false,
        \'show_ui\'            => true,
        \'rewrite\'            => false,
        \'capability_type\'    => \'post\',
        \'hierarchical\'       => false,
        /* ... Any other arguments like menu_icon, and so on */
        \'supports\'           => array( /* list of supported fields */ )
    );
    
    register_post_type( \'customer\', $args );
    
    如果您不想了解所有参数,此生成器可能会有所帮助:https://generatewp.com/post-type/

    和往常一样,您可以在Codex中找到所有参数的列表:https://codex.wordpress.org/Function_Reference/register_post_type

SO网友:jdm2112

的参数之一register_post_type()publicly_queryable. 只需将其设置为false,即可防止创建单个页面。您可能还希望从搜索中排除,等等。

https://codex.wordpress.org/Function_Reference/register_post_type

在WP Codex中给出的示例中,您可以看到此参数设置为true. 根据您的具体需要,您可以使用public 参数或具有显式参数的可见性控制级别,如paspublicly_queryable.

https://codex.wordpress.org/Function_Reference/register_post_type#Example

Example code from WP Codex

add_action( \'init\', \'codex_book_init\' );
/**
 * Register a book post type.
 *
 * @link http://codex.wordpress.org/Function_Reference/register_post_type
 */
function codex_book_init() {
    $labels = array( /*removed for example*/ );

    $args = array(
        \'labels\'             => $labels,
        \'description\'        => __( \'Description.\', \'your-plugin-textdomain\' ),
        \'public\'             => true,
        \'publicly_queryable\' => true,
        \'show_ui\'            => true,
        \'show_in_menu\'       => true,
        \'query_var\'          => true,
        \'rewrite\'            => array( \'slug\' => \'book\' ),
        \'capability_type\'    => \'post\',
        \'has_archive\'        => true,
        \'hierarchical\'       => false,
        \'menu_position\'      => null,
        \'supports\'           => array( \'title\', \'editor\', \'author\', \'thumbnail\', \'excerpt\', \'comments\' )
    );

    register_post_type( \'book\', $args );
}
Post Type Archive这里需要注意的是,将public\\u queryable设置为false也会隐藏该帖子类型的归档页面。在上面的示例代码中book, 存档页位于https://yourdomain.com/book 也将被删除。

SO网友:Mark Kaplun

将重复@jdm2112用(希望)更清晰的英语所说的内容,并且完全没有代码;)

基本上你要找的是一个私人CPT。这种CPT对于以类似于POST的方式在DB中存储数据非常有用,这使您可以(可选)获得相同类型的管理接口,并在其上使用相同的查询、元和术语API。

“Private”实际上是一个误导性的词,不是因为内容是私有的,而是wordpress不会试图自己在前端发布它。如果愿意,可以在前端显示内容,但需要自己编写代码。在您的特定情况下,一种简单的方法是创建一个页面模板,其中显示该CPT中的所有帖子。这样,您就可以灵活地控制页面地址以及您可能希望在其中执行的任何SEO。

请记住,您可能需要重新设计许多默认功能,而将CPT公开,并在单个CPT页面上进行一种“查看更多客户端”的操作可能会更简单。

结束

相关推荐