Varsayılan ekran seçenekleri nasıl ayarlanır?


20

Ekran seçeneklerini kullanarak meta kutuları gizlemek, bunları kaldırmak veya kullanıcı rolleriyle sınırlamak yerine, yalnızca kullanıcı için meta kutuyu "işaretini kaldırmak" istersiniz.

Ben bir kullanıcı için bir DB değişiklik yapacak herhangi bir kod, onlar sadece sıfırlamak için sayfaya her vurduklarında çalıştırmak için izin verilmeyeceğini çünkü bu zor olacağını görüyorum. Ama çekirdeği kodladığımdan daha akıllı insanlar, belki de bir yolu var. Ve eğer varsa, bilmek için ölüyorum.

Herhangi bir fikir?


Kullanıcı adı başına, tüm kullanıcıları adlarının yanında bir onay kutusuyla dolduran ve meta kutuları veya birden çok meta kutuyu göstermek için bir filtreye bağlayan kendi tür eklentinizi oluşturmanız gerekir.
Wyck

By varsayılan onlar yeni kullanıcı oluşturulduğunda, doğru bir kez uygulanmalıdır demek?
Rarst

Yanıtlar:


25

Yönetici yayını ekranındaki meta kutulara mı bakıyorsunuz?

Bunun için bir eklentiye ihtiyacınız yoktur, aşağıdakileri function.php dosyasına bırakın.

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

Temel olarak, şu anda oturum açmış olan kullanıcı için wp_usermeta tablosunda kaydedilmiş bazı meta_değerleri değiştiriyorsunuz.

Bu işlevi kullanmanın iki yolu vardır: 'user_register' dizinine veya 'admin_init' dizinine bağlanabilirsiniz.

'User_register' kullanmanın avantajı, bu işlevin yalnızca yeni bir kullanıcı kaydedildiğinde (dolayısıyla daha düşük ek yük) tetiklenmesidir. Ancak, zaten var olan kullanıcılar için çalışmaz.

Zaten var olan kullanıcılar için çalışmasını istiyorsanız, 'admin_init' öğesine bağlanın. Tabii ki dezavantajı, artık bu işlev, bir kullanıcı yönetici sayfasına her gittiğinde tetiklenmesidir.


15
Bu değil bir tema iş ve functions.php içine ait değil.
fuxia

6
@toscho Gerçekten buna katılmıyorum. Doğal olarak bunu bir eklentiye koyabilirsiniz, ancak örneğin kendiniz veya belki de belirli kutuları görmeye ihtiyaç duymayan bir müşteri için bir tema oluşturuyorsanız, bunu neden bir eklentiye dahil etmekle birlikte gelen ek yönetim ek yükünü eklemelisiniz. Bu işlevi function.php dosyasına bırakarak, bir eklentinin yüklendiğinden ve etkinleştirildiğinden emin olmaksızın tema deneyiminin tutarlı olmasını sağlarsınız.
drebabels

10
Orada hiçbir bir eklentiyi kullanarak havai. Bu anında ölmesi gereken bir efsane. Ayrıca, kullanım kısıtlamanız sorunun bir parçası değildi. Cevabınız binlerce acemi tarafından okundu. Bazı özel durumlarda işe yarayan bir şeyle değil, yazabileceğiniz en iyi kodla onlara yardımcı olacaksınız. :)
fuxia

+1 İyi yanıt - bazen bunları açıkça ayarlamak istersiniz. Bu iyi bir temeldir ve elbette bu kod gerektiğinde çağrılacak şekilde kolayca değiştirilebilir (örneğin yeni bir kullanıcı ekleyerek), böylece gerçekten "varsayılan" seçenekleri belirlersiniz ve bunları değiştiren kullanıcılar için seçenekleri zorlamazsınız. Bu kodu temamın functions.phpdosyasına ekleyeceğim çünkü varsayılan seçenekler geliştirdiğim temanın temsil ettiği / barındırdığı belirli bir proje için.
cwd

1
Bu Yanıt yazıldıktan birkaç ay sonra, çekirdeğe eklenen ve bu yanıtı geçersiz kılacak filtreler
WraithKenny

16

Kullanıcı, ekran seçeneklerindeki tercihlerini değiştirmediği sürece gösterilmeyen değiştirmeye izin veren bir default_hidden_meta_boxesfiltre vardır get_hidden_meta_boxes().


7

Önceden yayınlanmış üç çözüm hakkında kod yorumum var, aynı zamanda genel bir yorum var

Yetersiz bir seçim sunarlar: ya kullanıcının Ekran Seçenekleri onay kutusu seçimini geçersiz kılar; veya saygı gösterin ancak kullanıcı diğer meta_box'lar için bile veya kodunuz WP'de olmadan önce kullanıcı onay kutularını değiştirdiyse kodunuzun yoksayılmasını sağlayın. Saygılı seçim sadece tüm kullanıcılarınız yeniyse yararlı görünüyor. En iyi çözüm, belirli meta_box varsayılanlarınızın kullanıcı tarafından değiştirilip değiştirilmediğini belirlemek için özel bir kullanıcı seçeneği ayarlamak ve buna saygı duymaktır. Hayır, bu kodu yazmadım! Kolay olmalı ... :)

Üç çözüm şöyle:

1. WraithKenny'nin hidden_meta_boxesçözümü user_option'ı geçersiz kılan çözümdür. Tüm gönderi türlerini ('gönderi', 'sayfa', 'bağlantı', 'ek' ve tüm özel gönderi türlerini kapsadığını unutmayın. Belirli olmasını istemediğiniz sürece sorun değil. add_meta_box()Aramalarınızda post_type öğelerini belirttiniz . Bunları eşleştirmeyi deneyebilir veya eşleşmeyenler göz ardı edileceği için kanatlayabilirsiniz. Filtrede post_type öğesini bilmek istiyorsanız, extra screenparametresini kullanabilirsiniz :

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_boxes Rarst'ın dediği gibi user_option'a saygı duyar. Olduğu gibi hidden_meta_boxes, post_types'i ayırt etmek için $ screen parametresini kullanabilirsiniz.

3. Drebabels'in set_user_metaboxes () işlevi user_option'a da saygı gösterir. 'Yazı' düzenleme ekranı için kodlanmış olduğuna dikkat edin. 'Sayfa' düzenleme ekranını ve diğer post_types'i işlemek için kodu bu döngüde sarın:

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

Evet, get_user_metaolmalı get_user_option. Tek site için önemli değil, hatta çoklu site için muhtemelen önemli değil. Wp-admin / include / ajax-actions.php adresine bakın: update_user_option'gerçek' global parametreye sahiptir.


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

Ayrıca, hidden_meta_boxesher sayfa yüklemesinde meta kutuyu "gizleyecek" işaretini kaldıracak (ancak veritabanını güncellemek zorunda kalmayacak) bir filtre de vardır . Kutuyu kendileri işaretleyene kadar yeni kullanıcılar için kapalı olmasını istiyorsanız , Rarst'ın yanıtını kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.