WordPress: 在自定义文章类型上禁用“添加新内容”

有没有办法禁用在 WordPress (3.0)中的自定义文章类型下添加新文章的选项?我查看了标签和参数,但找不到任何类似的特性。

58803 次浏览

上述解决方案的组合可以隐藏链接(尽管有人可以很容易地直接键入 URL)。

提到的解决方案@3pepe3依赖于 get_post_type(),它只有在列表中已经有一个帖子的情况下才能工作。如果没有文章,该函数将不返回任何内容,并且“ Add New”链接将可用。另一种方法:

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');

编辑: 为了防止直接访问,如果有人键入自己的网址: https://wordpress.stackexchange.com/a/58292/6003

有一个元能力 create_posts记录在案,是 WordPress 用来检查之前插入各种’添加新’按钮和链接。在自定义的 post 类型声明中,添加 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
));

您可能还需要将 map_meta_cap设置为 true。没有它,你将无法访问文章的编辑页面了。

我找到了这个最简单的方法。只需要将这个代码添加到主题的 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');
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");
}

在 wordpress 中,对于所有的 post 类型,都有 create _ post 功能。该功能用于几个核心文件:

  1. Wp-admin edit-form-Advanced. php
  2. Wp-admin edit. php
  3. Wp-admin 包括 post.php
  4. Wp-admin menu.php
  5. Wp-admin post-new. php
  6. Wp-admin press-this. php
  7. 包括 admin-bar. php
  8. Wp-包括 class-wp-xmlrpc-server. php
  9. 包括 post.php

因此,如果你真的想禁用这个功能,你必须做到每个角色和每个帖子类型。 我使用伟大的插件“ 用户角色编辑器”来管理每个角色的能力。

但是 create _ post 的功能是什么呢?这个功能没有映射,而且 create _ post 等于 create _ post,所以我们应该修复这个问题,并映射每个帖子类型的功能。

因此,您可以将这段代码添加到 Functions.php 中,并且可以管理这个功能。

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 请求)。

这个操作是 init,而不是 admin _ init 或其他任何操作,因为优先级为100的 init 会阻止在管理栏、边栏等(在所有 wp 接口中)显示“ add new”。

WordPress Networks: 我发现 Seamus Leahy 的回答不起作用如果你是作为网络的超级管理员登录的,那么当 CMS 调用 current _ user _ can ($cap)时,用户是否具备这个功能并不重要。通过挖掘核心,我发现你可以做到以下几点。

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
));

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

@ Staffan Estberg,

这是在自定义邮递类型中隐藏“添加新建”或“创建新建”按钮的最佳方法

'capability_type'    => 'post',


'capabilities'       => array( 'create_posts' => false ),


'map_meta_cap'       => true,

它禁用在管理菜单和文章类型列表上方的自定义文章类型中创建新文章。

禁用为已注册的帖子类型创建新帖子: (例如 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');

因为问题是“如何在自定义文章类型上禁用添加新按钮”,而不是“如何限制用户编辑自定义文章类型”,在我看来,答案应该是纯粹地用 css 隐藏按钮,将其添加到 function. php 文件中:

add_action( 'admin_head', function(){
ob_start(); ?>
<style>
#wp-admin-bar-new-content{
display: none;
}
a.page-title-action{
display: none !important;
}
#menu-posts-MY-CUSTOM-POST-TYPE > ul > li:nth-child(3) > a{
display:none;
}
</style>
<?php ob_end_flush();
});