[{"data":1,"prerenderedAt":316},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f9niwndyn19f4":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":270,"categories":271,"modified":268,"html":273,"tags":274,"related":283,"prev":305,"next":313},"lets-build-my-plugin-with-wp-rest-api-part-1-checking-the-rest-api-plugin","WP REST APIをプラグインに組み込む！：その１. REST APIの存在確認","2016-10-12T22:25:54","現在、私が開発している「Custom DataBase Tables」プラグインに「WordPress REST API」プラグインの RESTful な仕組みを取り込もうとしている。 「Custom DataBase…","\u002Fassets\u002Fuploads\u002F2016\u002F10\u002Fcdbt-with-wp-rest-api.png",[272],{"slug":74,"name":75},"\u003Cp>現在、私が開発している「Custom DataBase Tables」プラグインに「WordPress REST API」プラグインの \u003Cem>RESTful\u003C\u002Fem> な仕組みを取り込もうとしている。\u003C\u002Fp>\n\u003Cp>「\u003Ca href=\"\u002Fcdbt\">Custom DataBase Tables\u003C\u002Fa>」プラグインは、WordPressサイトにユーザー独自のテーブルを自由に作れ、テーブルさえ作ってしまえばショートコードを使って自動生成型のデータ入力フォームやらデータ閲覧リスト、編集用コンポーネントを簡単に設置できるというモノだ。\u003Cbr \u002F>\n何気にバージョン1の時点から、URLベースでデータ入力や参照ができる「Web API」の仕組みを独自で実装していた（WordPressのRewrite仕様をカスタマイズしている）のだが、バージョン2以降はその辺の仕組みの保守をおざなりにしていたこともあって、動作不良が多い機能になってしまった。\u003Cbr \u002F>\n──そんなわけで、本当は現行バージョンの2.1.xにアップグレードする際に「WordPress REST API」の仕組みを取り込んでリファクタリングしようと思っていたのだが、他のコア部分のリファクタリングに手一杯で着手できずじまいだった…。その後は、WordPressのコアにREST APIが組み込まれるということだったので、コアに実装されたら取り掛かろう…とか考えていたのだが、現在のWordPress 4.6.1の時点でも完全なビルトインがされていない実情だ。それにしびれを切らしたこともあって、今回のリファクタリングを行うことにしたのだ。\u003C\u002Fp>\n\u003Cp>──と、まぁ、経緯は別段どうでもいいのだが、今回「\u003Ca href=\"https:\u002F\u002Fja.wordpress.org\u002Fplugins\u002Frest-api\u002F\">WordPress REST API（Version 2）\u003C\u002Fa>」を利用したプラグインのカスタマイズを行う過程で、色々と四苦八苦したことや気づいたことがあったので何回かのトピックスに分けてナレッジ化しておこうと思った次第だ。\u003C\u002Fp>\n\u003Ch2>WordPress REST API の存在確認\u003C\u002Fh2>\n\u003Cp>今回のトピックでは、WordPress REST APIがインストールされて有効化されているかどうかを確認する処理部分について紹介しておく。\u003Cbr \u002F>\nもし、WordPress REST APIを利用した機能が自分のプラグインの新機能であれば、元々ユーザさんの環境にREST APIプラグインがインストールされて稼働していることを前提にしてプラグインをリファクタリングしてもそれほど問題は起きないかもしれないが、私のプラグインのようにすでにREST APIと競合する機能が実装されていて、REST APIのあり／なしで使用する機能をスイッチさせたいと考えた場合、ユーザのWordPress環境にREST APIプラグインが導入されているかどうかを判定するロジックが必須になるのだ。\u003C\u002Fp>\n\u003Cp>今回のトピックはWordPress REST APIプラグインのみならず、自分のプラグインやテーマ等で他のプラグインとの連携を実装する場合の共通処理と云えるので、覚えておくと何かと有効かもしれない。\u003C\u002Fp>\n\u003Cp>\u003Cdiv class=\"clearfix\" style=\"margin-bottom: 2em;\">\u003C\u002Fdiv>\u003C\u002Fp>\n\u003Ch3>有効なプラグインを判定するための関数 \u003Ccode>is_plugin_active()\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cp>WordPressには有効化されているプラグインを判定する関数として、\u003Ccode>is_plugin_active()\u003C\u002Fcode>が用意されているので、この関数を使って「WordPress REST API」プラグインが有効になっているかどうかを判定することになる。ただし、この関数はクセがあって、管理画面側とフロントエンド側では使い方が異なるのだ。\u003Cbr \u002F>\n詳しくは\u003Ca href=\"https:\u002F\u002Fcodex.wordpress.org\u002FFunction_Reference\u002Fis_plugin_active\">Codex\u003C\u002Fa>に説明されているが、簡単に言うと、フロントエンド側でこの関数を使って判定を行う場合、\u003Ccode>wp-admin\u002Fincludes\u002Fplugin.php\u003C\u002Fcode>ファイルのインクルードが必要になる。以下の「WordPress REST API」プラグインを判定する場合の実例コードを見てもらいたい。\u003C\u002Fp>\n\u003Cp>まず、管理画面側では、\u003C\u002Fp>\n\u003Cpre>\u003Ccode>if ( is_plugin_active( 'rest-api\u002Fplugin.php' ) ) {\n  \u002F\u002F REST APIが有効化されている時の処理\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>一方、フロントエンド側では、\u003C\u002Fp>\n\u003Cpre>\u003Ccode>include_once( ABSPATH . 'wp-admin\u002Fincludes\u002Fplugin.php' );\nif ( is_plugin_active( 'rest-api\u002Fplugin.php' ) ) {\n  \u002F\u002F REST APIが有効化されている時の処理\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>──と記述することになる。\u003Cbr \u002F>\nちなみに引数に指定する値は「プラグインのディレクトリ名\u002Fプラグインのベースファイル名」となる。もし将来、判定するディレクトリ名やファイル名が変更された場合、指定引数も変更する必要が出てくるので、注意が必要だ。\u003C\u002Fp>\n\u003Cp>もし、管理画面側とフロントエンド側とで処理を分けていない場合や、テーマのfunctions.php等で判定を行う場合なら、下記のように一元化した判定処理をアクションフックにラップするのがベストかもしれない。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>function my_check_plugin() {\n  $determine_plugin = 'rest-api\u002Fplugin.php';\n  if ( is_plugin_active( $determine_plugin ) ) {\n    \u002F\u002F REST APIが有効化されている時の処理\n  }\n}\nif ( is_admin() ) {\n  add_action( 'admin_init', 'my_check_plugin' );\n} else {\n  include_once( ABSPATH . 'wp-admin\u002Fincludes\u002Fplugin.php' );\n  add_action( 'init', 'my_check_plugin' );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cdiv class=\"clearfix\" style=\"margin-bottom: 2em;\">\u003C\u002Fdiv>\u003C\u002Fp>\n\u003Ch3>プラグインのバージョン番号を判定する\u003C\u002Fh3>\n\u003Cp>「WordPress REST API」の現在の主流はバージョン2系であり、バージョン1系と2系では機能に差があるため、組み込むプラグイン側でREST APIの利用条件としてはバージョン2系以上に制限をしたい。そのためにはプラグインのバージョンを判定する必要がある。\u003Cbr \u002F>\nWordPressにはプラグインのバージョンなどのメタデータを取得できる関数として \u003Ccode>get_plugin_data()\u003C\u002Fcode> が準備されているので、この関数を使って、ユーザが使用しているWordPress REST APIプラグインのバージョンを判定してみる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$determine_plugin = 'rest-api\u002Fplugin.php';\n$plugin_dir_path = str_replace( site_url( '\u002F' ), ABSPATH, plugins_url() );\n$plugin_data = get_plugin_data( $plugin_dir_path . '\u002F' . $determine_plugin, false, false );\nif ( version_compare( $plugin_data['Version'], '2.0-beta', '&gt;' ) ) {\n  \u002F\u002F WP REST API v2 です\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>上記は、WordPress REST APIプラグインのバージョン2系以上を判定するだけのコードだ。一応、このバージョン判定で、もしバージョン番号から「beta」の記述が外れたり、3.0系になった場合でもTRUEとなるが、バージョン番号書式が変更された場合は判定処理が正常に動作するかの再確認は必要だろう。\u003Cbr \u002F>\nさて、これを前項のプラグイン有効化判定にマージすると、次のようなコードになる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>function my_check_plugin() {\n  $determine_plugin = 'rest-api\u002Fplugin.php';\n  if ( is_plugin_active( $determine_plugin ) ) {\n    $plugin_dir_path = str_replace( site_url( '\u002F' ), ABSPATH, plugins_url() );\n    $plugin_data = get_plugin_data( $plugin_dir_path . '\u002F' . $determine_plugin, false, false );\n    if ( version_compare( $plugin_data['Version'], '2.0-beta', '&gt;' ) ) {\n      \u002F\u002F REST API v2 が有効化されている時の処理\n    }\n  }\n}\nif ( is_admin() ) {\n  add_action( 'admin_init', 'my_check_plugin' );\n} else {\n  include_once( ABSPATH . 'wp-admin\u002Fincludes\u002Fplugin.php' );\n  add_action( 'init', 'my_check_plugin' );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ちなみに、\u003Ccode>get_plugin_data()\u003C\u002Fcode> 関数ではバージョン番号の他にも様々なメタ情報が取得できるので、もし他のメタ情報を取得したい時などには\u003Ca href=\"https:\u002F\u002Fcodex.wordpress.org\u002FFunction_Reference\u002Fget_plugin_data\">Codex\u003C\u002Fa>を参照してみて欲しい。\u003C\u002Fp>\n\u003Cp>\u003Cdiv class=\"clearfix\" style=\"margin-bottom: 2em;\">\u003C\u002Fdiv>\u003C\u002Fp>\n\u003Ch3>REST APIプラグインが有効な場合に管理画面のメニューを変更する\u003C\u002Fh3>\n\u003Cp>「Custom DataBase Tables」プラグインでは、WP REST APIが有効になっている場合に、プラグインメニューのサブメニューを「WEB APIs」ではなく「REST APIs」に変更して、管理画面も別画面を用意することにした。このように、あるプラグインの存在確認後に管理メニューの表示等を変更する場合、前述の例のようにプラグイン判定処理を「\u003Cstrong>admin_init\u003C\u002Fstrong>」のアクションにフックしてしまうと、メニューが変更できなくなってしまう。\u003Cbr \u002F>\nなぜなら、管理メニューのカスタマイズを行うためのアクションフック「\u003Cstrong>admin_menu\u003C\u002Fstrong>」のフックポイントが「\u003Cstrong>admin_init\u003C\u002Fstrong>」より前にあるため、メニューのカスタマイズ処理がプラグイン判定処理より前に実行されてしまうのだ。\u003Cbr \u002F>\nCodexでは \u003Ccode>is_plugin_active()\u003C\u002Fcode> を管理画面側のフックで使う場合は「\u003Cstrong>admin_init\u003C\u002Fstrong>」以降で使いなさいと謳っているのだが、今回は管理画面側でもフロントエンド側と同様に「\u003Cstrong>init\u003C\u002Fstrong>」で発火させるようにした。基本的に「\u003Cstrong>init\u003C\u002Fstrong>」のフックポイントには、管理画面やフロントエンドの区別なくプラグイン読み込み後の初期化処理で利用できるものなので、特に問題は出ない。\u003C\u002Fp>\n\u003Cp>最終的に、「init」アクションフックで「WordPress REST API Version 2」が有効になっているか確認し、有効であればその状態をフラグとして変数に格納しておき、その変数を条件として管理メニューのカスタマイズを行うという建付けになった。\u003Cbr \u002F>\nなお、下記のサンプルは、私の「Custom DataBase Tables」の管理画面用のClassを要所のみピックアップして、概念化したものだ（なので、そのままコーディングしても動作しないので注意が必要）。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>final class CdbtAdmin {\n\n  public $with_rest_api = false;\n\n  private function setup_actions() {  \n\n    add_action( 'init', array( $this, 'check_outer_plugins' ) );\n\n    add_action( 'admin_menu', array( $this, 'admin_menus' ) );\n\n  }\n\n  private function check_outer_plugins() {\n\n    \u002F\u002F Web APIs Initialize\n    $determine_plugin = 'rest-api\u002Fplugin.php';\n    if ( is_plugin_active( $determine_plugin ) ) {\n      $plugin_dir_path = str_replace( site_url( '\u002F' ), ABSPATH, plugins_url() );\n      $plugin_data = get_plugin_data( $plugin_dir_path . '\u002F' . $determine_plugin, false, false );\n      if ( version_compare( $plugin_data['Version'], '2.0-beta', '&gt;' ) ) {\n        \u002F\u002F with WordPress REST API v2\n        $this-&gt;with_rest_api = true;\n      }\n    }\n\n  }\n\n  public function admin_menus() {\n\n    $menus = [];\n\n    （省略）\n\n    if ( $this-&gt;with_rest_api ) {\n      $menus[] = add_submenu_page( \n        'cdbt_management_console', \n        __('CDBT REST APIs Management', $this-&gt;domain_name), \n        __('REST APIs', $this-&gt;domain_name), \n        'activate_plugins', \n        'cdbt_rest_apis', \n        array( $this, 'admin_page_render' ) \n      );\n    } else {\n      $menus[] = add_submenu_page( \n        'cdbt_management_console', \n        __('CDBT WEB APIs Management', $this-&gt;domain_name), \n        __('Web APIs', $this-&gt;domain_name), \n        'activate_plugins', \n        'cdbt_web_apis', \n        array( $this, 'admin_page_render' ) \n      );\n    }\n\n　  （省略）\n\n  }\n\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>これで、今回のトピックは終了である。\u003C\u002Fp>\n\u003Cp>\u003Cdiv class=\"clearfix\" style=\"margin-bottom: 3em;\">\u003C\u002Fdiv>\u003C\u002Fp>\n\u003Cp>（今回の「WP REST API」プラグインのように）外部のリソースに依存するような仕組みをプラグインに持たせる場合、その外部リソースを利用していない環境でもエラーが発生しないように作ることは地味に大切だと思う。私見にはなるのだが、そういうところがしっかりしていると利用してくれるユーザからのアプリケーションへの信頼感を無駄に失わなくて済むからだ。\u003Cbr \u002F>\n経験則的に、プラグインやテーマを利用していてエラーとかが発生すると、そのエラーがクリティカルなものではなかったとしても、そのアプリケーションへの信頼感は下がってしまう感じがする（いやぁ、自分で書いておきながら、耳が痛いなぁ……苦笑）。\u003C\u002Fp>\n\u003Cp>次回はカスタム・エンドポイントを使ってプラグインの独自処理を作ってみるトピックにしようかと…。\u003C\u002Fp>\n",[275,278,280],{"slug":276,"name":277},"customdatabasetables","CustomDataBaseTables",{"slug":74,"name":279},"WordPress",{"slug":281,"name":282},"wordpress-rest-api","WordPress REST API",[284,287,294,297],{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":285},[286],{"slug":13,"name":7},{"slug":288,"title":289,"date":290,"excerpt":291,"image":42,"categories":292},"on-september-28-released-version-2-of-custom-database-tables-plugin","9月28日にCustomDataBaseTablesプラグインのバージョン2をリリースします","2015-09-24T14:05:18","長らくお待たせしました。 当初、6月とか7月頃のリリース予定だったのですが、ここまで延びる破目（はめ）になるとは…まさに、自分的にも予想外です。 いやはや、長かった…というのが率直な感想です。特に今月に入ってからの動作検…",[293],{"slug":13,"name":7},{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":295},[296],{"slug":74,"name":75},{"slug":298,"title":299,"date":300,"excerpt":301,"image":302,"categories":303},"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",[304],{"slug":74,"name":75},{"slug":306,"title":307,"date":308,"excerpt":309,"image":310,"categories":311},"placing-the-social-buttons-of-default-style-can-get-the-effect-of-maximally","ソーシャルボタンを設置する場合はデフォルトのままが最も効果的である","2016-09-29T14:30:59","いまや、WEBサイトをはじめとしたデジタル媒体では必須コンポーネントとなったソーシャル・リンク──コンテンツをfacebookやTwitterといったSNSと連携できる「いいね」や「Tweet」といったソーシャル・ボタン…","\u002Fassets\u002Fuploads\u002F2016\u002F09\u002Fsocial-links-correctly.png",[312],{"slug":25,"name":26},{"slug":28,"title":29,"date":30,"excerpt":31,"image":32,"categories":314},[315],{"slug":35,"name":36},1793391397765]