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()してみた。
$data[] = remove_menu_page('upload.php'); // メディアの非表示 $data[] = remove_menu_page('edit.php?post_type=page'); // 固定ページの非表示
上のように配列に戻り値を格納して、結果のデータ構造を確認すると以下のようになっている。
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エラーとする。
具体的には以下のような感じになる。
$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という関数も存在するが、上の方法を流用してアクセス制御することが可能と思われる。