क्षमताओं और कस्टम पोस्ट प्रकार


30

मेरे पास एक कस्टम पोस्ट प्रकार है जिसे मैं कुछ भूमिकाओं तक पहुंच को प्रतिबंधित करना चाहता हूं, हालांकि, मैंने पहले ही कस्टम पोस्ट प्रकार का उपयोग करके सामग्री जोड़ दी है और अब मुझे उन्हें प्रतिबंधित करना होगा। क्षमता_टाइप 'पोस्ट' था

'capability_type' => 'post'

यह ठीक है कि सामग्री बैकएंड में दिखाई दे रही है, लेकिन अब जैसे ही मैं किसी भी क्षमता को जोड़ता हूं, बैकेंड से सामग्री गायब हो जाती है?

मैंने अपने स्वयं के निर्माण के लिए बहुवचन परिभाषाओं को शामिल करने के लिए क्षमता प्रकार को अनुकूलित करने की कोशिश की है, लेकिन जैसे ही मैं हटाता हूं या क्षमता प्रकार बदल जाता है!

पूरा कोड:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

मैंने इसे पूरी तरह से नए कस्टम पोस्ट प्रकार के साथ भी परीक्षण किया है और क्षमता प्रकार की परवाह किए बिना मुझे एक ही मुद्दा मिलता है जैसे कि अगर मैं इसे हटा देता हूं और अपना कस्टम जोड़ देता हूं:

'capability_type' => array('movie','movies');

जवाबों:


40

मैजिकरैडबाउट के साथ त्वरित बातचीत के बाद, जिसने जस्टिन टडलॉक से एक उपयोगी संसाधन को इंगित किया , यह पता चलता है कि कस्टम पोस्ट प्रकारों के लिए क्षमताएं वास्तव में मौजूद नहीं हैं जब तक आप भूमिका के लिए add_cap का उपयोग नहीं करते हैं, उदाहरण के लिए निम्न कस्टम पोस्ट प्रकार के लिए:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

अतिरिक्त क्षमताओं को वास्तव में बैकएंड में काम करने की अनुमति के लिए एक भूमिका में जोड़ा जाना चाहिए, जिसमें 'व्यवस्थापक' भी शामिल है - उदाहरण के लिए:

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

मुझे उम्मीद है कि यह दूसरों के लिए उपयोगी है।


11
add_theme_caps()केवल एक बार ही बुलाया जाना चाहिए, न कि हर बार एक व्यवस्थापक पृष्ठ लोड किया जाता है। switch_themeथीम सक्रियण या register_activation_hookप्लगइन सक्रियण के लिए हुक के रूप में उपयोग करना बेहतर होगा ।
d79

अच्छा! मैं क्षमताओं को जोड़ने के लिए wp cli का उपयोग करना पसंद करता हूं अगर यह पूरी तरह से कस्टम / अद्वितीय साइट है क्योंकि यह एक ऐसी कार्रवाई है जिसे केवल एक बार होने की आवश्यकता है।
चौकोरसैंडी

8

जोड़ें:

map_meta_cap => true

आपके $ args सरणी के लिए। देखो यहाँ , और अधिक के लिए। आशा करता हूँ की ये काम करेगा!


1
यह वही है जो मैंने भी सोचा था, लेकिन पूरी तरह से मामला नहीं।
एरचमंड जूल 30'13

यह मेरे लिए काम किया
Shikyo

1

IMHO आप कभी भी अपनी क्षमताओं का मानचित्र नहीं बनाते हैं। ऐसा करने के लिए मैप मेटा कैप प्लगइन का उपयोग करना सुनिश्चित करें। http://codex.wordpress.org/Function_Reference/map_meta_cap

मैंने अपने कस्टम कैप्स को कोड के साथ मैन्युअल रूप से मैप करने की कोशिश में दिन बिताए। बस उस प्लगइन को स्थापित करें, अपने कैप को मैप करें और एक बार काम करने के लिए निष्क्रिय करें। यदि कस्टम भूमिकाएँ बना रहे हैं तो आपको सदस्य प्लगइन की आवश्यकता होगी ।

जिस तरह से मैं यह सुनिश्चित करने के लिए परीक्षण करता हूं कि मेरी भूमिका में कैपिबिलिटीज़ हैं (कभी-कभी आप शपथ लेते हैं लेकिन वास्तव में आप ऐसा नहीं करते हैं)

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

यह आपको दिखाएगा कि आपके पास वास्तव में कौन सी क्षमताएं हैं।


-1

कस्टम पोस्ट प्रकारों के लिए, मैं हुक का उपयोग करने का सुझाव नहीं देता:

add_action( 'registered_post_type', 'your_func', 10, 2 );

इसके बजाय मैं सुझाव देता हूं:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}

सुझाव एक अच्छा है, लेकिन यह सवाल का जवाब नहीं देता है।
अरोविराट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.