[{"data":1,"prerenderedAt":331},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f2yk9atibeur22":263},{"featured":4,"latest":129,"categories":227},[5,14,27,37,48,56,66,76,86,96,106,114,122],{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":11},"custom-database-tables","Custom DataBase Tables","2015-11-24T02:29:34","You can create the new own table freely in the your WordPress database via this plugin. Then, you can make the management of table or (as view or entry or edit) data in a simple user interface.\\nAlso,","\u002Fassets\u002Fuploads\u002F2016\u002F02\u002Fcdbt-overview.png",[12],{"slug":13,"name":7},"cdbt",{"slug":15,"title":16,"date":17,"excerpt":18,"image":19,"categories":20},"10_php_tips_for_developers","PHP開発者が心得ておくべき10の鉄則","2016-01-11T18:38:09","PHPだけに限った話ではないが、プログラミングを行うに当たって、心得て、準備しておくと失敗が劇的に減る事柄をまとめてある良い記事を見つけたので、私なりの解釈で意訳しつつ、経験則を踏まえてあらためてまとめてみた。 オリジナ…","\u002Fassets\u002Fuploads\u002F2016\u002F01\u002Feyecatch-php-10-tips.jpg",[21,24],{"slug":22,"name":23},"column","コラム",{"slug":25,"name":26},"development","開発関連",{"slug":28,"title":29,"date":30,"excerpt":31,"image":32,"categories":33},"jquery-timeline-v1","2種類の横型タイムラインを簡単に作成できる「jQuery.Timeline」をリリース","2017-05-29T14:55:46","現在開発しているサービスで利用するべく、横型タイムラインを生成できるjQueryプラグインを自作したので、そこだけ単独でリリースしてみた。 ソースコード等はGitHubの方にリリースしてあるので、興味のある方は、そち…","\u002Fassets\u002Fuploads\u002F2017\u002F05\u002Fjquery_timeline_image.png",[34],{"slug":35,"name":36},"jqtl","jQuery.Timeline",{"slug":38,"title":39,"date":40,"excerpt":41,"image":42,"categories":43},"optimize-browser-cache-of-static-resources","更新されたJS、CSS、画像のみブラウザキャッシュを破棄して読み込ませる","2018-01-31T15:47:47","WEBサービスの保守や開発をやっていると、JavaScriptやスタイルシート、画像などの静的リソースを更新した際、しばしば「確認したけど、更新されてないよ」とか云われて、「ブラウザのキャッシュを消してからもう一度見て…",null,[44,47],{"slug":45,"name":46},"codes","コード集",{"slug":25,"name":26},{"slug":49,"title":50,"date":51,"excerpt":52,"image":53,"categories":54},"jquery-timeline","jQuery.Timeline version2 – full documentation","2019-03-04T20:40:48","Plugin Overview The jQuery.Timeline plugin provides you two types of the horizontal timeline. You can create a…","\u002Fassets\u002Fuploads\u002F2019\u002F03\u002Fjquery.timeline_v2.jpg",[55],{"slug":35,"name":36},{"slug":57,"title":58,"date":59,"excerpt":60,"image":61,"categories":62},"released-the-sloth","Released the Sloth of mobile-first CSS micro framework!","2019-04-16T18:04:25","I released the “Sloth” that is mobile-first CSS micro framework. I have long used frontend framewo…","\u002Fassets\u002Fuploads\u002F2019\u002F04\u002Fsloth_doc_head.png",[63],{"slug":64,"name":65},"sloth","Sloth",{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":72},"challenge-to-conceal-the-wordpress-site","WordPressサイトを徹底的に秘匿化する","2020-02-02T23:59:58","私は自分の個人サイトをはじめ、仕事でもWordPressサイトを運用している。WordPressは気軽にサイトを立ち上げられてカスタマイズも簡単な、素晴らしいオープンソースなのだが、世界中で使われまくっているその知名度…","\u002Fassets\u002Fuploads\u002F2020\u002F02\u002Fshutterstock_1878005929.jpg",[73],{"slug":74,"name":75},"wordpress","WordPress関連",{"slug":77,"title":78,"date":79,"excerpt":80,"image":81,"categories":82},"what-is-forkor","Made a shortened URL app called Forkor","2020-07-07T22:27:01","What’s Forkor? Forkor is a service that provides a shortened URL feature that allows you to redirect any…","\u002Fassets\u002Fuploads\u002F2020\u002F07\u002Fforkor.png",[83],{"slug":84,"name":85},"forkor","Forkor",{"slug":87,"title":88,"date":89,"excerpt":90,"image":91,"categories":92},"manual-about-svg-japan","インタラクティブな日本地図を生成するJSプラグイン「SVG Japan」","2020-11-16T21:19:58","各都道府県をそれぞれ選択・クリック可能なインタラクティブな日本地図を生成するネイティブJavaScript建てのプラグイン「SVG Japan」を作ったので、その紹介と使い方をまとめておく。ちなみにソースコードはgit…","\u002Fassets\u002Fuploads\u002F2020\u002F11\u002Fsvg-japan.png",[93],{"slug":94,"name":95},"svg-japan","SVG Japan",{"slug":97,"title":98,"date":99,"excerpt":100,"image":101,"categories":102},"wp-ignitor-plugin-to-conceal-wordpress-site","WordPressサイトを秘匿化するプラグイン「WP Ignitor」","2021-01-19T15:28:21","以前「WordPressサイトを徹底的に秘匿化する」という記事で、WordPress建てのサイトを秘匿化する方法を取り上げたのだが、あれをサイト構築時に毎度実施するとなるととても労力が必要であった。そこで、もっとお手軽…","\u002Fassets\u002Fuploads\u002F2021\u002F01\u002Fbanner-1554x500-1.png",[103],{"slug":104,"name":105},"wp-ignitor","WPイグナイタ",{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":112},"tastewp","無料でWordPressサイトを複数作成できるWEBサービス「TasteWP」","2021-03-25T20:21:59","私が日本語翻訳に協力しているWEBサービス「TasteWP」について紹介しようと思う。 https:\u002F\u002Ftastewp.com このサービス、サインアップすることなく無料で自分用のWordPressサイトを作れるとい…","\u002Fassets\u002Fuploads\u002F2021\u002F03\u002FTasteWP_screenshot.png",[113],{"slug":74,"name":75},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":120},"monster-hunter-rise-skill-simulator","モンハンライズのスキルシミュレータを作ってみた！","2021-06-28T20:24:52","コラムで連載していたNintendo Switch版『モンスターハンターライズ』のスキルシミュレータ開発がやっと一段落して一通り完了した。いやぁ、記事書きながら同時並行で開発すると思っていた以上に時間がかかるもんだなぁ…","\u002Fassets\u002Fuploads\u002F2021\u002F06\u002Fmhrss_v100.png",[121],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":127},"comparison-of-javascript-date-libraries","JavaScriptの日時ライブラリを比較してみた","2021-07-28T22:39:19","ネイティブJavaScriptで日時を取り扱う場合、ビルトインされているDateオブジェクトを使うことになるのだが、このDateオブジェクトは取り扱いにクセが多く、直感的に日時を操作できない点でも有名である。そこで、専…",[128],{"slug":25,"name":26},[130,141,153,165,175,184,192,195,198,206,213,220],{"slug":131,"title":132,"date":133,"excerpt":134,"image":135,"categories":136},"pulllog_launched","ガチャ履歴を記録・分析できるWebサービス「PullLog」","2025-08-22T13:05:30","このたび、新しい個人開発サービスとして 「PullLog（プルログ）」 をリリースした。 URLはこちら https:\u002F\u002Fpulllog.net PullLogとは？ PullLogは、ソーシャルゲームのガチャ履歴を記録…","\u002Fassets\u002Fuploads\u002F2025\u002F08\u002Fpulllog_stats_jp.png",[137,140],{"slug":138,"name":139},"industries","プロダクト",{"slug":25,"name":26},{"slug":142,"title":143,"date":144,"excerpt":145,"image":146,"categories":147},"mockapi-php-openapi-schema-generation","モックAPIのレスポンスから OpenAPI 3.0 スキーマを自動生成するPHPツール","2025-04-17T09:31:52","私自身がそうなのですが、OpenAPI仕様書を毎回手作業で書いていて「面倒だな」と思ったことはありませんか？ そんな（私と）あなたにぴったりのツールがあります。 レスポンスの例さえ用意すれば、OpenAPI 3.0 スキ…","\u002Fassets\u002Fuploads\u002F2025\u002F04\u002Fswaggerui-preview.png",[148,151,152],{"slug":149,"name":150},"mockapi-php","MockAPI-PHP",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":154,"title":155,"date":156,"excerpt":157,"image":158,"categories":159},"ambient_playlist_customize","Ambientでメメントモリのラメントプレイヤーを作る","2023-11-30T17:32:39","「Ambient」の最新バージョン 1.2.0で実装した「疑似フェーダー」機能を使って、ソーシャルゲーム「メメントモリ」のYouTube公式チャンネルで公開されているMVを集約したラメント専用プレイヤーを作ってみた。 ラ…","\u002Fassets\u002Fuploads\u002F2023\u002F11\u002Fambient_mememori_1.png",[160,163,164],{"slug":161,"name":162},"ambient","Ambient",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":166,"title":167,"date":168,"excerpt":169,"image":170,"categories":171},"released_ambient_demo_version","Ambientメディアプレイヤーのクラウド版デモを公開","2023-11-22T13:47:36","つい先日「Ambient」の最新バージョン 1.1.0をリリースして、それに合わせてクラウド版デモサイトも公開してみた。 なお、クラウド版デモでローカルのホストコンピュータのメディアを再生するには、そのメディアファイルも…","\u002Fassets\u002Fuploads\u002F2023\u002F10\u002FAmbientMediaPlayer-typologo.png",[172,173,174],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":176,"title":177,"date":178,"excerpt":179,"image":170,"categories":180},"ambient-media-player","YouTubeと自分のPC内メディアを同時に再生できるメディアプレイヤーを作ってみた","2023-10-20T00:00:25","私はよくPCで何か作業をするときには音楽を垂れ流していることが多い。 そういう時にかける曲は、手持ちのアルバムCD等からPCに取り込んだ音源だったり、さらにはYouTubeの動画だったりとメディアや再生環境がバラバラだ。…",[181,182,183],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":185,"title":186,"date":187,"excerpt":188,"image":189,"categories":190},"what-is-the-sunorhc","Sunorhc is a date-time library for JavaScript","2021-08-25T22:55:55","Sunorhc is a lightweight library for handling dates and times for JavaScript. The library wraps a native JavaS…","\u002Fassets\u002Fuploads\u002F2021\u002F08\u002Fshutterstock_1091212919_resized.jpg",[191],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":193},[194],{"slug":25,"name":26},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":196},[197],{"slug":25,"name":26},{"slug":199,"title":200,"date":201,"excerpt":202,"image":203,"categories":204},"mhrise-skill-simulator-creation-chapter-12","モンスターハンターライズのスキルシミュレータを作ってみる！ 第12回","2021-06-21T13:11:46","今回は「マイセット登録」と護石データの「エクスポート／インポート」機能の追加をしていく。折り良く（悪く？）「FF7リメイク・インターグレード」や「FORTNITEシーズン7」が出たこともあって、そっちをプレイしてたらこ…","\u002Fassets\u002Fuploads\u002F2021\u002F04\u002Fb6ca09e9a7f6faf27641f62dabe64c6ff97b4f326aa478379e3c112aa28eb9ab.jpg",[205],{"slug":22,"name":23},{"slug":207,"title":208,"date":209,"excerpt":210,"image":203,"categories":211},"mhrise-skill-simulator-creation-chapter-11","モンスターハンターライズのスキルシミュレータを作ってみる！ 第11回","2021-06-07T14:52:31","さて、今回はユーザー個別データの管理部分を開発していく予定だが、まずその前にやっておくことがある。 新スキル「風雷合一」に対応する Ver.3.0の大型無料アップデートで追加された新スキルに「風雷合一」というのがある…",[212],{"slug":22,"name":23},{"slug":214,"title":215,"date":216,"excerpt":217,"image":203,"categories":218},"mhrise-skill-simulator-creation-chapter-10","モンスターハンターライズのスキルシミュレータを作ってみる！ 第10回","2021-06-02T00:29:10","今回は、護石管理画面の作成だ。この護石管理では、ユーザーごとに護石の登録を行う機能と、登録した護石を削除する機能を持つ仕様になる。この画面から登録した護石データはデータベースに格納するので、フロントエンド側からのリクエス…",[219],{"slug":22,"name":23},{"slug":221,"title":222,"date":223,"excerpt":224,"image":203,"categories":225},"mhrise-skill-simulator-creation-chapter-9","モンスターハンターライズのスキルシミュレータを作ってみる！ 第9回","2021-05-22T23:56:27","さて、今回はVuexによるデータ・キャッシュの実装だ。一度データベースから読み込んだデータをフロントエンド側で再利用可能なストアに格納することで、データベースへの接続回数を減らしてシステム負荷を下げるとともに、UX的な…",[226],{"slug":22,"name":23},[228,230,232,236,238,239,240,241,242,244,247,248,250,252,254,258,261],{"slug":161,"name":162,"count":229},3,{"slug":13,"name":7,"count":231},7,{"slug":233,"name":234,"count":235},"csnp","Custom Sticky Notes",2,{"slug":84,"name":85,"count":237},1,{"slug":35,"name":36,"count":229},{"slug":149,"name":150,"count":237},{"slug":64,"name":65,"count":237},{"slug":94,"name":95,"count":237},{"slug":74,"name":75,"count":243},37,{"slug":245,"name":246,"count":237},"wpqt","WP Qiita",{"slug":104,"name":105,"count":237},{"slug":22,"name":23,"count":249},29,{"slug":45,"name":46,"count":251},16,{"slug":138,"name":139,"count":253},5,{"slug":255,"name":256,"count":257},"lifelog","ライフログ",64,{"slug":259,"name":260,"count":235},"uncategorized","未分類",{"slug":25,"name":26,"count":262},45,{"type":264,"post":265},"post",{"slug":266,"title":267,"date":268,"excerpt":269,"image":71,"categories":270,"modified":272,"html":273,"tags":274,"related":300,"prev":325,"next":328},"part1-how-to-install-to-keep-wordpress-confidential","第1章 WordPressのインストールで差をつけろ！","2020-02-03T15:06:21","まずはWordPressをインストールするのだが、このインストール時点での各種設定を工夫することで、「WordPressっぽさ」をかなり排除できるのだ。WordPressのスタートアップでは、このフェーズが「導入敷居を…",[271],{"slug":74,"name":75},"2021-02-05T12:32:14","\u003Cp>　まずはWordPressをインストールするのだが、このインストール時点での各種設定を工夫することで、「WordPressっぽさ」をかなり排除できるのだ。WordPressのスタートアップでは、このフェーズが「導入敷居を低くする」という方向性に寄っているきらいがあって、すっ飛ばしてしまう人も多いので、今回のチャレンジではとことん突っ込んでやってみる。\u003Cbr \u002F>\n　\u003Cbr \u002F>\n　基本的に、どんなディストリビューションでもそうだが、インストールするバージョンは最新（の安定版）である必要がある。既知の不具合やセキュリティホールが含まれていないバージョンをベースにしないと、いくら施策してもセキュリティが担保されないからだ。\u003Cbr \u002F>\n　ちなみに、このチャレンジを開始した時（2020年1月30日時点）の最新安定版は \u003Ccode>5.3.2\u003C\u002Fcode> である。\u003C\u002Fp>\n\u003Cp>　ここで重要になるのが、WordPressのインストールパスだ。WEBサイトのホームURLとなるサーバの\u003Cstrong>ドキュメントルート直下ではなく、その一つ下のディレクトリにインストールすること\u003C\u002Fstrong>が重要だ。今回はドキュメントルート直下に \u003Ccode>app\u003C\u002Fcode> というディレクトリを作成して、その中にWordPressをインストールしている。\u003Cbr \u002F>\n　なお、インストール方法などの詳細はいたるところで紹介されているので割愛するが、コマンドラインからだと \u003Ccode>wp-cli\u003C\u002Fcode> を利用しておおむね下記のようになる。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> core\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> download\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --locale=ja\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --version=latest\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --path=app\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">Downloading\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> WordPress\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 5.3.2\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> (ja)...\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">md5\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> hash\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> verified:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> e3a44f56b756b731042999b5af83d434\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">Success:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> WordPress\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> downloaded.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> app\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> config\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> create\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --dbname=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">{\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">Database_Name}\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --dbuser=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">{\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">Database_User}\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --prompt=dbpass\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --dbhost=localhost\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --dbprefix=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">{\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">Table_Prefix}_\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --dbcharset=utf8mb4\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">1\u002F10\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [--dbpass=&#x3C;dbpass>]: {\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">Database_Password}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">**\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">Success:\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">**\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> Generated \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'wp-config.php'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> file. \u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> db\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> create\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">**\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">Success:\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">**\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> Database created.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> core\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> install\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --url=anonymous.example.com\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --title=Anonymous\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --admin_user=admin_user\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --admin_password=admin_passwd\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> --admin_email=test@anonymous.example.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">Success:\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> WordPress\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> installed\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> successfully.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　なお、WordPressインストール時の注意点として、データベースのテーブル接頭辞（プレフィックス）をデフォルト値の\u003Ccode>wp_\u003C\u002Fcode>ではなく、きちんと任意の値で設定しておくこと。\u003Cbr \u002F>\n　また、コマンドラインではなく、GUIからインストールするのであれば、「検索エンジンでの表示」にチェックを入れて検索エンジンにサイトをインデックスされないようにしておくと良い。なぜ検索エンジンへのインデックスを抑止するかと言うと、サイトを公開するまでの秘匿化作業中にインデックスされたキャッシュによっては、公開時にこのサイトがWordPressサイトであることが既に攻撃者に露見しているということもあり得るからだ。\u003Cbr \u002F>\n　まぁ、WordPressの「検索エンジンでの表示」オプションの信頼性はかなり低い（HTMLのヘッダ内に \u003Ccode>&lt;meta name=\"robots\" content=\"noindex,nofollow\"&gt;\u003C\u002Fcode> が追加されるだけ）ので、気休め程度に考えておいた方が良い……w\u003Cbr \u002F>\n　できれば、サイト公開までの作業中はパブリックなネットワークから切り離されたクローズドな環境で行うか、ローカルPC上で行った後に公開直前にデプロイする等が最良だろう。\u003C\u002Fp>\n\u003Ch2>wp-config.php の初期設定\u003C\u002Fh2>\n\u003Cp>　さて、インストールが終わったら、さっそく秘匿化の第一弾を行っていこう。\u003Cbr \u002F>\n　まずやるべきことは、WordPressの設定ファイル \u003Ccode>wp-config.php\u003C\u002Fcode> をインストールディレクトリ直下から移転させることだ。これは秘匿化よりもセキュリティ向上の恩恵が大きいので、私がWordPressでサイトを構築する際は必ずやっていることでもある。\u003C\u002Fp>\n\u003Cp>　WordPressでは、インストールされたディレクトリ直下に \u003Ccode>wp-config.php\u003C\u002Fcode> ファイルがない場合、その一つ上のディレクトリも探してくれる。つまり、WordPressのインストールディレクトリがドキュメントルートの場合、 \u003Ccode>wp-config.php\u003C\u002Fcode> を一つ上の階層に作成しておくだけで、ディレクトリトラバーサル（パス遡上）攻撃への対策が施された環境（php.iniにてopen_basedirを厳格に設定している等）であれば、設定ファイルへの不正なアクセスを防ぐことができる。\u003C\u002Fp>\n\u003Cp>　私の場合、WordPressをはじめとした各種アプリケーションの設定ファイルを一ヶ所に集約して管理しておきたいということもあって、サーバの特定アカウントのホームディレクトリ等に \u003Ccode>~\u002F.config\u002F{ドメイン名やアプリケーション名}.cnf\u003C\u002Fcode> のように何の設定ファイルなのかが一目でわかるように置いている。WordPressの設定ファイルなら、サイトのドメイン名を付けたファイルとして実体をこちらに置いて、WordPressが参照する\u003Ccode>wp-config.php\u003C\u002Fcode>のパスにはその設定ファイルへのシンボリックリンクを貼っている。参考までにそのやり方の手順を紹介しておく。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {WordPress_Install_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> mkdir\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -p\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ~\u002F.config\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> mv\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp-config.php\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ~\u002F.config\u002F{WordPress_Site_Domain_Name}.cnf\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ..\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ~\u002F.config\u002F{WordPress_Site_Domain_Name}.cnf\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> wp-config.php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ただし、今回のチャレンジでは、WordPressのインストールパスがドキュメントルートより一つ下のディレクトリとなっているので、ドキュメントルートより上層に\u003Ccode>wp-config.php\u003C\u002Fcode>を置くというセキュリティ向上策は取れない。そのため、\u003Ccode>wp-config.php\u003C\u002Fcode>ファイルの防護策は後述の\u003Ccode>.htaccess\u003C\u002Fcode>の設定でおこなうことになる。\u003Cbr \u002F>\n　また、今回はWordPressのインストールパスがドキュメントルートより下のサブディレクトリのため、\u003Ccode>wp-config.php\u003C\u002Fcode>に下記の設定を追加する。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_SITEURL'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$_SERVER\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">['HTTP_HOST']}\u002Fapp\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_HOME'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$_SERVER\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">['HTTP_HOST']}\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　これは、WordPressの管理画面から[設定]-[一般]から「WordPressアドレス（URL）」と「サイトアドレス（URL）」を設定するのと同義なのだが、\u003Ccode>wp-config.php\u003C\u002Fcode>で指定しておくと管理画面側で設定されてDBに保存したこれらの設定値を常にオーバーライドしてくれるので、URLが異なる試験環境と公開環境をDBに依存せずに管理できたりして何かと都合が良いのだ。\u003C\u002Fp>\n\u003Cp>　次に、このままだとWordPressサイトのホームURLが \u003Ccode>{ドメイン名}\u002Fapp\u003C\u002Fcode> のままなので、ドメイン名のみでアクセスできるように変更する。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .\u002Fapp\u002Findex.php\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> index.php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　これでブラウザからドメイン名のみのURLでアクセスしてサイトが表示されればOKだ。\u003C\u002Fp>\n\u003Ch2>wp-content ディレクトリの変更\u003C\u002Fh2>\n\u003Cp>　次に、WordPressのディレクトリ構成を変更していく。最も重要なのが、\u003Ccode>wp-content\u003C\u002Fcode> ディレクトリの名称変更だ。\u003Cbr \u002F>\n　WordPressでは、テーマやプラグイン、アップロードされた各種ファイル等はこのディレクトリ下の指定のフォルダに格納されている。そのため、WEBサイトのHTMLを覗かれて、それらリソースのファイルパスに \u003Ccode>\u002Fwp-content\u002F\u003C\u002Fcode> が含まれていると、そのサイトがWordPressで構築されたことが一発でバレてしまうのだ。\u003Cbr \u002F>\n　また、もしテーマやプラグインにセキュリティホールがあったとしても、 \u003Ccode>wp-content\u003C\u002Fcode> ディレクトリ名が違う名前であれば、特定テーマなどをファイルパス決め打ちで攻撃されたとしても途中のパスが違うので回避できるようになり、セキュリティ的なメリットも若干ながら享受できる。\u003Cbr \u002F>\n　というわけで、今回は \u003Ccode>wp-content\u003C\u002Fcode> を \u003Ccode>assets\u003C\u002Fcode> に変更する。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .\u002Fapp\u002Fwp-content\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> assets\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ディレクトリ名を変更した後は、設定ファイル \u003Ccode>wp-config.php\u003C\u002Fcode> に下記の設定を追加することで、WordPressが新しいディレクトリ名を使用してくれるようになる。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_CONTENT_DIR'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$_SERVER\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">['DOCUMENT_ROOT']}\u002Fassets\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_CONTENT_URL'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_HOME\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002Fassets'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>プラグインディレクトリの変更\u003C\u002Fh2>\n\u003Cp>　さらに、プラグインディレクトリの名称も変更する。これによって、WordPressサイトで定番として広く使われているプラグインが読み込んでいるCSSやJS等のリソースファイルのパスからWordPressの存在を勘繰られる可能性を少なくできる。\u003Cbr \u002F>\n　というわけで、今回はプラグインディレクトリ \u003Ccode>wp-content\u002Fplugins\u003C\u002Fcode> を \u003Ccode>addons\u003C\u002Fcode> にしてみる。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .\u002Fapp\u002Fwp-content\u002Fplugins\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> addons\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ディレクトリ名を変更した後は、設定ファイルに新しいディレクトリパスを宣言する。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_PLUGIN_DIR'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"{\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$_SERVER\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">['DOCUMENT_ROOT']}\u002Faddons\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'WP_PLUGIN_URL'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_HOME\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002Faddons'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　実際に管理画面からプラグインの一覧を表示してみて、デフォルトでバンドルされている「Akismet」や「Hello Dolly」のプラグインが表示されればOKだ。試しに「Hello Dolly」あたりを有効化して問題が出なければ万全だ。\u003C\u002Fp>\n\u003Cp>　なお、プラグインによってはプラグインディレクトリのパスをビルトイン関数やグローバル定数を参照せずに、PHPソース内にハードコーディングされているものもある。そういうプラグインは、この変更によって動作しなくなるので、注意が必要だ。まぁ、そういう可用性の低いプラグインは使わないというのが賢明かもしれない。\u003C\u002Fp>\n\u003Ch2>テーマディレクトリの変更\u003C\u002Fh2>\n\u003Cp>　テーマディレクトリの変更は、コンテンツディレクトリやプラグインディレクトリのようにグローバルな定数が準備されていない。いや、正確には \u003Ccode>TEMPLATEPATH\u003C\u002Fcode> と \u003Ccode>STYLESHEETPATH\u003C\u002Fcode> があるのだが、これはそれぞれビルトイン関数の \u003Ccode>get_template_directory()\u003C\u002Fcode> と \u003Ccode>get_stylesheet_directory()\u003C\u002Fcode> のラッパーなので、WordPressが初期化される（＝WordPress上のページを表示する）たびに変動する可能性があるのだ。そのため、テーマディレクトリの変更にはテーマ側かプラグイン側によるフィルタリングが必要になってくる。\u003Cbr \u002F>\n　詳しくは、次章以降のテーマのカスタマイズ時に行うので、一旦スルーする。\u003C\u002Fp>\n\u003Ch2>uploadsディレクトリの変更\u003C\u002Fh2>\n\u003Cp>　WordPressの管理画面などからアップロードされた画像などのファイルは \u003Ccode>wp-content\u002Fuploads\u002F\u003C\u002Fcode> ディレクトリ内に格納される。今回既に \u003Ccode>wp-content\u002F\u003C\u002Fcode> ディレクトリは \u003Ccode>assets\u002F\u003C\u002Fcode> に変更してあるので、アップロードディレクトリも \u003Ccode>assets\u002Fuploads\u002F\u003C\u002Fcode> になっているのだが、このディレクトリも変更しておくとさらに安心だ。\u003Cbr \u002F>\n　今回は \u003Ccode>public\u003C\u002Fcode> に変更してみる。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> ln\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .\u002Fapp\u002Fwp-content\u002Fuploads\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> public\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ディレクトリを変更したら、設定ファイルに新規パスを追加する。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'UPLOADS'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'..\u002Fpublic'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　しかし、これだけだとWEBページにアップロードファイルが表示された際に、そのファイルのURLが \u003Ccode>\u002Fapp\u002F..\u002Fpublic\u002F{ファイル名}\u003C\u002Fcode> のようになってしまい、WordPressのインストールディレクトリである \u003Ccode>app\u002F\u003C\u002Fcode> ディレクトリの存在が露見してしまう。何よりダサいので、対処が必要だ。ただし、この対応には、テーマやプラグイン側でのURLフィルタリングが必要になるため、現時点ではとりあえずスルーしておく。詳細はテーマのカスタマイズの章で説明する。\u003C\u002Fp>\n\u003Ch2>WordPress関連ファイルへのアクセス制限\u003C\u002Fh2>\n\u003Cp>　WordPressのインストールディレクトリ内に存在しているファイルやディレクトリは、そのサイトがWordPress建てであることを端的に示してしまうものばかりである。例えば静的なリソースである\u003Ccode>license.txt\u003C\u002Fcode>や\u003Ccode>readme.html\u003C\u002Fcode>などは、特に対策をしていないとブラウザから直接URLでアクセスできて、そのサイトがWordPressサイトであることがバレてしまう。Webサイトを運営する上では全く必要としないリソースでもあるので、削除してしまっても良いが、サイト稼働後も継続的にWordPress自体のアップデートしていくにあたって、その都度またインストールされてしまうファイルでもあるので、毎回いちいち対応するのは面倒であり、対応が漏れた時に秘匿化効果がなくなってしまうリスクもある。\u003Cbr \u002F>\n　これらのファイルは、\u003Ccode>.htaccess\u003C\u002Fcode>を使って、WEBサーバ側でその存在を隠蔽するアクセス制限をしていく。\u003C\u002Fp>\n\u003Cp>　WordPressサイトにおけるコアファイル関連のアクセス制限を紹介している記事は多いので、WordPressサイト向けの \u003Ccode>.htaccess\u003C\u002Fcode> 設定はよく見かける。しかしながら、それらはどれも対象ファイルやディレクトリへのリクエストについて「\u003Cstrong>アクセス許可を与えない\u003C\u002Fstrong>」形式でのやり方であり、これでは \u003Cstrong>「対象ファイルが存在する」ことを完全には隠し切れていない\u003C\u002Fstrong>。セキュリティ的にはそれでも問題はないのだが、今回のチャレンジでは、主題である「秘匿化」の方向性を貫きたいので、WordPress関連のファイルは、HTTP CODEとして404を返すようにしてみる。\u003C\u002Fp>\n\u003Cp>　まずは、WordPressのサイトURLのホームディレクトリ（今回のチャレンジではドキュメントルート）に \u003Ccode>.htaccess\u003C\u002Fcode> ファイルを作成する必要がある。WordPressはインストール時に \u003Ccode>.htaccess\u003C\u002Fcode> を生成しないので、自分で準備する必要があるのだ。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> cd\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> {Document_Root_Path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> touch\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .htaccess\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> chmod\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 604\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> .htaccess\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　作成できたら、ブラウザからWordPressの管理画面にログインして、[設定]-[パーマリンク設定]を開き、「変更を保存」をクリックする（他には何も設定しなくても構わない）。これで、初期パーマリンク設定が \u003Ccode>.htaccess\u003C\u002Fcode> に書き込まれたはずだ。\u003C\u002Fp>\n\u003Cp>　では、WordPress関連ファイルの隠蔽工作を実施していく。\u003Cbr \u002F>\n　まず\u003Ccode>.htaccess\u003C\u002Fcode>を編集する前に自ホストのFQDNやIPアドレスを調べておこう。\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> hostname\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -A\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">FQDN1.example.com\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> FQDN2.example.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> hostname\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -I\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">123.123.1.1\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 123.123.1.2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　これらのホスト名やIPなどをアクセスを許可するホストとして設定していけば良い。この辺りは運用する環境によって差が大きいので、適宜調整が必要だ。\u003Cbr \u002F>\n　なお、設定はWordPressによって自動挿入された \u003Ccode># BEGIN WordPress 〜 # END WordPress\u003C\u002Fcode> の\u003Cstrong>ディレクティブより前に追加する\u003C\u002Fstrong>こと。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-aconf\">&lt;IfModule mod_rewrite.c&gt;\nRewriteEngine On\n# ---\n# 許可する接続元の定義\n# ---\n# アクセスを許可する接続元IP&amp;ホストの定義: is_allow\nSetEnvIf Remote_Host \"^FQDN(1|2)\\.example\\.com$\" is_allow=true\nSetEnvIf Remote_Addr ^123.123.1.                 is_allow=true\n# SetEnvIf Remote_Addr ^192.168.                 is_allow=true\n# SetEnvIf Remote_Addr ^127.0.0.                 is_allow=true\nSetEnvIf Remote_Host ^localhost$                 is_allow=true\n# アクセスを許可するリファラーの定義: is_allow_referer\nSetEnvIf Referer \"^https?:\u002F\u002F(|www\\.)example\\.com\u002F\" is_allow_referer=true\n# ---\n# 1. 静的リソースは接続元に依らず、固定的に404レスポンスを返す\n# ---\nRewriteRule (license.txt|readme(|-ja).html)$ - [R=404,L]\n# ---\n# 2. ドキュメントルート直下のwp-admin\u002F、およびwp-login.phpは、\n#    リダイレクトさせず、404レスポンスを返す\n# ---\nRewriteRule ^wp-admin\u002F(.*)$ - [R=404,L]\nRewriteRule ^wp-login.php(.*)$ - [R=404,L]\n# ---\n# 3. ドキュメントルート直下のwp-config.phpは、\n#    接続元が許可ホスト以外の場合は、404レスポンスを返す\n# ---\nRewriteCond %{ENV:is_allow} !^true$\nRewriteRule ^wp-config.php$ - [R=404,L]\n# ---\n# 4. インストールディレクトリ直下の.phpファイルへのアクセスは、\n#    wp-login.php、xmlrpc.phpなど特定のファイル以外の場合、\n#    接続元が許可ホスト以外、かつ許可リファラー以外の場合は、404レスポンスを返す\n# ---\nRewriteCond %{ENV:is_allow} !^true$\nRewriteCond %{ENV:is_allow_referer} !^true$\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteCond %{REQUEST_FILENAME} !(wp-login|xmlrpc).php$\nRewriteCond %{REQUEST_FILENAME} !wp-admin\u002F(options(|-general)|profile).php$\nRewriteRule ^app\u002F.*?\\.php$ - [R=404,L]\n# ---\n# 5. インストールディレクトリ直下の各ディレクトリへのアクセスは、\n#    接続元が許可ホスト以外、かつ許可リファラー以外の場合は、404レスポンスを返す\n# ---\nRewriteCond %{ENV:is_allow} !^true$\nRewriteCond %{ENV:is_allow_referer} !^true$\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^app\u002F.*?\u002F?(.*)$ - [R=404,L]\n# ---\n# 6. xmlrpc.phpは後々専用の制限を追加するので個別設定（暫定的）\n# ---\nRewriteCond %{ENV:is_allow} !^true$\nRewriteCond %{ENV:is_allow_referer} !^true$\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteCond %{REQUEST_FILENAME} xmlrpc.php$\nRewriteRule ^app\u002Fxmlrpc.php(.*)$ - [R=404,L]\n# ---\n# 7. wp-login.phpは後々専用の制限を追加するので個別設定（暫定的）\n# ---\n#RewriteCond %{ENV:is_allow} !^true$\n#RewriteCond %{ENV:is_allow_referer} !^true$\n#RewriteCond %{REQUEST_FILENAME} -f\n#RewriteCond %{REQUEST_FILENAME} wp-login.php$\n#RewriteRule ^app\u002Flogin.php(.*)$ - [R=404,L]\n&lt;\u002FIfModule&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　わかりやすいようにコメント欄に設定タイプごとに番号を振っている。\u003Cbr \u002F>\n　まず、1. 〜 3. の設定はこの時点で確定でよい。4. 以降の設定はインストールディレクトリ名に応じて適宜書き換える必要がある。また、エンドユーザをユーザ登録させたり、複数の管理ユーザにプロフィール変更を許可するようなサイトの場合、都度メールによるアクティベーションが発生するため、wp-admin\u002F の特定URLへのアクセスを許す必要も出てくる。\u003Cbr \u002F>\n　つまりは、構築するWebサイトのインタラクティブ性に応じてアクセス制限が複雑かつ甘くなり、さらにはWordPressの秘匿性も低下していくということを認識しておく必要がある。\u003C\u002Fp>\n\u003Cp>　さて、設定が有効になっているかは、ブラウザ側からインターネット経由で秘匿化対象となった各種ファイルやディレクトリに直接URLでアクセスして、期待した404レスポンスが返ってくるかを確認する必要があるのだが、対象ファイル数がかなり多くて確認するのがとても面倒だ。そこで、指定サイトがWordPressサイトとしてのレスポンスを返すかどうかを一括でチェックできるチェッカーを作ってみた。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Ca href=\"\u002Fwp-checker.php\">https:\u002F\u002Fka2.org\u002Fwp-checker.php\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>　上記URLで調べたいサイトのURL（WordPressのインストールパスのURL）を入力するだけだ。あとは自動でそのサイトのドキュメントルートまで遡ってWordPressコアファイルのHTTPレスポンスを検証してくれる。\u003C\u002Fp>\n\u003Cp>　この時点での設定では、\u003C\u002Fp>\n\u003Cul>\n\u003Cli>ドキュメントルート直下の\u003Ccode>index.php\u003C\u002Fcode>のHTMLソース内にWordPressを匂わす記述が含まれている\u003C\u002Fli>\n\u003Cli>インストールディレクトリ直下に\u003Ccode>wp-login.php\u003C\u002Fcode>が存在している\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>──との2点が警告されるはずだ。この警告への対応は、次章以降で行なっていく。\u003C\u002Fp>\n\u003Cp>　ここまでがWordPress秘匿化の第1章である。この時点で構築されたWordPressサイトの構造は下記のようになっている。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F(DOCUMENT_ROOT)\n ├ addons\u002F (200 Ok)\n ├ app\u002F (404 Not Found)\n ├ assets\u002F (200 Ok)\n ├ public\u002F (403 Forbidden)\n ├ .htaccess (403 Forbidden)\n ├ index.php (200 Ok -&gt; WordPressサイトが表示)\n └ wp-config.php (404 Not Found)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　この構造とHTTPレスポンスから、このサイトがWordPress建てであるということを推測するのは容易ではないと思う。\u003C\u002Fp>\n\u003Cp>　次章ではテーマをカスタマイズして、表示されるページのHTMLソースコードからもWordPress臭を消していく。\u003C\u002Fp>\n\u003Cdiv style=\"display:flex;flex-wrap:no-wrap;justify-content:space-between;margin:2em auto;\">\n\u003Cdiv>\u003Ca href=\"\u002Fchallenge-to-conceal-the-wordpress-site\">← WordPressサイトを徹底的に秘匿化する\u003C\u002Fa>\u003C\u002Fdiv>\n\u003Cdiv>\u003Ca href=\"\u002Fpart2-tips-of-customize-theme-without-wordpressish-coding\">→ 第2章 脱WordPress式テーマのカスタマイズ\u003C\u002Fa>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[275,278,280,282,284,286,288,291,294,297],{"slug":276,"name":277},"htaccess",".htaccess",{"slug":279,"name":279},"conceal",{"slug":281,"name":281},"hide",{"slug":283,"name":283},"install",{"slug":285,"name":285},"security",{"slug":74,"name":287},"WordPress",{"slug":289,"name":290},"wp-config-php","wp-config.php",{"slug":292,"name":293},"%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3","セキュリティ",{"slug":295,"name":296},"%e7%a7%98%e5%8c%bf%e5%8c%96","秘匿化",{"slug":298,"name":299},"%e9%9a%a0%e8%94%bd","隠蔽",[301,308,315,322],{"slug":302,"title":303,"date":304,"excerpt":305,"image":71,"categories":306},"part4-conceal-of-registration-or-authentication-on-wordpress","第４章 WordPressの登録・認証系の秘匿化","2020-03-26T02:06:28","前章までの施策によって、フロントエンド側に出力されるコンテンツ系ページからWordPressっぽさを排除できた。だが、ログイン画面などの認証系周りは未施策なため、この章ではその辺の秘匿化を行なっていく。 まず、現状の…",[307],{"slug":74,"name":75},{"slug":309,"title":310,"date":311,"excerpt":312,"image":71,"categories":313},"part3-way-to-conceal-the-plugins","第3章 WordPressのプラグインを隠蔽せよ","2020-02-28T17:26:04","前章までの秘匿化によって、WebサイトからかなりWordPressの存在を匂わす要素がなくなって来たが、完全な秘匿化まではまだまだ足りない部分がある。その一つがプラグインだ。 基本的にWordPressはブログツール…",[314],{"slug":74,"name":75},{"slug":316,"title":317,"date":318,"excerpt":319,"image":71,"categories":320},"part2-tips-of-customize-theme-without-wordpressish-coding","第2章 脱WordPress式テーマのカスタマイズ","2020-02-10T15:17:24","まず、下記のソースを見て欲しい。 \u003Chead> \u003Cmeta charset=”UTF-8″> \u003Cmeta name=”viewport” content=”width=device-wid…",[321],{"slug":74,"name":75},{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":323},[324],{"slug":74,"name":75},{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":326},[327],{"slug":74,"name":75},{"slug":316,"title":317,"date":318,"excerpt":319,"image":71,"categories":329},[330],{"slug":74,"name":75},1793391397378]