WordPress:在自定义posttypes中禁用“添加新”

有没有什么办法来禁用WordPress(3.0)中的自定义posttypes下添加新post的选项? 我查看了标签和参数,但找不到类似此function的任何内容。

充分相信Seamus Leahy

有一个元loggingfunctioncreate_posts没有logging,但在插入各种“添加新的”button和链接之前,WordPress使用它进行检查。 在您的自定义posttypes声明中,添加capabilities (不要与cap混淆),然后将其设置为false ,如下所示。

 register_post_type( 'custom_post_type_name', array( 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow', // false < WP 4.5, credit @Ewout ), 'map_meta_cap' => true, // Set to `false`, if users are not allowed to edit/delete existing posts )); 

请问为什么要这样做?

我首先会build议更改自定义posttypes的function,但是我不认为有限制谁可以添加post,但是只有谁可以编辑或发布post。

它看起来有点肮脏,但你可以尝试在$submenu全局中取消设置项目;

 function hide_add_new_custom_type() { global $submenu; // replace my_type with the name of your post type unset($submenu['edit.php?post_type=my_type'][10]); } add_action('admin_menu', 'hide_add_new_custom_type'); 

有一个元loggingfunctioncreate_posts没有logging,但在插入各种“添加新的”button和链接之前,WordPress使用它进行检查。 在您的自定义posttypes声明中,添加capabilities (不要与cap混淆),然后将其设置为false ,如下所示。

 register_post_type( 'custom_post_type_name', array( 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, // Removes support for the "Add New" function ( use 'do_not_allow' instead of false for multisite set ups ) ), 'map_meta_cap' => true, // Set to `false`, if users are not allowed to edit/delete existing posts )); 

上述解决scheme的组合隐藏链接(尽pipe有人可以很容易地直接inputURL。

提到的解决scheme@PavelChernov依赖于get_post_type() ,只有在列表中已经存在post的情况下才能使用。 如果没有post,该function将不会返回任何内容,“添加新的”链接将可用。 另一种方法:

 function disable_new_posts() { // Hide sidebar link global $submenu; unset($submenu['edit.php?post_type=CUSTOM_POST_TYPE'][10]); // Hide link on listing page if (isset($_GET['post_type']) && $_GET['post_type'] == 'CUSTOM_POST_TYPE') { echo '<style type="text/css"> #favorite-actions, .add-new-h2, .tablenav { display:none; } </style>'; } } add_action('admin_menu', 'disable_new_posts'); 

编辑:防止直接访问,如果有人input自己的URL: https : //wordpress.stackexchange.com/a/58292/6003

在WordPress和所有的职位types有能力create_posts。 这个function被用在几个核心文件中:

  1. 可湿性粉剂pipe理员\编辑外形advanced.php
  2. 可湿性粉剂pipe理员\ edit.php
  3. 可湿性粉剂pipe理员\包括\ post.php中
  4. 可湿性粉剂pipe理员\ menu.php
  5. 可湿性粉剂pipe理员\后new.php
  6. 可湿性粉剂pipe理员\压this.php
  7. WP-包括\ ADMIN,bar.php
  8. WP-包括\类-WP-XMLRPC-server.php
  9. WP-包括\ post.php中

所以,如果你真的想禁用这个事情,你必须按照angular色和每个职位types来做。 我使用伟大的插件“ 用户angular色编辑器 ”来pipe理每个angular色的function。

但是create_posts的能力呢? 那么这个function没有被映射,而且create_posts等于create_posts,所以我们应该修复这个问题并映射每个posttypes的能力。

所以你可以在你的functions.php中添加这段代码,你可以pipe理这个function。

 function fix_capability_create(){ $post_types = get_post_types( array(),'objects' ); foreach ( $post_types as $post_type ) { $cap = "create_".$post_type->name; $post_type->cap->create_posts = $cap; map_meta_cap( $cap, 1); } } add_action( 'init', 'fix_capability_create',100); 

所以在这里我们不隐藏或删除菜单元素…在这里,我们正在删除用户的能力(包括xmlrpc请求)。

动作是初始化,而不是admin_init或其他任何事情,因为优先级为100的init阻止在pipe理栏,边栏等(在所有wp界面中)显示“添加新的”。

WordPress的networking: 我发现,如果您作为networking​​的超级pipe理员login, Seamus Leahy的答案不起作用 ,如果用户没有能力,映射或其他方式,当current_user_can($ cap )由CMS调用。 通过挖掘核心,我发现你可以做到以下几点。

 register_post_type( 'custom_post_type_name', array( 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow', // Removes support for the "Add New" function, including Super Admin's ), 'map_meta_cap' => true, // Set to false, if users are not allowed to edit/delete existing posts )); 

被接受的答案隐藏了菜单项,但页面仍然可以访问。

 add_action("load-post-new.php", 'block_post'); function block_post() { if($_GET["post_type"] == "custom_type") wp_redirect("edit.php?post_type=custom_type"); } 

@ Staffan埃斯伯格,

这是隐藏自定义PostTypes中的添加新build或创build新button的最佳方法

 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false ), 'map_meta_cap' => true, 

它禁止在自定义posttypes中在pipe理菜单中和在posttypes列表上方创build新post。

我发现这个最简单的方法。 只需将此代码添加到主题的function.php

 function hd_add_buttons() { global $pagenow; if (is_admin()) { if ($_GET['post_type'] == 'custom_post_type_name') { echo '<style>.add-new-h2{display: none !important;}</style>'; } } } add_action('admin_head', 'hd_add_buttons'); 

禁止为已注册的posttypes创build新post:( postpage示例)

 function disable_create_newpost() { global $wp_post_types; $wp_post_types['post']->cap->create_posts = 'do_not_allow'; //$wp_post_types['page']->cap->create_posts = 'do_not_allow'; //$wp_post_types['my-post-type']->cap->create_posts = 'do_not_allow'; } add_action('init','disable_create_newpost');