Manul Tech

WordPressでmetaboxや「公開」ボックスなどの位置を固定する方法

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でやるとか、レイアウトが崩れる場合があるとかで、う〜んという感じ。

Qiita
【Wordpress】投稿画面の「公開」メタボックスを何がなんでも一番下に配置する処理を考えてみた

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

みんめも
【WordPress】メタボックスの位置を全ユーザー統一する

$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>

おしまい。

コメント0