Manul Tech

WordPressの投稿ページは基本2カラムだけど、それを1カラムにして各ボックス位置を固定する方法。


まずは強制1カラム

これは get_user_option_screen_layout_{post_type} フィルターでカラム数を返せばOK。

add_filter('get_user_option_screen_layout_{post_type}', 'one_column_screen_layout');
function one_column_screen_layout(){
	return 1;
}

次に各ボックスの固定

これは少し手こずった。検索してもあんまり出てこないし、あったと思ったらWPのデフォルト機能のドラッグでやる方法を記事にしているものだったり笑。
Qiitaの記事が見つかったけど、jQueryでやるとか、レイアウトが崩れる場合があるとかで、う〜んという感じ。

ドラッグでボックスを移動させた後はその位置が保存されるわけだから、DBにレイアウト情報が残っているはず!と思ってもう少し深掘りしてみるとこちらのページを発見。

$page = $screen->id;
$sorted = get_user_option("meta-box-order_$page");

ちょっとコードを省略したけど、ボックスのソート情報は$sortedに入っているみたい。中身はだいたいこんな感じの配列。

Array
(
    [side] => categorydiv,tagdiv,submitdiv
    [normal] => custom_metabox0,custom_metabox1,custom_metabox2
    [advanced] => 
)

(「advanced」ってどこなんだろ。まぁ今回はいいか)

今回は1カラムにして、登録漏れを少しでも軽減するために公開ボックスを一番下に置きたい。そこでこの情報にフィルターをかけて、すべての要素をnormalキーに集約することに。

add_filter('get_user_option_meta-box-order_{post_type}', 'fix_layout', 10, 3);
function fix_layout($result, $option, $user){
	return [
	 	'side' => '',
 		'normal' => 'custom_metabox0,custom_metabox1,custom_metabox2,categorydiv,tagdiv,submitdiv'
 		'advanced' => '',
	];
}

できた!!
ついでにドラッグができないようにjQueryで以下のように。(ここはjQuery笑)

<script type="text/javascript">
	$('.meta-box-sortables').sortable('disable');
</script>

そして弄られないように「表示オプション」も非表示に。

<style media="screen">
	#screen-options-link-wrap{
		display: none;
	}
</style>

おしまい。