remove_menu_pageで非表示にしてもアクセスすることは可能
WordPress Codexに注意書きが・・
remove_menu_pageを利用して効果的に管理メニューを削除できることを知り設定してみたものの、URLを直うちでアクセスするとどうなるのだろうか?と少し気になったので調べてみた。
WordPress Codexには以下のように書いてある。
ユーザーが直接アクセスするのを防止するものではない、ということに注意してください。
あくまでも非表示であって、機能そのものを無効化する効果はremove_menu_pageでは得られないようです。
このあたりの仕様からremove_menu_pageは、閉じたネットワーク内で利用するシステムの暫定的な非表示機能で、管理メニューの機能そのものを無効化するためには別途工夫が必要と判断した(その認識が正しければ)。
無効化の方法
remove_menu_pageには戻り値がある
非表示にしたURLの一部を利用して、リクエストURLを比較することで判定処理を行い、trueであれば404エラーを返すという内容で非表示にした管理メニューの無効化を行う案を具体化した。
remove_menu_pageには戻り値があるということなので、変数に格納してvar_dump()してみた。
1 2 | $data [] = remove_menu_page( 'upload.php' ); // メディアの非表示 $data [] = remove_menu_page( 'edit.php?post_type=page' ); // 固定ページの非表示 |
上のように配列に戻り値を格納して、結果のデータ構造を確認すると以下のようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | array (2) { [0]=> array (7) { [0]=> string(12) "メディア" [1]=> string(12) "upload_files" [2]=> string(10) "upload.php" [3]=> string(0) "" [4]=> string(24) "menu-top menu-icon-media" [5]=> string(10) "menu-media" [6]=> string(4) "none" } [1]=> array (7) { [0]=> string(15) "固定ページ" [1]=> string(10) "edit_pages" [2]=> string(23) "edit.php?post_type=page" [3]=> string(0) "" [4]=> string(23) "menu-top menu-icon-page" [5]=> string(10) "menu-pages" [6]=> string(4) "none" } } |
3番目の配列([2])に非表示化したメニューのURLが格納されているので、このデータをユーザーのリクエストURLと比較する。
戻り値を配列化してforで回す
remove_menu_pageの戻り値はすべて配列化して、配列の数だけ判定処理を行い、結果がtrueであれば404エラーとする。
具体的には以下のような感じになる。
1 2 3 4 5 6 7 8 9 10 | $data_c = count ( $data ); for ( $i = 0; $data_c > $i ; $i ++ ) { if ( strpos ( $_SERVER [ 'REQUEST_URI' ], $data [ $i ][2]) !== false ) { header( "HTTP/1.1 404 Not Found" ); include (get_query_template( '404' )); exit (); } } |
get_query_template(‘404’)でサイト側のwordpress404ページを返すことができる。
remove_menu_pageに似た関数としてremove_submenu_pageという関数も存在するが、上の方法を流用してアクセス制御することが可能と思われる。