IT박스

WordPress : 사용자 지정 게시물 유형에서 "새로 추가"비활성화

itboxs 2020. 12. 6. 21:20
반응형

WordPress : 사용자 지정 게시물 유형에서 "새로 추가"비활성화


WordPress (3.0)의 Custom Post Type에서 새 게시물을 추가하는 옵션을 비활성화하는 방법이 있습니까? 레이블과 인수를 조사했지만 그러한 기능과 유사한 것을 찾을 수 없습니다.


Seamus Leahy에 대한 전체 크레딧

여기create_posts문서화 된 메타 기능 이 있으며 WordPress에서 다양한 '새로 추가'버튼 및 링크를 삽입하기 전에 확인하는 데 사용됩니다. 사용자 정의 포스트 유형 선언에서 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
));

당신은 아마 설정할 수 있습니다 map_meta_captrue뿐만 아니라. 그렇지 않으면 더 이상 게시물의 편집 페이지에 액세스 할 수 없습니다.

왜 이렇게 하려는지 여쭤봐도 될까요?

처음에는 사용자 지정 게시물 유형에 대한 기능 변경을 제안했지만 게시물 추가 할 수있는 사람을 제한하지 않고 편집하거나 게시수있는 사람 만 제한하는 것이 있다고 생각 합니다.

약간 더러워 보이지만 $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');


여기create_posts문서화 된 메타 기능 이 있으며 WordPress에서 다양한 '새로 추가'버튼 및 링크를 삽입하기 전에 확인하는 데 사용됩니다. 사용자 정의 포스트 유형 선언에서 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_captrue뿐만 아니라. 그렇지 않으면 더 이상 게시물의 편집 페이지에 액세스 할 수 없습니다.


위의 솔루션 조합은 링크를 숨기는 데 효과적입니다 (누군가가 URL을 직접 쉽게 입력 할 수는 있지만).

@ 3pepe3언급솔루션get_post_type() 은 목록에 이미 게시물이있는 경우에만 작동합니다. 게시물이 없으면 함수는 아무것도 반환하지 않으며 "새로 추가"링크를 사용할 수 있습니다. 대체 방법 :

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

편집 : 누군가가 URL을 직접 입력하는 경우 직접 액세스를 방지하려면 : https://wordpress.stackexchange.com/a/58292/6003


워드 프레스 및 모든 포스트 유형에 대해 create_posts 기능이 있습니다. 이 기능은 여러 핵심 파일에서 사용됩니다.

  1. wp-admin \ edit-form-advanced.php
  2. wp-admin \ edit.php
  3. wp-admin \ includes \ post.php
  4. wp-admin \ menu.php
  5. wp-admin \ post-new.php
  6. wp-admin \ press-this.php
  7. wp-includes \ admin-bar.php
  8. wp-includes \ class-wp-xmlrpc-server.php
  9. wp-includes \ post.php

따라서이 기능을 정말로 비활성화하려면 역할 및 게시물 유형별로 수행해야합니다. 저는 훌륭한 플러그인 " User Role Editor "를 사용하여 역할 별 기능을 관리합니다.

하지만 create_posts 기능은 어떻습니까? 이 기능은 매핑되지 않았고 create_posts도 create_posts와 동일하므로이를 수정하고 게시물 유형별로 기능을 매핑해야합니다.

따라서이 코드를 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 요청 포함)을 제거합니다.

The action was init and not admin_init or anything else because init at priority 100 prevents the display of "add new" on admin bar, sidebar, etc (in all the wp interface).


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

Disable creating new post for registered post-types: (example for post and page)

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

WordPress Networks: I found that Seamus Leahy's answer doesn't work if you are logged in as a super admin of the network, it doesn't matter if the user doesn't have the capability, mapped or otherwise, when current_user_can($cap) is called by the CMS. By digging into the core I found you can do the following.

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

The accepted answer hides the menu item, but the page is still accessible.


@ Staffan Estberg,

This is best way to hide the Add New or Create New button in custom postypes

'capability_type'    => 'post',

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

        'map_meta_cap'       => true,

It disable to create new post in custom post types both side in admin menu and above the list of post type.


I found this simplest way for this. Just ad this code into theme’s 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');

As the question is 'how to disable add-new button on custom post type', and not 'how to restrict user editing custom post types', in my opinion the answer should be purely hiding the buttons with css, by adding this to the functions.php file :

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

참고URL : https://stackoverflow.com/questions/3235257/wordpress-disable-add-new-on-custom-post-type

반응형