web-dev-qa-db-ja.com

デフォルトの画面オプションを設定する方法

メタボックスを削除したり、ユーザーの役割に限定したりするのではなく、画面オプションを使用してメタボックスを非表示にできるようにしたいと考えています。

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

何か案は?

20
developdaly

あなたは正しい管理ポスト画面上のメタボックスを参照していますか?

そのためには、プラグインは必要ありません。次のコードを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'にフックしてください。もちろん、デメリットは、この機能がユーザーが管理ページにアクセスするたびに起動することです。

23
drebabels

get_hidden_meta_boxes() にはdefault_hidden_meta_boxesフィルタがあり、ユーザーが画面オプションの設定を変更していない限り表示されません。

16
Rarst

私はすでに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と同様に、post_typeを区別するために$ screenパラメータを使用できます。

3。 Drebabelsのset_user_metaboxes()関数もuser_optionを尊重します。 「投稿」編集画面ではハードコードされています。 'page'編集画面や他のpost_typeを処理するには、このループでコードをラップしてください。

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_metaget_user_optionであるべきです。シングルサイトの場合は問題にならず、マルチサイトの場合も問題になりません。理由はwp-admin/includes/ajax-actions.phpを見てください。update_user_optionは 'true'グローバルパラメータを持ちます。

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

ページを読み込むたびにメタボックスを非表示にする(非表示にする)hidden_meta_boxesフィルタもあります(ただし、データベースを更新する必要はまったくありません)。自分がチェックボックスをオンにするまで、 new /ユーザーに対して無効にしたい場合は、Rarstの回答を使用してください。

1
WraithKenny