डिफ़ॉल्ट स्क्रीन विकल्प कैसे सेट करें?


20

मैं स्क्रीन विकल्पों का उपयोग करके मेटा बॉक्सों को छिपाने में सक्षम होना चाहूंगा, उन्हें हटाने या उपयोगकर्ता भूमिकाओं तक सीमित करने के बजाय, लक्ष्य उपयोगकर्ता के लिए मेटा बॉक्स को "अनचेक" करना है।

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

कोई विचार?


उपयोगकर्ता नाम के अनुसार आपको अपने स्वयं के प्रकार का एक प्लगइन बनाना होगा जो सभी उपयोगकर्ताओं को उनके नाम के आगे एक चेकबॉक्स के साथ पॉप्युलेट करता है और मेटा बॉक्स, या कई मेटा बॉक्स दिखाने के लिए एक फिल्टर में हुक करता है।
व्येक

द्वारा डिफ़ॉल्ट तुम्हारा मतलब वे एक बार जब नया उपयोगकर्ता बनाए जाने, सही लागू किया जाना चाहिए?
रारस्ट

जवाबों:


25

आप व्यवस्थापक पोस्ट स्क्रीन पर मेटाबेस की बात कर रहे हैं?

इसके लिए आपको एक प्लगइन की जरूरत नहीं है, बस अपने फंक्शन्स को डाउनलोड करें।

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

मूल रूप से क्या हो रहा है कि वर्तमान में लॉग इन उपयोगकर्ता के लिए, आप कुछ सहेजे गए मेटा_वेल्यूशन को wp_useteta तालिका में बदल रहे हैं।

इस फ़ंक्शन का उपयोग करने के दो तरीके हैं, आप या तो 'user_register' में हुक कर सकते हैं या आप 'admin_init' में हुक कर सकते हैं।

'User_register' का उपयोग करने का लाभ यह है कि यह फ़ंक्शन केवल तभी फायर करेगा जब कोई नया उपयोगकर्ता पंजीकृत हो (इस प्रकार कम ओवरहेड)। हालांकि यह उन उपयोगकर्ताओं के लिए काम नहीं करेगा जो पहले से मौजूद हैं।

यदि आप चाहते हैं कि यह उन उपयोगकर्ताओं के लिए काम करे जो पहले से मौजूद हैं, तो 'admin_init' में हुक करें। बेशक नुकसान यह है कि अब यह फ़ंक्शन हर बार उपयोगकर्ता द्वारा व्यवस्थापक पृष्ठ पर जाने पर आग लगाता है।


15
यह वह जगह है नहीं एक विषय नौकरी और एक functions.php में संबंधित नहीं है।
FUXIA

6
@toscho मैं वास्तव में इससे सहमत नहीं हूं। स्वाभाविक रूप से आप इसे एक प्लगइन में डाल सकते हैं, लेकिन यदि आप उदाहरण के लिए अपने लिए या शायद एक ग्राहक के लिए एक थीम का निर्माण कर रहे हैं, जिसमें कुछ बॉक्स देखने की आवश्यकता नहीं है, तो अतिरिक्त प्रबंधन ओवरहेड को जोड़ें, जो इसे प्लगइन में शामिल करता है। इसे फ़ंक्शन में छोड़ने से। आप यह सुनिश्चित करते हैं कि थीम के लिए अनुभव संगत है बिना यह सुनिश्चित करने के लिए कि प्लगइन स्थापित और सक्रिय है।
drebabels

10
नहीं है कोई एक प्लगइन का उपयोग करके भूमि के ऊपर। यह एक मिथक है जिसे तुरंत मरना है। साथ ही, आपका उपयोग प्रतिबंध सवाल का हिस्सा नहीं था। आपके उत्तर को हजारों नौसिखियों ने पढ़ा है। आप उन्हें सबसे अच्छे कोड के साथ मदद कर सकते हैं जो आप लिख सकते हैं, न कि कुछ विशिष्ट स्थितियों में थोड़े काम करता है। :)
FUXIA

+1 अच्छा जवाब - कभी-कभी आप इन्हें स्पष्ट रूप से सेट करना चाहते हैं। यह एक अच्छा आधार है, और निश्चित रूप से इस कोड को आसानी से संशोधित किया जा सकता है जब आवश्यक हो (उदाहरण के लिए एक नया उपयोगकर्ता जोड़ते हुए), ताकि आप वास्तव में "डिफ़ॉल्ट" विकल्प सेट कर रहे हैं और उन उपयोगकर्ताओं पर विकल्प मजबूर न करें जो उन्हें बदलते हैं। मैं इस कोड को अपनी थीम की functions.phpफ़ाइल में शामिल करूंगा क्योंकि डिफ़ॉल्ट विकल्प एक विशेष परियोजना के लिए हैं, जो कि मैं जिस विषय को विकसित कर रहा हूं, उसका प्रतिनिधित्व करता / करती हूं।
cwd

1
इस उत्तर के लिखे जाने के कुछ महीने बाद, फ़िल्टर जहाँ इस उत्तर को अप्रचलित बनाने के लिए कोर में जोड़ा गया।
व्रिथकिनी

16

इसमें default_hidden_meta_boxesफ़िल्टर है get_hidden_meta_boxes()जो संशोधित करने की अनुमति देता है जो तब तक नहीं दिखाए जाते जब तक उपयोगकर्ता स्क्रीन विकल्पों में अपनी वरीयताओं को संशोधित नहीं करता।


7

मेरे पास पहले से पोस्ट किए गए तीन समाधानों के बारे में कोड टिप्पणियां हैं, लेकिन एक सामान्य टिप्पणी भी है

वे एक उप-प्रस्तुतियाँ पसंद पेश करते हैं: या तो उपयोगकर्ता के स्क्रीन विकल्प चेकबॉक्स पसंद को ओवरराइड करें; या इसका सम्मान करें लेकिन क्या आपके कोड को अनदेखा कर दिया गया है यदि उपयोगकर्ता ने कभी चेकबॉक्स को बदल दिया है, यहां तक ​​कि अन्य मेटा_बॉक्स के लिए, या इससे पहले कि आपका कोड WP में था। लगता है कि सम्मानजनक विकल्प केवल तभी उपयोगी है जब आपके सभी उपयोगकर्ता नए हों। सबसे अच्छा समाधान यह निर्धारित करने के लिए एक कस्टम उपयोगकर्ता विकल्प निर्धारित करना होगा कि क्या आपके विशिष्ट मेटा_बॉक्स डिफॉल्ट को उपयोगकर्ता द्वारा बदल दिया गया है, और इसका सम्मान करें। नहीं, मैंने वह कोड नहीं लिखा है! आसान होना चाहिए ... :)

तीन समाधान पोस्ट किए गए:

1. WraithKenny का hidden_meta_boxesसमाधान वह है जो user_option को ओवरराइड करता है। ध्यान दें कि इसमें सभी पोस्ट प्रकार ('पोस्ट', 'पेज', 'लिंक', 'अटैचमेंट' और किसी भी कस्टम पोस्ट प्रकार) शामिल हैं। यह तब तक ठीक है जब तक आप इसे विशिष्ट नहीं बनाना चाहते। आपने अपनी add_meta_box()कॉल में post_type निर्दिष्ट किया है । आप उन से मिलान करने का प्रयास कर सकते हैं, या बस इसे पंख लगा सकते हैं क्योंकि जो मेल नहीं खाते हैं उन्हें अनदेखा किया जाएगा। यदि आप फ़िल्टर में post_type जानना चाहते हैं, तो आप अतिरिक्त screenपैरामीटर का उपयोग कर सकते हैं :

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. जैसा कि रर्स्ट कहते हैं, default_hidden_meta_boxesuser_option का सम्मान करता है। जैसा कि hidden_meta_boxes, आप post_types को अलग करने के लिए $ स्क्रीन पैरामीटर का उपयोग कर सकते हैं।

3. Drebabels का set_user_metaboxes () फ़ंक्शन भी user_option का सम्मान करता है। ध्यान दें कि यह 'पोस्ट' एडिट स्क्रीन के लिए हार्ड-कोडेड है। 'पेज' एडिट स्क्रीन, और अन्य पोस्ट_टाइप्स को संभालने के लिए, कोड को इस लूप में लपेटें:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

हाँ, get_user_metaहोना चाहिए get_user_option। एकल-साइट के लिए यह कोई मायने नहीं रखता है, और बहु-साइट के लिए भी यह संभव नहीं है। Wp-admin देखें / शामिल करें / ajax-actions.php क्यों: update_user_optionके लिए 'सही' वैश्विक पैरामीटर है।


1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

hidden_meta_boxesहर पृष्ठ लोड पर मेटाबॉक्स (इसे छिपाकर) बनाना (लेकिन इसे डेटाबेस को अपडेट नहीं करना होगा) को "अनचेक" करना भी फ़िल्टर है। यदि आप नए उपयोगकर्ताओं के लिए इसे बंद करना चाहते हैं , जब तक कि वे स्वयं बॉक्स की जांच न कर लें, Rarst के उत्तर का उपयोग करें।

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