[{"data":1,"prerenderedAt":327},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f1fphqkjg532nx":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":42,"categories":270,"modified":272,"html":273,"tags":274,"related":286,"prev":313,"next":320},"about-the-permalink-and-the-rewrite-api-of-wordpress","WordPressのパーマリンクとRewriteAPIの取り扱い方","2015-09-15T14:15:52","WordPressにおけるサイト内コンテンツのURLをパーマリンクと呼ぶのだが、デフォルトのパーマリンク設定以外に変更した際に時々遭遇するのが、パーマリンクが有効にならずにリンクできなくなったり、リンク先のコンテンツが4…",[271],{"slug":74,"name":75},"2015-09-16T06:12:02","\u003Cp>WordPressにおけるサイト内コンテンツのURLをパーマリンクと呼ぶのだが、デフォルトのパーマリンク設定以外に変更した際に時々遭遇するのが、パーマリンクが有効にならずにリンクできなくなったり、リンク先のコンテンツが404になったりする症状だ。\u003C\u002Fp>\n\u003Cp>私は今、プラグインを開発しているのだが、昨日その症状に陥っていることに気づいた（今までデフォルトのパーマリンク設定でデバッグしていたので気づかなかったのだ）。\u003Cbr \u002F>\nだいたい、そういう時はApacheの\u003Ccode>mod_rewrite\u003C\u002Fcode>が有効化されていなかったり、\u003Ccode>.htaccess\u003C\u002Fcode>の記述やパーミッション不良とかが原因なのだが、今回はつい先日までリライト型のパーマリンクで動いていたので、先日プラグインに追加した\u003Cstrong>RewriteRule\u003C\u002Fstrong>が原因だろうと思って調べてみた。\u003Cbr \u002F>\n開発中のプラグインを無効化して、パーマリンク設定を初期化（設定を変えずに「保存」だけ行う）してみたところ、パーマリンクが正常化したのでやはりビンゴだ。\u003C\u002Fp>\n\u003Cp>──そうなると、大抵はプラグインのどこかでRewriteRuleを無用に初期化する\u003Ccode>flush_rewrite_rules()\u003C\u002Fcode>を呼んでいるハズなので、ソースを追ってみたところ、不具合の原因は下記の部分だった。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_action( 'wp_loaded', array($this, 'flush_rules') );\n\n(中略)\n\npublic function flush_rules() {\n  $rules = get_option('rewrite_rules');\n  if (!isset($rules['^my_plugin_api\u002F([^\u002F]*)\u002F([^\u002F]*)\u002F([^\u002F]*)?$'])) {\n    global $wp_rewrite;\n    $wp_rewrite-&gt;flush_rules();\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>このソースのまずいところはフックポイントの\u003Ccode>wp_loaded\u003C\u002Fcode>だ。\u003Cbr \u002F>\nWordPress Codexには、下記のように書いてあったので、\u003Ccode>init\u003C\u002Fcode>フックではないところにフックしたのだが、これが罠だった（笑）。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  flush_rules関数はとても遅いので、実装するときにはすべてのページで実行されるinitフィルターで呼び出さないようにしてください。そのかわり、この関数はリライトルールが変更されるときにだけ呼び出すようにしてください。プラグインのregister_activation_hookだけで消去すれば十分でしょう。\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fwpdocs.osdn.jp\u002F%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9\u002FWP_Rewrite\" title=\"\" class=\"origin pull-right\">WordPress Codex : 関数リファレンス\u002FWP Rewrite\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>コアのソースを見てみると、\u003Ccode>wp_loaded\u003C\u002Fcode>のフックは\u003Ccode>init\u003C\u002Fcode>フックの後続フックであるのだが、RewriteRuleの追加・変更は\u003Ccode>init\u003C\u002Fcode>内の\u003Ccode>add_permastruct()\u003C\u002Fcode>で行われている。なので、その後続フックで\u003Ccode>flush_rules()\u003C\u002Fcode>等でリライト状況を初期化してしまうと、せっかく変更されたリライトルールが打ち消されてしまい、正常なリライトが行われなくなってしまうという次第だ。\u003C\u002Fp>\n\u003Cp>──と云うわけで、\u003Ccode>flush_rewrite_rules()\u003C\u002Fcode>は\u003Ccode>init\u003C\u002Fcode>フックで行うのが正しいということになる。確かにWordPress Codexのサンプルソースでもそうなっているのだが、日本語の補足文が誤解を生みやすいんだよなぁ…。\u003C\u002Fp>\n\u003Cp>まぁ、これで私のプラグインの不具合は解消したわけだが、せっかくWordPressのRewriteAPIについて色々とクセがわかったので、この際、リライト周りの処理の適正化な流れを備忘録としてまとめておこうかと思う。\u003C\u002Fp>\n\u003Ch2>プラグインでのRewriteAPIの取り扱い方・まとめ\u003C\u002Fh2>\n\u003Ch3>1. 独自のリライトルールの追加はプラグイン有効化時に行う\u003C\u002Fh3>\n\u003Cp>原則的にリライトルールはプラグインの有効化時に一度だけ行っておくのが良い。プラグイン側で動的にリライトルールを生成するとかでない限り、定型的なリライトルールを定義しておいて、それをプラグインを有効化した時に追加するというのがパフォーマンス的にも有用だ。\u003Cbr \u002F>\n実際には、\u003Ccode>register_activation_hook()\u003C\u002Fcode>でプラグインが有効化した時に処理を呼び出す。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>register_activation_hook( __FILE__, ’my_plugin_activate' );\nfunction my_plugin_activate() {\n  if (!current_user_can('activate_plugins')) \n    return;\n\n  \u002F\u002F Prepend rewrite rules\n  add_rewrite_rule( '^my_plugin_api\u002F([^\u002F]*)\u002F([^\u002F]*)\u002F([^\u002F]*)?$', 'index.php?my_api_key=$matches[1]&amp;my_target_object=$matches[2]&amp;my_api_request=$matches[3]', 'top' );\n  flush_rewrite_rules();\n\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>──こんな感じだ。もし、Class内のメソッドで処理する場合は、下記のようになる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$this-&gt;plugin_main_file = ABSPATH.PLUGINDIR.'\u002F&lt;pluginfoldername&gt;\u002F&lt;pluginname&gt;.php';\nregister_activation_hook( $this-&gt;plugin_main_file, array( &amp;$this, 'my_plugin_activate' ) );\n\npublic function my_plugin_activate() {\n  if (!current_user_can('activate_plugins')) \n    return;\n\n  \u002F\u002F Prepend rewrite rules\n  add_rewrite_rule( '^my_plugin_api\u002F([^\u002F]*)\u002F([^\u002F]*)\u002F([^\u002F]*)?$', 'index.php?my_api_key=$matches[1]&amp;my_target_object=$matches[2]&amp;my_api_request=$matches[3]', 'top' );\n  flush_rewrite_rules();\n\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2. プラグインが停止された時にはリライトルールを削除する\u003C\u002Fh3>\n\u003Cp>プラグイン開発時に一番気をつけたいのが、「\u003Cstrong>立つ鳥跡を濁さず\u003C\u002Fstrong>」の作法だ。プラグインが停止もしくはアンインストールされた時に、できる限りゴミを残さないようにしておくのは大切だと思う（予期せぬバグや不正終了などによって発生してしまうゴミはどうしようもないところだが、それ以外の制御できるリソースについては綺麗にクリーンアップするように心がけたいものだ）。\u003Cbr \u002F>\n拡張したリライトルールも、初期化しないで残っていると、後々サイトの誤動作やセキュリティホールに繋がったりするので、プラグインが停止された時、もしくはアンインストールされる直前に初期化しておく。\u003Cbr \u002F>\nこれは、\u003Ccode>register_deactivation_hook()\u003C\u002Fcode>でプラグインが停止時、\u003Ccode>register_uninstall_hook()\u003C\u002Fcode>でアンインストール直前に処理を呼び出せる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>register_deactivation_hook( __FILE__, 'my_plugin_deactivation' );\nfunction my_plugin_deactivation() {\n  if (!current_user_can('activate_plugins')) \n    return;\n\n  global $my_plugin_disabled;\n  $my_plugin_disabled = true;\n\n  \u002F\u002F Delete rewrite rules\n  flush_rewrite_rules();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>register_uninstall_hook()\u003C\u002Fcode>も同等の記述でOKだ。なお、Class内で呼び出す場合は、前項の記述が参考になるかと。\u003C\u002Fp>\n\u003Cp>\u003Ccode>$my_plugin_disabled = true;\u003C\u002Fcode> のグローバル変数は、後述の \u003Cstrong>3.\u003C\u002Fstrong> の処理に必要となる。Classならメンバ変数としてプラグインのステータスを管理できる変数を用意しておき、ここで書き換えると良い。\u003C\u002Fp>\n\u003Ch3>3. プラグイン利用中のリライトルール変更にも対応する\u003C\u002Fh3>\n\u003Cp>前述の \u003Cstrong>1.\u003C\u002Fstrong> と \u003Cstrong>2.\u003C\u002Fstrong> だけの対応だと、プラグイン利用中に他のプラグインによってリライトルールを変更されたり、パーマリンクを変更したりすると自分のリライトルールが失われてしまう。そこで、リライトルールが変更された場合には、改めて自分のルールを追加する処理を作っておく。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_action( 'init', 'my_rewrite_flush_rules' );\nadd_action( 'generate_rewrite_rules', 'insert_my_rewrite_rules' );\nadd_filter( 'query_vars', 'insert_my_query_vars' );\n\nfunction insert_my_rewrite_rules( $wp_rewrite ) {\n  global $my_plugin_disabled;\n  if ($my_plugin_disabled) \n    return;\n\n  $new_rules = [\n    '^my_plugin_api\u002F([^\u002F]*)\u002F([^\u002F]*)\u002F([^\u002F]*)?$' =&gt; 'index.php?my_api_key=$matches[1]&amp;my_target_object=$matches[2]&amp;my_api_request=$matches[3]', \n  ];\n  $wp_rewrite[0]-&gt;rules = $new_rules + $wp_rewrite[0]-&gt;rules;\n}\n\nfunction insert_query_vars( $qvars ) {\n  $add_queries = [ 'my_api_key', 'my_target_object', 'my_api_request' ];\n  foreach ($add_queries as $_query) {\n    if (!array_key_exists($_query , $qvars)) \n      $qvars[] = $_query;\n  }\n  return $qvars;\n}\n\nfunction flush_rules() {\n  $_pattern = '^my_plugin_api\u002F([^\u002F]*)\u002F([^\u002F]*)\u002F([^\u002F]*)?$';\n  $rules = get_option('rewrite_rules');\n  if (is_array($rules) &amp;&amp; !array_key_exists($_pattern, $rules)) {\n    global $wp_rewrite;\n    $wp_rewrite-&gt;flush_rules();\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>──ミソとしては、リライトルールの初期化は自分のルールが定義されていない時だけ行うというところと、リライトルールを追加する時に\u003Ccode>$my_plugin_disabled\u003C\u002Fcode>のグローバル変数を参照して、プラグインが停止状態かどうかを判定することだ。\u003Cbr \u002F>\n前者は、処理コストの高いリライトルールの初期化を必要な時だけ行うことで、WordPressが常に呼び出す\u003Ccode>init\u003C\u002Fcode>フックで利用してもパフォーマンスを低下させないようにしてある。後者は、プラグイン停止状態に突入したらリライトルールの追加を行わないようにするために必要になる。このプラグインの停止状態判定がないと、せっかく\u003Ccode>register_deactivation_hook()\u003C\u002Fcode>でリライトルールを初期化してもその後にリライトルールが再度追加されてしまい、ゴミが残ってしまうのだ。\u003C\u002Fp>\n\u003Cp>あと、\u003Ccode>query_vars\u003C\u002Fcode>フィルタは、リライトルールに沿ったURLからパラメータを抽出して、\u003Ccode>WP_query\u003C\u002Fcode>オブジェクトに追加する処理だ。これによってURLを仲介して渡されたパラメータをPHP側の独自処理で簡単に利用できるようになる。\u003C\u002Fp>\n\u003Ch2>APPENDIX（おまけ）\u003C\u002Fh2>\n\u003Cp>RewriteRuleを玩（もてあそ）んでいると、現在のリライトルールがどのようになっているかが判りづらくて、実際に処理が正常に動いているのかを確認するのも面倒だ。PHP側で都度\u003Ccode>var_dump()\u003C\u002Fcode>しても良いが、結果が見づらい。\u003Cbr \u002F>\nそんなときに重宝するプラグインがある。\u003C\u002Fp>\n\u003Cp>その名も「\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Frewrite-rules-inspector\u002F\" title=\"Rewrite Rules Inspector\">Rewrite Rules Inspector\u003C\u002Fa>」だ。\u003C\u002Fp>\n\u003Cp>これをインストールしておけば、現在のリライトルールを一覧で見れるし、変更や追加、初期化もできる。リライト系の処理のデバッグ用プラグインとして最適である。\u003C\u002Fp>\n",[275,278,281,283],{"slug":276,"name":277},"rewrite-rules-inspector","Rewrite Rules Inspector",{"slug":279,"name":280},"rewriteapi","RewriteAPI",{"slug":74,"name":282},"WordPress",{"slug":284,"name":285},"%e3%83%91%e3%83%bc%e3%83%9e%e3%83%aa%e3%83%b3%e3%82%af","パーマリンク",[287,290,298,306],{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":288},[289],{"slug":74,"name":75},{"slug":291,"title":292,"date":293,"excerpt":294,"image":295,"categories":296},"create-wordpress-theme-with-vuetify","WordPressのテーマをVuetifyで作る","2020-11-20T12:16:06","最近Vue.jsが楽しくて仕方がない。WordPressのサイト開発にもVue.js使っている今日この頃だ。今時のWordPressと云えばReactなのだが、どうもReactには私的に嫌悪感が付きまとうのだ……なぜだ…","\u002Fassets\u002Fuploads\u002F2020\u002F11\u002Fwp-vuetify-theme-hw.png",[297],{"slug":74,"name":75},{"slug":299,"title":300,"date":301,"excerpt":302,"image":303,"categories":304},"illustrated-wp-login-php-to-understand-wordpress-user-authentication","図解『wp-login.php』！ WordPressのユーザ認証を極める！","2020-04-27T22:02:10","ここ最近、「FF7Remake」やら「MHW:IB」の傍らの空き時間で「WordPressサイトの秘匿化チャレンジ」と称した独自プロジェクトをやっているのだが、その中でWordPressのユーザ認証周りの秘匿化が何気に…","\u002Fassets\u002Fuploads\u002F2020\u002F04\u002Fwp-login-docs.png",[305],{"slug":74,"name":75},{"slug":307,"title":308,"date":309,"excerpt":310,"image":71,"categories":311},"part4-conceal-of-registration-or-authentication-on-wordpress","第４章 WordPressの登録・認証系の秘匿化","2020-03-26T02:06:28","前章までの施策によって、フロントエンド側に出力されるコンテンツ系ページからWordPressっぽさを排除できた。だが、ログイン画面などの認証系周りは未施策なため、この章ではその辺の秘匿化を行なっていく。 まず、現状の…",[312],{"slug":74,"name":75},{"slug":314,"title":315,"date":316,"excerpt":317,"image":42,"categories":318},"i-live-my-life-the-way-i-would-like-5th","好きなことだけして生きてみることにした 第5回","2015-09-14T11:34:52","無事、「起業家セミナー」の申し込みが受理されて、後は二ヵ月後のセミナーを待つだけとなったのだが、だからといってただ待っているだけでは時間の無駄だ。 この時期、私が漠然と考えていた「起業スケジュール」は、今年2015年中に…",[319],{"slug":22,"name":23},{"slug":321,"title":322,"date":323,"excerpt":324,"image":42,"categories":325},"changed-how-to-specify-constructor-method-of-widget-from-wordpress-43","WordPress4.3からウィジェットのコンストラクタ指定方法が変わった","2015-09-16T09:26:49","WordPress 4.3から、ウィジェットの仕様が変更されて、PHP4.x系のコンストラクタ指定が非推奨になった。デバッグモードをONにして、WordPress 4.3のサイトにアクセスすると、まれに下記のようなPHP…",[326],{"slug":74,"name":75},1793391398379]