画面オプションを使用してメタボックスを非表示にしたり、ユーザーロールに制限したりするのではなく、ユーザーのメタボックスを「オフ」にすることが目標です。
ユーザーのDBを変更するコードは、リセットされるだけなので、ページにアクセスするたびに実行することは許可されないため、これがいかに難しいかわかります。しかし、私がコアをコーディングするよりも頭がいいので、方法があるかもしれません。そして、もしあれば、私は知りたくありません。
何か案は?
画面オプションを使用してメタボックスを非表示にしたり、ユーザーロールに制限したりするのではなく、ユーザーのメタボックスを「オフ」にすることが目標です。
ユーザーのDBを変更するコードは、リセットされるだけなので、ページにアクセスするたびに実行することは許可されないため、これがいかに難しいかわかります。しかし、私がコアをコーディングするよりも頭がいいので、方法があるかもしれません。そして、もしあれば、私は知りたくありません。
何か案は?
回答:
管理者の投稿画面でメタボックスを参照していますか?
プラグインを必要としないためには、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」にフックします。もちろん、ユーザーが管理ページにアクセスするたびにこの関数が起動するという欠点があります。
functions.php
デフォルトのオプションは特定のプロジェクト用であり、開発中のテーマによって表されているため、このコードをテーマのファイルに追加します。
ユーザーが画面オプションで自分の設定を変更していない限り、表示されないものを変更できるdefault_hidden_meta_boxes
フィルターがありget_hidden_meta_boxes()
ます。
既に投稿された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」グローバルパラメーターがあります。
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
$hidden[] = 'your_metabox';
return $hidden;
}
またhidden_meta_boxes
、ページを読み込むたびにメタボックスを「非チェック」にする(非表示にする)フィルターもあります(ただし、データベースを更新する必要はまったくありません)。新しいユーザーが自分でチェックボックスをオンにするまでそれを無効にしたい場合は、Rarstの答えを使用してください。