デフォルトの画面オプションを設定するには?


20

画面オプションを使用してメタボックスを非表示にしたり、ユーザーロールに制限したりするのではなく、ユーザーのメタボックスを「オフ」にすることが目標です。

ユーザーのDBを変更するコードは、リセットされるだけなので、ページにアクセスするたびに実行することは許可されないため、これがいかに難しいかわかります。しかし、私がコアをコーディングするよりも頭がいいので、方法があるかもしれません。そして、もしあれば、私は知りたくありません。

何か案は?


ユーザー名ごとに、すべてのユーザーの名前の横にチェックボックスを追加し、メタボックスまたは複数のメタボックスを表示するためのフィルターにフックする、独自の種類のプラグインを作成する必要があります。
ワイク

デフォルト新しいユーザーが作成されたとき、彼らは正しい、一度適用されるべきである意味ですか?
Rarst

回答:


25

管理者の投稿画面でメタボックスを参照していますか?

プラグインを必要としないためには、functions.phpファイルに以下をドロップしてください。

// 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_usermetaテーブルに保存されているいくつかのmeta_valuesを変更しています。

この関数を使用するには2つの方法があります。「user_register」にフックするか、「admin_init」にフックすることができます。

「user_register」を使用する利点は、新しいユーザーが登録されたときにのみこの関数が起動することです(したがって、オーバーヘッドが低くなります)。ただし、すでに存在するユーザーには機能しません。

既に存在するユーザーに対して機能させたい場合は、「admin_init」にフックします。もちろん、ユーザーが管理ページにアクセスするたびにこの関数が起動するという欠点があります。


15
これはないテーマの仕事とのfunctions.phpに属していません。
FUXIA

6
@toscho私はそれにはまったく同意しません。当然、これをプラグインに入れることもできますが、たとえば、自分用に、または特定のボックスを表示する必要のないクライアント用にテーマを作成している場合、プラグインにこれ​​を含めることで生じる追加の管理オーバーヘッドを追加する理由があります。functions.phpファイルにドロップすることにより、プラグインがインストールされてアクティブになっていることを確認せずに、テーマのエクスペリエンスが一貫していることを確認できます。
ドレバベルズ

10
プラグインを使用してオーバーヘッドはありません。それはすぐに死ななければならない神話です。さらに、使用制限は質問の一部ではありませんでした。あなたの答えは何千人もの初心者によって読まれます。特定の状況で機能するようなものではなく、作成可能な最高のコードで支援します。:)
fuxia

+1良い答え-これらを明示的に設定したい場合があります。これは優れたベースであり、もちろん、このコードは必要に応じて簡単に変更して(たとえば、新しいユーザーを追加するなど)、実際に「デフォルト」オプションを設定し、それらを変更するユーザーにオプションを強制しません。functions.phpデフォルトのオプションは特定のプロジェクト用であり、開発中のテーマによって表されているため、このコードをテーマのファイルに追加します。
CWD

1
この回答が作成されてから数か月後に、コアにフィルターが追加されたため、この回答は廃止されました。
レイスケニー

16

ユーザーが画面オプションで自分の設定を変更していない限り、表示されないものを変更できるdefault_hidden_meta_boxesフィルターがありget_hidden_meta_boxes()ます。


7

既に投稿された3つのソリューションに関するコードコメントがありますが、一般的なコメントもあります

それらは次善の選択肢を提示します。ユーザーの[画面オプション]チェックボックスの選択肢を上書きするか、またはそれを尊重しますが、ユーザーが他のmeta_boxでもチェックボックスを変更した場合、またはコードがWPにある前にコードを無視します。敬意を持って選択することは、すべてのユーザーが初めての場合にのみ役立つようです。最善の解決策は、カスタムユーザーオプションを設定して、ユーザーが特定のmeta_boxのデフォルトを変更したかどうかを判断し、それを尊重することです。いいえ、私はそのコードを書いていません!簡単なはずです... :)

投稿された3つのソリューション:

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. Rarstが言うようにdefault_hidden_meta_boxes、user_optionを尊重します。と同様にhidden_meta_boxes、$ screenパラメーターを使用してpost_typesを区別できます。

3. Drebabelsのset_user_metaboxes()関数もuser_optionを尊重します。「投稿」編集画面用にハードコードされていることに注意してください。「ページ」編集画面、およびその他のpost_typesを処理するには、このループでコードをラップします。

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。単一サイトの場合は重要ではなく、マルチサイトの場合でもおそらく問題ではありません。理由についてupdate_user_optionは、wp-admin / includes / ajax-actions.phpを参照してください。「true」グローバルパラメーターがあります。


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の答えを使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.