remove_menu_pageで削除したメニューへのアクセスに404エラーを返す

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という関数も存在するが、上の方法を流用してアクセス制御することが可能と思われる。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

remove_menu_pageで削除したメニューへのアクセスに404エラーを返すの記事にコメントを投稿