[{"data":1,"prerenderedAt":332},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f3t7qljvhqh62z":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":301,"prev":326,"next":329},"part3-way-to-conceal-the-plugins","第3章 WordPressのプラグインを隠蔽せよ","2020-02-28T17:26:04","前章までの秘匿化によって、WebサイトからかなりWordPressの存在を匂わす要素がなくなって来たが、完全な秘匿化まではまだまだ足りない部分がある。その一つがプラグインだ。 基本的にWordPressはブログツール…",[271],{"slug":74,"name":75},"2021-02-05T12:33:14","\u003Cp>　前章までの秘匿化によって、WebサイトからかなりWordPressの存在を匂わす要素がなくなって来たが、完全な秘匿化まではまだまだ足りない部分がある。その一つがプラグインだ。\u003C\u002Fp>\n\u003Cp>　基本的にWordPressはブログツールとしてのCMSなので、投稿・コメント管理とユーザ管理ぐらいしかデフォルトで機能を持っていない。なので、Webサイト向けの構築ツールとして利用する場合、お問い合わせ機能や、SEO施策、セキュリティ対策などは自前で準備する必要があるのだ。そして、それらの拡張機能はプラグインとして配布されているものを都度インストールするのが一般的である。もちろん自分でプラグインを開発してそれをインストールして使うことも可能だ。いずれにせよ、それらプラグインによる拡張機能を付与したWordPressサイトでは、使用しているプラグインの存在を隠蔽する必要が出てくる。\u003C\u002Fp>\n\u003Cp>　なお、プラグインの隠蔽はサイトの秘匿化だけではなく、サイトのセキュリティ向上にも役立つことを覚えておいてほしい。WordPressのプラグインの種類はまさに千差万別あるが、それは品質においても同様で、セキュリティホールが残ったまま更新されていないものもあれば、脆弱性が発見されてから対応されるまでの期間もまちまちだ。そのため、WordPressサイト内で使用されているプラグインが露見することは、そのプラグインに脆弱性が見つかった場合に、そこからサイト全体がハッキング・クラッキングされたりする可能性がありえるのだ。使用中のプラグインを秘匿化しておくと、それらのセキュリティリスクにもある程度の防波堤を設けておくことができる。\u003C\u002Fp>\n\u003Ch2>プラグインの選別が重要\u003C\u002Fh2>\n\u003Cp>　WordPressサイトの秘匿化を目指すうえで、利用するプラグインを厳選することが重要だ。理想的には何もプラグインを導入しなければ、この章の施策は不要になり、高い秘匿化効果を得られることになるのだ。ただ、素のWordPressの機能のみでWebサイトを運営するのは効率的ではない。もし高度な機能を備えたWebサイトを構築する場合などは、プラグインで機能を強化しないと、要件を満たすことはほぼ不可能だろう。\u003C\u002Fp>\n\u003Cp>　まぁ、一つの方向性として、機能強化や追加はプラグインではなくテーマ側でやるというアイデアもある。しかし、この方法で構築してしまうと、外見の制御と各種機能の分離がしづらくなり、サイトの保守性が低下する可能性が高く、デザインリニューアルやUI拡張といった柔軟性も失われてしまうのでおすすめしない。そう云う理由もあって、私個人としては高機能なテーマを利用するのは嫌厭している。\u003C\u002Fp>\n\u003Cp>　結論として、WordPressではプラグインを使っていくことがセオリーになるのだが、導入するプラグインは必要最小限に抑え、機能要件や性能に応じて厳しく選別する必要がある。それには構築するWebサイトの存在目的を明確化することだ。作るサイトが個人ブログなのか、コーポレートサイトなのか、はてまたECサイトなのか。そして、そのサイトに最低限必要な機能は何なのか。この二つの指針だけでもはっきりさせておくと、プラグインの選別はそう難しいものではないだろう。\u003C\u002Fp>\n\u003Cp>　今回のチャレンジでは、最もWordPressっぽいであろうブログサイトを秘匿化するという方針で進めている。ただし、機能的にいくつかは補足しておかないといけない点がある。\u003Cbr \u002F>\n　前章でも触れたが、私的にはよっぽどのPVとAUが見込めないサイトでは、コメント機能は不要だと考えている。ほとんど利用されないであろうコメント機能に対して、コメントスパム対策にプラグインを導入するのはパフォーマンス的にもセキュリティ的にも無駄でしかない。いくらデフォルトでバンドルされている「Akismet Anti-Spam」プラグインを有効にするだけだとしてもだ。\u003Cbr \u002F>\n　というわけで、今回はAkismetプラグインは使わない。代わりにWordPressのコメント機能を無効化する「\u003Cstrong>Disable Comments\u003C\u002Fstrong>」を導入する。このプラグインでWordPress上のすべてのコメント機能を無効化すると、もはや現在利用されているのかも不明なトラックバックやピンバックといったレガシーな機能も停止されるので、秘匿化にとってもメリットが多い。\u003C\u002Fp>\n\u003Cp>　しかしながら、「Disable Comments」プラグインは管理画面側や内部処理をフィルタするものなので、（HTMLソース内等の）フロントエンド側に影響を及ぼさない。こういう系統のプラグインは、特に秘匿化の対応をする必要がない。ある意味、とても優秀なプラグインでもあるのだが、これだとプラグイン秘匿化の知見にならないので、実際にフロントエンド側に影響を加えるようなプラグインを例に秘匿化を行なってみよう。\u003C\u002Fp>\n\u003Ch2>Jetpackプラグインを隠蔽する\u003C\u002Fh2>\n\u003Cp>　WordPressサイトを構築する際によく使われるプラグインと言えば「\u003Cstrong>Jetpack by WordPress.com\u003C\u002Fstrong>」ではないだろうか。Jetpackはサイト分析・統計やCDN、画像最適化、セキュリティ強化、SEO施策等々のWebサイト構築に際して有益な各種プラグインがパッケージングされたWordPress公式のプラグインセットで、サイトの利用シーンに応じて各機能のON\u002FOFFができる。他にプラグインを探さなくても大抵の要件に対応できてしまうので、利用している人も多いと思う。\u003Cbr \u002F>\n　私個人的には、導入時にWordPress.comコミュニティの登録アカウントへの連携を要求される仕様と、その巨大過ぎるリソース量によるパフォーマンス懸念などから、いつもは嫌厭しているプラグインだ。\u003Cbr \u002F>\n　今回はあえてこのプラグインを導入して秘匿化を行なってみる。早速、管理画面からJetpackを新規インストールして、有効化後、WordPress.comのアカウントに連携してみた（アカウントがない場合は無料なので作成してしまえばよい）。ちなみに、ローカルPC環境やアクセス制限された環境ではアカウント連携ができないので、\u003Ccode>wp-config.php\u003C\u002Fcode>に\u003Ccode>define( 'JETPACK_DEV_DEBUG', true );\u003C\u002Fcode>の設定を追加してデバッグモードを有効化すると機能制限を受けるが、使えるようになる。\u003Cbr \u002F>\n　なお、WordPress.comとのアカウント連携にREST APIを使うので、第2章の秘匿化時に作成した\u003Ccode>conceal.php\u003C\u002Fcode>内で、\u003Ccode>USE_REST_API\u003C\u002Fcode>定数を有効化しておかないとJetpackの導入ができなくなるので注意が必要だ。\u003C\u002Fp>\n\u003Ch3>サイトアクセラレータを有効化していない場合\u003C\u002Fh3>\n\u003Cp>　さて、Jetpackを有効にする（「パフォーマンス」設定で「サイトアクセラレータを有効化」にチェックが入っていないデフォルト状態）と、フロントエンドのHTMLソースにいくつか影響が出る。特に秘匿化を阻害するのが下記のリソース読み込みだ。\u003Cbr \u002F>\n　\u003C\u002Fp>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Faddons\u002Fjetpack\u002Fmodules\u002Ftheme-tools\u002Fcompat\u002Ftwentytwenty.css?ver=8.2\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> id\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"jetpack_css-css\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Faddons\u002Fjetpack\u002Fcss\u002Fjetpack.css?ver=8.2\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"text\u002Fcss\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>img#wpstats{\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">display\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">none\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">}&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　リソースパスのURL中やタグのID属性に\u003Ccode>jetpack\u003C\u002Fcode>の表記があるのがいただけない。また、Twentyシリーズのテーマを使っていると\u003Ccode>twenty*.css\u003C\u002Fcode>が読み込まれてしまう。これらの表記は、そのサイトでWordPressが使われていることを匂わせてしまうので隠蔽したいところだ。なお、インラインスタイルの\u003Ccode>&lt;style&gt;\u003C\u002Fcode>タグはJetpackのサイト統計情報機能用のビーコン画像を非表示にするためのものだ。今回はこれらすべてを秘匿化する。\u003C\u002Fp>\n\u003Cp>　まず、\u003Ccode>jetpack\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:#6A737D\"># 文字列 jetpack のmd5ハッシュ値を求める\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> echo\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'jetpack'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> |\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> md5\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">388f3517eda5bf26174654c89c9d201f\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># もしくは\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> php\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"echo md5('jetpack');\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">388f3517eda5bf26174654c89c9d201f\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 文字列 jetpack のsha1ハッシュ値を求める\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> echo\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> 'jetpack'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> |\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> openssl\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> sha1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">806aec3e1081c90de4ae10abb1f5882480b6774f\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># もしくは\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> php\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"echo sha1('jetpack');\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">806aec3e1081c90de4ae10abb1f5882480b6774f\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 文字列 jetpack のcrc32ハッシュ値を求める\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">$\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> php\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> \"echo hash('crc32', 'jetpack');\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">d955eeb2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　どのハッシュ値を使っても良いのだが、短い方が見やすい＆管理しやすいので、今回はプラグイン名の「jetpack」をcrc32アルゴリズムでハッシュ化した\u003Ccode>d955eeb2\u003C\u002Fcode>を使ってフィルタリングしてみる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-aconf\"># ---\n# 11. 隠蔽するプラグインのルーティング設定\n# ---\nRewriteRule ^addons\u002Fd955eeb2\u002Fpublic-style.css(.*)$ \u002Fapp\u002Fwp-content\u002Fplugins\u002Fjetpack\u002Fmodules\u002Ftheme-tools\u002Fcompat\u002Ftwentytwenty.css$1 [L]\nRewriteRule ^addons\u002Fd955eeb2\u002Fmain.css(.*)$ \u002Fapp\u002Fwp-content\u002Fplugins\u002Fjetpack\u002Fcss\u002Fjetpack.css$1 [L]\nRewriteRule ^addons\u002Fd955eeb2\u002F(.*)$ \u002Faddons\u002Fjetpack\u002F$1 [L]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　まず、\u003Ccode>.htaccess\u003C\u002Fcode>にjetpackのディレクトリパスと、隠蔽が必要なファイル名の個別パスをリライトする設定をそれぞれ追加する。注意点としては、個別のファイルパスの設定を行った後、最後にプラグインのディレクトリパスをリライトすることぐらいだ。\u003C\u002Fp>\n\u003Cp>　次に、\u003Ccode>conceal.php\u003C\u002Fcode>にフィルタリング処理を追加する。まず、\u003Ccode>after_setup_theme\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\">add_action\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'after_setup_theme'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    ob_start\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $buffer ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Skip the filtering below on the admin panel of WordPress\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">is_admin\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $buffer;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Remove the `id='jetpack*'` attributes\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $buffer \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">id=(\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\'\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">|\")jetpack.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?(\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\'\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">|\")\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $buffer );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Remove inline style tag for \"#wpstats\" in jetpack\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $buffer \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">&#x3C;style.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?>img#wpstats.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $buffer );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $buffer;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    } );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">PHP_INT_MAX\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　そして、\u003Ccode>filter_alt_dirs()\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:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> filter_alt_dirs\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $src ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fapp\u002Fwp-includes\u002F@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> basename\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_CONTENT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> ALT_WP_INCLUDES_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fapp\u002Fwp-admin\u002F@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> basename\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_CONTENT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> ALT_WP_ADMIN_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    \u002F\u002F For concealing the Jetpack plugin without CDN\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $active_plugins \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> get_option\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'active_plugins'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    foreach\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( $active_plugins \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $plugin_dispatcher_path ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_strings \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> explode\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">trim\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $plugin_dispatcher_path, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'.php'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> empty\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_strings ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $_strings[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> hash\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'crc32'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $_strings[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'jetpack'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> ===\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $_strings[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fmodules\u002Ftheme-tools\u002Fcompat\u002Ftwenty.*?\\.css@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002Fpublic-style.css'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fcss\u002Fjetpack\\.css@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002Fmain.css'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $src;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ただし、この方法も万全ではなく、後述のWordPress.com統計情報用の外部スクリプト読み込みを秘匿化するには次項のCDNリソースフィルタリングも必要になってくる。Jetpackは処理が重厚長大すぎて、およそ秘匿化に向かないプラグインであると云える。\u003C\u002Fp>\n\u003Ch3>サイトアクセラレータを有効化している場合\u003C\u002Fh3>\n\u003Cp>　Jetpackの機能の一つに、「パフォーマンス」設定の「サイトアクセラレータを有効化する」という項目がある。これを有効化すると、サイト内に読み込まれる画像やJavaScriptやCSSといった静的リソースが、WordPress.comが提供しているCDNから読み込まれるようになる。これによってCDNにキャッシュ化されたリソースが配信されるようになり、Webページ表示時のパフォーマンスを向上させることができる（と、謳われている）。\u003Cbr \u002F>\n　この機能を有効化すると、HTMLの\u003Ccode>&lt;head&gt;\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:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002Fc0.wp.com\u002Fp\u002Fjetpack\u002F8.2.1\u002Fmodules\u002Ftheme-tools\u002Fcompat\u002Ftwentytwenty.css\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002Fc0.wp.com\u002Fp\u002Fjetpack\u002F8.2.1\u002Fcss\u002Fjetpack.css\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"dns-prefetch\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u002F\u002Fc0.wp.com\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"text\u002Fcss\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>img#wpstats{\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">display\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">none\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">}&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　この場合、前項の対応では秘匿化できない。サイト外部のURLから各種リソースを取得することになるので、サイト内部にしか影響を及ぼさないリライト等では対応できないのだ。では、このケースでは秘匿化ができないかというと、そんなことはない。外部リソース取得を仲介するプログラムを間に挟んでやればよい。\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\"> resources.php\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\"> resources.json\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\"> 606\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> resources.json\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ドキュメントルートに外部リソース取得用スクリプト\u003Ccode>resources.php\u003C\u002Fcode>を作成して、\u003Ccode>.htaccess\u003C\u002Fcode>にこのファイルへのアクセス制限設定を追加しよう。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-aconf\"># ---\n# 11. 外部リソース取得用スクリプト`resources.php`へのルーティング設定と、\n#     リソースリスト`resources.json`へのアクセス制限\n# ---\nRewriteCond %{ENV:is_allow} ^true$ [OR]\nRewriteCond %{ENV:is_allow_referer} ^true$\nRewriteRule ^assets\u002Fresource\u002F(.*)$ \u002Fresources.php?aid=$1 [L]\nRewriteCond %{ENV:is_allow} !^true$\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule ^resources\\.json$ - [R=404,L]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　\u003Ccode>resources.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:#F97583\">&#x3C;?\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">defined\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'CDN_RESOURCES_FILE'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">or\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'CDN_RESOURCES_FILE'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $_SERVER[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'DOCUMENT_ROOT'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002Fresources.json'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">$assets_id \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> filter_input\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">INPUT_GET\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'aid'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">?:\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> null\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> empty\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $assets_id ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> file_exists\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CDN_RESOURCES_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> @\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">file_get_contents\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CDN_RESOURCES_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">?\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> json_decode\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_resources, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">true\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">array_key_exists\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $assets_id, $_resources ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_url \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $_resources[$assets_id];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $ch \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> curl_init\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        curl_setopt\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CURLOPT_URL\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $_url );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        curl_setopt\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CURLOPT_HEADER\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        curl_setopt\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CURLOPT_RETURNTRANSFER\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $response  \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> curl_exec\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $curl_info \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> curl_getinfo\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        curl_close\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $ch );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $mime_type \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $curl_info[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'content_type'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $header_size \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $curl_info[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'header_size'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $content \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> substr\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $response, $header_size );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        header\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"Content-Type: \u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$mime_type\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        die\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $content );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">header\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"HTTP\u002F1.0 404 Not Found\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　最後に、\u003Ccode>conceal.php\u003C\u002Fcode>を拡張する。まず、\u003Ccode>after_setup_theme\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\">add_action\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'after_setup_theme'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    ob_start\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $buffer ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Skip the filtering below on the admin panel of WordPress\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">is_admin\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $buffer;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Remove inline style tag for wpstats in jetpack\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $buffer \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">&#x3C;style.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?>img#wpstats.\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $buffer );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $buffer;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Remove the `&#x3C;link rel=\"dns-prefetch\" href=\"\u002F\u002Fc0.wp.com\">`\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $buffer \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">&#x3C;link rel=(\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\'\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">|\")dns-prefetch(\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D;font-weight:bold\">\\'\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">|\").\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#DBEDFF\">?>\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $buffer );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    } );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">PHP_INT_MAX\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　そして、JetpackのCDNリソースURLをフィルタするための\u003Ccode>filter_jetpack_cdn()\u003C\u002Fcode>関数を準備して、\u003Ccode>filter_alt_dirs()\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\">defined\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'CDN_RESOURCES_FILE'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">or\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> define\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'CDN_RESOURCES_FILE'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $_SERVER[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'DOCUMENT_ROOT'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> '\u002Fresources.json'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> filter_jetpack_cdn\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $url ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">preg_match\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@^(https?:|)\u002F\u002F(.*?)\\.wp\\.com(.*)$@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $url, $matches ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">===\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> !\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> empty\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $matches ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> file_exists\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CDN_RESOURCES_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> @\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">file_get_contents\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CDN_RESOURCES_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $_resources \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">?\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> json_decode\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_resources, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">true\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_hash \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> hash\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'crc32'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $matches[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> array_key_exists\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_hash, $_resources ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            $_resources[$_hash] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $matches[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            @\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">file_put_contents\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">CDN_RESOURCES_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">json_encode\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_resources ), \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">LOCK_EX\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $url \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> sprintf\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'%s\u002Fassets\u002Fresource\u002F%s'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">home_url\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(), $_hash );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $url;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> filter_alt_dirs\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $src ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fapp\u002Fwp-includes\u002F@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> basename\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_CONTENT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> ALT_WP_INCLUDES_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> preg_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@\u002Fapp\u002Fwp-admin\u002F@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> basename\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">WP_CONTENT_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> ALT_WP_ADMIN_DIR\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> .\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> is_admin\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F For concealing the Jetpack plugin with CDN\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $src \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> filter_jetpack_cdn\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $src );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $src;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　なお、今回の施策では管理画面側のCDNリソースフィルタリングは除外してある。というのも、Jetpackのサイトアクセラレータ有効時に管理画面でCDN経由で読み込まれるリソース数が尋常ではなく、サイトのパフォーマンスが大きく低下してしまうからだ。この方法だと、CDNのリソースキャッシュを取得する前に、常に\u003Ccode>resources.php\u003C\u002Fcode>によるファイルストリーム処理のオーバーヘッドが発生するため、サーバ負荷が大きくなってしまう。CDNリソース数が増えるとサーバ負荷もそれに比例してしまうため、CDNによるキャッシュリソース配信によるネットワーク高速化メリットが相殺、もしくはそれ以上のサーバ負荷によってマイナス効果になる可能性があるのだ。サイトのパフォーマンスを取るか、秘匿化による「セキュアさ」を取るかのトレードオフとなって来るわけだ。そこで、ユーザログイン時や管理画面アクセス時に秘匿化をあきらめることは一つの折衷案となるだろう。\u003C\u002Fp>\n\u003Ch3>WordPress.com統計情報のビーコン画像を非表示にし、スクリプト読み込みを秘匿化\u003C\u002Fh3>\n\u003Cp>　前項の対応で、バッファリング拡張で統計情報用のビーコン画像のインラインスタイルを削除してしまうと、WordPressで出力されるページの最下部にビーコン画像のスマイルマークが表示されるようになってしまう。このビーコン画像は、ページが出力された後に非同期で読み込まれるので、WordPress側の出力処理ではフィルタリング出来ない。そこで、HTMLのDOM変更を監視して画像タグが追加されたタイミングでフィルタリング処理を行うJavaScriptを別途用意しておく必要がある。\u003Ccode>conceal.php\u003C\u002Fcode>の\u003Ccode>wp_enqueue_scripts\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\">add_action\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'wp_enqueue_scripts'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> is_admin\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Remove script tags for block library\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_dequeue_style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'wp-block-library'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_dequeue_style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'wp-block-library-theme'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Add new inline scripts into append body\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_register_script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'conceal-footer'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, [], \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">true\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_enqueue_script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'conceal-footer'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        $_add_script \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> &#x3C;&#x3C;&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">EOS\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">const conceal = function(){\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    let body = document.body,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        callback = function(mutationsList,observer) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            mutationsList.forEach(function(mutation) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                let self = mutation.target;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                if ('childList' === mutation.type) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                    Array.prototype.forEach.call(mutation.addedNodes,function(elm) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        if (elm.tagName === 'IMG' &#x26;&#x26; elm.getAttribute('id') === 'wpstats') {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                            elm.style.display = 'none';\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                    });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                };\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            observer.disconnect();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        observer = new MutationObserver(callback);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    observer.observe(body,{childList:true,subtree:true});\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">};\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">if (document.readyState === 'complete' || (document.readyState !== 'loading' &#x26;&#x26; !document.documentElement.doScroll)) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    conceal();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">} else if (document.addEventListener) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    document.addEventListener('DOMContentLoaded',conceal,false);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">} else {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    window.onload = conceal;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">EOS\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">        wp_add_inline_script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'conceal-footer'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">str_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( [ \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"  \"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\t\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\r\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ], \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">''\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $_add_script ) );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">} );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　ビーコンを消すためだけにここまで手間をかけないといけないのが、Jetpackの難点の一つだ。なぜ、非同期読み込みのビーコンタグ自体をスタイル属性（\u003Ccode>style=\"display:none;\"\u003C\u002Fcode>）を付けてレンダリングさせて非表示化しないのだろうか……？　いまだに提供側の意図が読めない謎仕様である（苦笑）\u003C\u002Fp>\n\u003Cp>　次に、WordPress.com統計情報のクライアント側処理を行うスクリプトの読み込み部分を秘匿化する。このスクリプトはHTMLの\u003Ccode>&lt;\u002Fbody&gt;\u003C\u002Fcode>の前あたりに、\u003Ccode>wp_footer\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:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"text\u002Fjavascript\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> src\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002Fstats.wp.com\u002Fe-202009.js\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"async\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> defer\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"defer\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　このタグを秘匿化するためには、前項で紹介したCDNリソースURLのフィルタリングが必要になる。つまりは\u003Ccode>resources.php\u003C\u002Fcode>、\u003Ccode>resources.json\u003C\u002Fcode>、\u003Ccode>filter_jetpack_cdn()\u003C\u002Fcode>関数などの一式が必要ということだ。そのうえで、\u003Ccode>conceal.php\u003C\u002Fcode>内の\u003Ccode>after_setup_theme\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\">add_action\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'after_setup_theme'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    ob_start\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $buffer ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        (\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">中略\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">...\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        \u002F\u002F Filter the urls for stats and photon\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ( \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">preg_match\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'@(https?:\u002F\u002F(stats|pixel)\\.wp\\.com.*?)(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\'\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">|\")@'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, $buffer, $matches ) \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">>\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> !\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> empty\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $matches[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] ) ) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            $_origin_url \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $matches[\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            $buffer \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> str_replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_origin_url, \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">filter_jetpack_cdn\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( $_origin_url ), $buffer );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> $buffer;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    } );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}, \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">PHP_INT_MAX\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　実際、ここまでJetpackの秘匿化対策をやって来て、かなりカオスになっていることも痛感している。今回は初期導入時とCDN周りの機能のみの秘匿化を紹介したが、もし全ての機能を秘匿化しようとすると機能ごとに個別対応が必要になり、途方もない対策が必要になるだろう。ここまでコストをかけて一つのプラグインを秘匿化する必要性があるのかどうか、是非ともJetpackプラグイン導入時にはよくよく検討して欲しい。\u003C\u002Fp>\n\u003Ch3>HTMLソースの確認\u003C\u002Fh3>\n\u003Cp>　さて、前項までの数々の施策によって、Jetpackを含む有効化されているすべてのプラグインで、出力HTML中に読み込まれるJavaScriptやCSSを持つものについては、プラグインディレクトリ名部分がcrc32アルゴリズムのハッシュ値に置き換わるようになる。そのため、\u003Ccode>.htaccess\u003C\u002Fcode>側でプラグイン名のハッシュ値へのリライト設定をしないと、それらJavaScriptやCSSが読み込まれなくなるので注意が必要だ。\u003Cbr \u002F>\n　静的リソースの読み込みが発生するプラグインを追加する都度、\u003Ccode>.htaccess\u003C\u002Fcode>へのリライト設定を追加する必要があるのは面倒だが、プラグインの秘匿化には今のところ避けては通れない対応なのだ。\u003C\u002Fp>\n\u003Cp>　では、ここまで対応した後のJetpackが有効化している状態のWordPressサイトのTOPページの\u003Ccode>&lt;head&gt;\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:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">head\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">meta\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> charset\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"UTF-8\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">meta\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> name\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"viewport\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> content\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"width=device-width, initial-scale=1.0\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">title\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>{サイトのタイトル} – {キャッチフレーズ}&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">title\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">meta\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> name\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"robots\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> content\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"noindex,nofollow\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fview\u002Fstyle.css?ver=1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>(...インラインスタイル（省略）...)&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">style\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fview\u002Fprint.css?ver=1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"print\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fresource\u002Faad6cf17\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u002F>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">link\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> rel\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"stylesheet\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> href\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fresource\u002F5eb682a6\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> media\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"all\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u002F>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> src\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fview\u002Fassets\u002Fjs\u002Findex.js?ver=1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>document.documentElement.className \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> document.documentElement.className.\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">replace\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">( \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'no-js'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">'js'\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> );&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">head\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">(...中略...)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> type\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"text\u002Fjavascript\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> src\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"https:\u002F\u002F{Domain_Name}\u002Fassets\u002Fresource\u002F1ba7d4a9\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"async\"\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> defer\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"defer\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>&#x3C;\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#85E89D\">script\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　このソースコードから、このページがJetpackプラグインが使われているWordPressサイトであると推測するはかなり難しいのではないだろうか。ただ、秘匿化には成功したものの、対策コストがかなりかかったのも事実だ。前項でも述べたが、Jetpackプラグイン一つを秘匿化するのにここまで様々な施策を入れるのは効率的ではない。さらにこの施策によってサイトのパフォーマンスが低下してしまうというデメリットも出てしまうのもいただけない。\u003Cbr \u002F>\n　秘匿化チャレンジの知見としては得るものが大きかったが、\u003Cstrong>結論としてJetpackプラグインの秘匿化は全くオススメしない\u003C\u002Fstrong>ことを云っておく。\u003Cbr \u002F>\n　ちなみに、私のこのチャレンジでは、以降Jetpackは使わないという前提で進めて行くことにする。\u003C\u002Fp>\n\u003Ch2>プラグイン名のハッシュ化ツール\u003C\u002Fh2>\n\u003Cp>　プラグイン秘匿化において面倒なのが、プラグイン名をハッシュ化して、そのハッシュ値を使った擬似パスで\u003Ccode>.htaccess\u003C\u002Fcode>にルーティング設定を行う部分だ。秘匿化の必要なプラグインが１つ２つならばそこまで苦にもならないが、これが増えてくると設定を追加するのが非常に煩わしく大変だ。そこで、利用するプラグイン名を任意のアルゴリズムでハッシュ化して、\u003Ccode>.htaccess\u003C\u002Fcode>へのルーティング設定例を出力してくれるツールを作ってみた。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Cstrong>Plugin Hasher\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Ca href=\"\u002Fwp-hasher.php\">https:\u002F\u002Fka2.org\u002Fwp-hasher.php\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>　このツールは、実際のプラグインディレクトリのパス（ドキュメントルートからのパス）と、隠蔽用に定義した代替プラグインディレクトリのパス（定数\u003Ccode>WP_PLUGIN_DIR\u003C\u002Fcode>に宣言したパス）を入力して、生成するハッシュのアルゴリズムを選択、秘匿化が必要なプラグインの名前（プラグインディレクトリ内の各プラグインのディレクトリ名=slug）を指定すれば、それぞれのプラグイン名のハッシュ値と、\u003Ccode>.htaccess\u003C\u002Fcode>に設定するべきの代替ルーティングの設定例を出力してくれるものだ。\u003C\u002Fp>\n\u003Ch2>プラグイン秘匿化の手順・まとめ\u003C\u002Fh2>\n\u003Cp>　結論として、プラグインの秘匿化については各プラグインごとの性質によって個別対応が必要になって来る。基本的には、プラグイン用に読み込まれる画像、JavaScript、CSS等の静的リソースのリソースパスを隠蔽する対策が必要だ。\u003Cbr \u002F>\n　本項では、まとめとしてプラグイン秘匿化の汎用例的な手順をおさらいしておく。\u003C\u002Fp>\n\u003Ch3>1. WordPressで出力されたページの静的リソースの読み込みを確認する\u003C\u002Fh3>\n\u003Cp>　まず、WordPressのページや管理画面をブラウザで開いて、その際に読み込まれている画像やJavaScript、CSSといった静的リソースの読み込みURLにWordPressを使用していることを匂わすものがないかを確認する必要がある。\u003Cbr \u002F>\n　具体的には、URL中にプラグイン名や\u003Ccode>\u002Fwp-includes\u002F\u003C\u002Fcode>、\u003Ccode>\u002Fwp-admin\u002F\u003C\u002Fcode>、\u003Ccode>\u002Fwp-content\u002Fplugins\u002F\u003C\u002Fcode>等のパスが入っているかどうかだ。一応、前項までの施策を行っていれば、\u003Ccode>wp-includes\u003C\u002Fcode>等のWordPressコアディレクトリは秘匿化済みなので、リソースパス中にそれらのディレクトリ名が出力されることは少ないと思う。また、プラグイン名については、利用しているプラグインが（Jetpackのような）メジャーなものだったり、WordPressを匂わす\u003Ccode>wp-\u003C\u002Fcode>接頭辞を持っている場合以外であれば、特に手間をかけて秘匿化しなくても構わない。\u003C\u002Fp>\n\u003Ch3>2. プラグイン名の代替名を決める\u003C\u002Fh3>\n\u003Cp>　リソースの読み込みURL中に隠蔽が必要なプラグイン名がある場合、そのプラグイン名の代わりとなる代替名を決める必要がある。任意のダミー名を付けても良いが、システム的に管理がしやすく、暗号強度も高いハッシュ値やチェックサム値などを利用するのがベストだろう。\u003Cbr \u002F>\n　プラグイン名をハッシュ化するのであれば、下記のツールを使うのが手っ取り早い。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Cstrong>Plugin Hasher\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Ca href=\"\u002Fwp-hasher.php\">https:\u002F\u002Fka2.org\u002Fwp-hasher.php\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch3>3. リソース読み込みURLを代替パスにリライトする\u003C\u002Fh3>\n\u003Cp>　そして、プラグイン名を代替名に変更した代替パスを有効化する。秘匿化が必要なプラグインごとに\u003Ccode>.htaccess\u003C\u002Fcode>にリライトルールを追加していくことになる。前述のツールを使えば、ハッシュ化と同時にリライト設定も出力してくれるので、その設定を\u003Ccode>.htaccess\u003C\u002Fcode>にコピーするだけでOKだ。\u003C\u002Fp>\n\u003Ch3>4. 再度WordPressページを開いてリソース読み込みURLを確認する\u003C\u002Fh3>\n\u003Cp>　最後に、ブラウザからWordPressページを再度開いて、リソース読み込みURLがリライトされた代替パスに変更されているか、そのパス経由でのリソース読み込みが成功しているかを確認する。もし問題があるようならば、個別に対応していく必要がある。\u003C\u002Fp>\n\u003Cdiv style=\"display:flex;flex-wrap:no-wrap;justify-content:space-between;margin:2em auto;\">\n\u003Cdiv>\u003Ca href=\"\u002Fpart2-tips-of-customize-theme-without-wordpressish-coding\">← 第２章 脱WordPress式テーマのカスタマイズ\u003C\u002Fa>\u003C\u002Fdiv>\n\u003Cdiv>\u003Ca href=\"\u002Fpart4-conceal-of-registration-or-authentication-on-wordpress\">→ 第４章 登録・認証系の秘匿化\u003C\u002Fa>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[275,277,279,282,285,287,289,292,295,298],{"slug":276,"name":276},"conceal",{"slug":278,"name":278},"hide",{"slug":280,"name":281},"jetpack","JetPack",{"slug":283,"name":284},"plugin","Plugin",{"slug":286,"name":286},"security",{"slug":74,"name":288},"WordPress",{"slug":290,"name":291},"%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3","セキュリティ",{"slug":293,"name":294},"%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3","プラグイン",{"slug":296,"name":297},"%e7%a7%98%e5%8c%bf%e5%8c%96","秘匿化",{"slug":299,"name":300},"%e9%9a%a0%e8%94%bd","隠蔽",[302,309,316,323],{"slug":303,"title":304,"date":305,"excerpt":306,"image":71,"categories":307},"part4-conceal-of-registration-or-authentication-on-wordpress","第４章 WordPressの登録・認証系の秘匿化","2020-03-26T02:06:28","前章までの施策によって、フロントエンド側に出力されるコンテンツ系ページからWordPressっぽさを排除できた。だが、ログイン画面などの認証系周りは未施策なため、この章ではその辺の秘匿化を行なっていく。 まず、現状の…",[308],{"slug":74,"name":75},{"slug":310,"title":311,"date":312,"excerpt":313,"image":71,"categories":314},"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…",[315],{"slug":74,"name":75},{"slug":317,"title":318,"date":319,"excerpt":320,"image":71,"categories":321},"part1-how-to-install-to-keep-wordpress-confidential","第1章 WordPressのインストールで差をつけろ！","2020-02-03T15:06:21","まずはWordPressをインストールするのだが、このインストール時点での各種設定を工夫することで、「WordPressっぽさ」をかなり排除できるのだ。WordPressのスタートアップでは、このフェーズが「導入敷居を…",[322],{"slug":74,"name":75},{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":324},[325],{"slug":74,"name":75},{"slug":310,"title":311,"date":312,"excerpt":313,"image":71,"categories":327},[328],{"slug":74,"name":75},{"slug":303,"title":304,"date":305,"excerpt":306,"image":71,"categories":330},[331],{"slug":74,"name":75},1793391397361]