[{"data":1,"prerenderedAt":324},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f2b69k07jxue0o":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":283,"prev":310,"next":317},"import-to-wordpress-from-blogger-posts-by-api","Bloggerに投稿された記事をAPIを使って取得してWordPressに登録する","2014-09-01T19:00:37","Google社が提供している無料のブログページ作成サービス「Blogger」に投稿した記事を、APIを使ってWordPress側で取得してみようと思う。もちろん、すでに「Blogger」で自分のブログを開設しているのが大…",[271],{"slug":74,"name":75},"2014-09-03T17:41:46","\u003Cp>Google社が提供している無料のブログページ作成サービス「Blogger」に投稿した記事を、APIを使ってWordPress側で取得してみようと思う。もちろん、すでに「Blogger」で自分のブログを開設しているのが大前提だ。その上で、まずBlogger用のAPIを利用するためのAPI KEYを入手する。\u003C\u002Fp>\n\u003Ch3>Google API KEY の取得方法\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fconsole.developers.google.com\u002F\">Google Developers Console\u003C\u002Fa>に、Bloggerでブログを開設したGoogleアカウントでログインする。\u003C\u002Fli>\n\u003Cli>Google Developers Consoleのサイドバーメニューから「APIs」を選択して、「Blogger API v3」を有効化する（図1 参照）。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss01.png\" alt=\"利用するAPIを有効化する\" title=\"利用するAPIを有効化する\" \u002F>\u003Ccenter>&lt;図1: \u003Cem>利用するAPIを有効化する\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>サイドバーメニューの「Credentials」を選択して、“Public API access”欄の「Create new Key」を押す（図2 参照）。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss02.png\" alt=\"Google API Keyを新規作成する\" title=\"Google API Keyを新規作成する\" \u002F>\u003Ccenter>&lt;図2: \u003Cem>Google API Keyを新規作成する\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>APIをどこから利用するかを選択する。もしJavaScriptからAPIリクエストを投げるのであれば「Browser Key」を選択する（図3 参照）。今回はJavaScriptとPHPの両方のケースでBlogger連携をしてみようと思う。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss03.png\" alt=\"Google APIをJavaScript（AJAX等）から利用する場合\" title=\"Google APIをJavaScript（AJAX等）から利用する場合\" \u002F>\u003Ccenter>&lt;図3: \u003Cem>Google APIをJavaScript（AJAX等）から利用する場合\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>APIの呼び出しを許可するリクエスト元のサイトのドメイン（FQDN）を指定する（図4 参照）。ワイルドカードが使えるので、サブドメインやドキュメントルート下のパスは「*」にしておくとサイト全体を呼び出し元として許可できる。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss04.png\" alt=\"Google APIの利用を許可するリクエスト元サイト（FQDN）の設定\" title=\"Google APIの利用を許可するリクエスト元サイト（FQDN）の設定\" \u002F>\u003Ccenter>&lt;図4: _Google APIの利用を許可するリクエスト元サイト（FQDN）の設定_>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>まずJavaScript連携用のAPI Keyが出力される（図5 参照）。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss05.png\" alt=\"API Keyの確認\" title=\"API Keyの確認\" \u002F>\u003Ccenter>&lt;図5: \u003Cem>API Keyの確認\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>次にCGI連携用のAPI Keyを作成するので、3.の手順と同じく、再び「Create new Key」を押す。\u003C\u002Fli>\n\u003Cli>サーバーサイドCGIからAPIリクエストを投げる用のAPI Keyを作成するので、「Server key」を選択する（図6 参照）。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss03b.png\" alt=\"Google APIをサーバーサイドCGIから利用する場合\" title=\"Google APIをサーバーサイドCGIから利用する場合\" \u002F>\u003Ccenter>&lt;図6: \u003Cem>Google APIをサーバーサイドCGIから利用する場合\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>APIの呼び出しを許可するリクエスト元のIPアドレス（もしくはサブネットアドレス）を指定する（図7 参照）。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss04b.png\" alt=\"Google APIの利用を許可するリクエスト元ホスト（IPアドレス\u002Fサブネットアドレス）の設定\" title=\"Google APIの利用を許可するリクエスト元ホスト（IPアドレス\u002Fサブネットアドレス）の設定\" \u002F>\u003Ccenter>&lt;図7: \u003Cem>Google APIの利用を許可するリクエスト元ホスト（IPアドレス\u002Fサブネットアドレス）の設定\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003Cli>最後にAPI Keyを確認したら完了（図8 参照）。図8の赤い枠線で囲った欄のAPIKEYを控えておきます。\u003Cbr \u002F>\n\u003Cimg data-recalc-dims=\"1\" decoding=\"async\" src=\"\u002Fassets\u002Fuploads\u002F2014\u002F08\u002Fget_google_apikey_ss05b.png\" alt=\"Google Developers ConsoleでAPI KEYを確認する\" title=\"Google Developers ConsoleでAPI KEYを確認する\" \u002F>\u003Ccenter>&lt;図8: \u003Cem>Google Developers ConsoleでAPI KEYを確認する\u003C\u002Fem>>\u003C\u002Fcenter>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\u003Cp>\n  Google Developers ConsoleにはAPI Explorerというツールがあって、実際のAPIの動きをシミュレートできる。例えば「APIｓ」のAPI一覧から「Blogger API v3」を選ぶと、利用できるAPIのメソッドが一覧表示される。使ってみたいメソッドを選ぶと、API Explorerページが表示されるので、WEB上から必要なパラメータを入力してやることで、実際のAPIリクエストのサンプルと実行結果がその場で確認できる。ここで動きを確認してから、必要なAPIコマンドだけを呼び出し元サイトに設定するというお手軽なAPI連携開発ができるのだ（さすが、Google！）。\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch3>BloggerのブログIDを取得する\u003C\u002Fh3>\n\u003Cp>BloggerのブログIDは何気にダッシュボードや設定画面などに明示的に書いてなかったので、URLから拾うのが手っ取り早い。各投稿のページか、ダッシュボードの概要ページのURLなどのGETパラメータ\u003Ccode>blogID\u003C\u002Fcode>の値を取得しよう。\u003C\u002Fp>\n\u003Cp>記事投稿ページ（新規投稿）\u003C\u002Fp>\n\u003Cpre>\u003Ccode>https:\u002F\u002Fdraft.blogger.com\u002Fblogger.g?blogID=&lt;ここの数字がブログID&gt;#editor\u002Fsrc=dashboard\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ダッシュボード・概要ページ\u003C\u002Fp>\n\u003Cpre>\u003Ccode>https:\u002F\u002Fdraft.blogger.com\u002Fblogger.g?blogID=&lt;ここの数字がブログID&gt;#overview\u002Fsrc=dashboard\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>WordPress側でのAPI呼び出し\u003C\u002Fh3>\n\u003Cp>今回はBloggerの記事リストを最大10件取得して、WordPress側に未登録のブログIDがあればWordPressの投稿として登録するような処理を作ってみようかと思う。この処理に必要なAPIメソッドは、Bloggerの記事リストを取得できる「\u003Cstrong>blogger.posts.list\u003C\u002Fstrong>」だ。ただ、blogger.posts.listメソッドを素で呼ぶと、投稿についたコメントや投稿者情報など、WordPress側で利用したい記事データ以外の情報も含まれて、通信量が膨らんでしまってパフォーマンスが悪くなるので、\u003Ccode>fields\u003C\u002Fcode>パラメータで取得するデータを絞り込むことにする。その辺の取得データの絞り込みを行うのにはGoogle Developers ConsoleのAPI Explorerが便利だ。これでパラメータを色々試してみて、最終的なAPIリクエストはこうしてみた。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>GET https:\u002F\u002Fwww.googleapis.com\u002Fblogger\u002Fv3\u002Fblogs\u002F{BLOG_ID}\u002Fposts?maxResults=10&amp;orderBy=published&amp;fields=items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)&amp;key={YOUR_API_KEY}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ではさっそく、WordPressサイト側でBloggerの記事を取得してみよう。まずはAPI経由で記事を取得する部分のみのコードをPHPとJavaScriptでそれぞれ書いてみる。\u003C\u002Fp>\n\u003Ch4>PHP版\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>&lt;?php\n$google_api_key = '&lt;Google API Key (Server key)&gt;';\n$blog_id = '&lt;BloggerのブログID&gt;';\n$fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';\n$api_request = sprintf(\"https:\u002F\u002Fwww.googleapis.com\u002Fblogger\u002Fv3\u002Fblogs\u002F%s\u002Fposts?maxResults=10&amp;orderBy=published&amp;fields=%s&amp;key=%s\", $blog_id, $fields_param, $google_api_key);\n\n$response = file_get_contents($api_request);\n$r = json_decode($response);\n$blogger_posts = array();\n$i = 0;\nforeach ($r as $items) {\n    foreach ($items as $item) {\n        foreach ($item as $key =&gt; $val) {\n            $blogger_posts[$i][$key] = $val;\n        }\n        $i++;\n    }\n}\n\nvar_dump($blogger_posts);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>JavaScript版\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;script src=\"\u002F\u002Fajax.googleapis.com\u002Fajax\u002Flibs\u002Fjquery\u002F1.11.0\u002Fjquery.min.js\"&gt;&lt;\u002Fscript&gt;\n&lt;\u002Fhead&gt;\n&lt;body&gt;\n&lt;ul class=\"posts\"&gt;&lt;\u002Ful&gt;\n&lt;script&gt;\n$(document).ready(function(){\n    var google_api_key = '&lt;Google API Key (Browser key)&gt;';\n    var blog_id = '&lt;BloggerのブログID&gt;';\n    var fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';\n    var request_url = 'https:\u002F\u002Fwww.googleapis.com\u002Fblogger\u002Fv3\u002Fblogs\u002F' + blog_id + '\u002Fposts?maxResults=10&amp;orderBy=published&amp;fields=' + fields_param + '&amp;key=' + google_api_key;\n\n    function parseData(postObj) {\n        var post_list = '&lt;li&gt;&lt;h3 kind=\"' + postObj.kind + '\"&gt;&lt;a href=\"' + postObj.url + '\"&gt;' + postObj.title + '&lt;\u002Fa&gt; (' + postObj.id + ')&lt;\u002Fh3&gt;&lt;div&gt;' + postObj.content + '&lt;\u002Fdiv&gt;&lt;p&gt;PublishDate: &lt;time&gt;' + postObj.published + '&lt;\u002Ftime&gt;&lt;\u002Fp&gt;&lt;\u002Fli&gt;';\n        $('.posts').append(post_list);\n    }\n\n    $.ajax({\n        type: 'GET', \n        url: request_url, \n        dataType: 'json', \n        complete: function(response) {\n            var items = response.responseJSON.items;\n            items.forEach(parseData);\n        }\n    });\n});\n&lt;\u002Fscript&gt;\n&lt;\u002Fbody&gt;\n&lt;\u002Fhtml&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\n  素でAjax処理書くのが面倒だったので、jQuery使ってます。\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>さて、これでBloggerの最新記事が最大10件、API経由で取得できたので、あとはWordPressに同じ投稿がなければ、新規投稿として登録するという処理を作ってみる。こちらはPHP建てになるので、API呼び出し部のソースもPHP版を使う。\u003C\u002Fp>\n\u003Ch3>WordPressにBloggerの記事を登録する\u003C\u002Fh3>\n\u003Cp>最終的な処理仕様は、API経由で取得したBloggerの最新10件の記事にて、同じ記事タイトルの投稿がWordPress側になかった場合、WordPressの新規投稿として記事を登録するというもの。今のところ記事の同一性はタイトル名でしか判断していない。また、WordPress側への登録時の投稿ステータスは「下書き」（\u003Ccode>draft\u003C\u002Fcode>）にしてある。もし、取得した記事をそのまま公開してしまいたい場合は、投稿ステータスを\u003Ccode>publish\u003C\u002Fcode>にすること。\u003Cbr \u002F>\nあと、WordPressへの記事登録が成功した場合は、スクリプトを実行したディレクトリと同一のところに登録投稿IDのログを出力している。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>regist_post_to_blogger.php\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&lt;?php\nrequire_once '.\u002Fwp-load.php';\n\n$google_api_key = '&lt;Google API Key (Server key)&gt;';\n$blog_id = '&lt;BloggerのブログID&gt;';\n$fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';\n$api_request = sprintf(\"https:\u002F\u002Fwww.googleapis.com\u002Fblogger\u002Fv3\u002Fblogs\u002F%s\u002Fposts?maxResults=10&amp;orderBy=published&amp;fields=%s&amp;key=%s\", $blog_id, $fields_param, $google_api_key);\n\n$response = file_get_contents($api_request);\n\n$r = json_decode($response);\n$blogger_posts = array();\n$i = 0;\nforeach ($r as $items) {\n    foreach ($items as $item) {\n        foreach ($item as $key =&gt; $val) {\n            $blogger_posts[$i][$key] = $val;\n        }\n        $i++;\n    }\n}\n\n$wp_posts = get_posts( array('numberposts'=&gt;-1) );\n$insert_posts = array();\n$insert_post_ids = array();\nfor ($i = 0; $i&lt;count($blogger_posts); $i++) {\n    $insert_flag = true;\n    foreach ($wp_posts as $wp_post) {\n        if ($wp_post-&gt;post_title == $blogger_posts[$i]['title']) {\n            $insert_flag = false;\n            break;\n        }\n    }\n    $insert_posts[] = $insert_flag;\n}\nif (in_array(true, $insert_posts)) {\n    for ($i = 0; $i&lt;count($insert_posts); $i++) {\n        if ($insert_posts[$i]) {\n            $add_post = array(\n                'post_title' =&gt; $blogger_posts[$i]['title'], \n                'post_content' =&gt; $blogger_posts[$i]['content'], \n                'post_status' =&gt; 'draft', \n                'post_type' =&gt; str_replace('blogger#', '', $blogger_posts[$i]['kind']), \n                'post_author' =&gt; 1, \n                'ping_status' =&gt; get_option('default_ping_status'), \n                'post_category' =&gt; array(0), \n                'post_name' =&gt; $blogger_posts[$i]['id'], \n                'post_date' =&gt; date('Y-m-d H:i:s', strtotime($blogger_posts[$i]['published'])), \n                'post_date_gmt' =&gt; gmdate('Y-m-d H:i:s', strtotime($blogger_posts[$i]['published'])), \n                'post_parent' =&gt; 0, \n                'menu_order' =&gt; 0, \n                'to_ping' =&gt; '', \n                'post_password' =&gt; '', \n                'guid' =&gt; '', \n                'post_content_filtered' =&gt; '', \n                'post_excerpt' =&gt; '', \n                'import_id' =&gt; 0, \n            );\n            $post_id = wp_insert_post($add_post);\n            if ($post_id) \n                $insert_post_ids[] = $post_id;\n        }\n    }\n}\nif (!empty($insert_post_ids)) {\n    error_log(sprintf('The post ids of %s was inserted.', implode(',', $insert_post_ids)), 3, '.\u002Finsert_pid.log');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\n  スクリプトの最初で\u003Ccode>require_once '.\u002Fwp-load.php';\u003C\u002Fcode>をしているので、WordPressがインストールされているディレクトリ下であれば、どこに配置しても動作するようにしてある。なので、cronジョブなどに組み込んで、1日1回とか自動実行することも可能だ。テーマやプラグインなどに組み込む場合は、\u003Ccode>require_once '.\u002Fwp-load.php';\u003C\u002Fcode>を外して、別途起動するディスパッチャを作ってあげるといいかも。\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>これで、BloggerとWordPressにて記事の連携（Bloggerに記事を書く→WordPressにインポートして記事を公開するという流れ）が可能になる。\u003C\u002Fp>\n",[275,278,281],{"slug":276,"name":277},"blogger","Blogger",{"slug":279,"name":280},"google-api","Google API",{"slug":74,"name":282},"WordPress",[284,287,295,303],{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":285},[286],{"slug":74,"name":75},{"slug":288,"title":289,"date":290,"excerpt":291,"image":292,"categories":293},"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",[294],{"slug":74,"name":75},{"slug":296,"title":297,"date":298,"excerpt":299,"image":300,"categories":301},"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",[302],{"slug":74,"name":75},{"slug":304,"title":305,"date":306,"excerpt":307,"image":71,"categories":308},"part4-conceal-of-registration-or-authentication-on-wordpress","第４章 WordPressの登録・認証系の秘匿化","2020-03-26T02:06:28","前章までの施策によって、フロントエンド側に出力されるコンテンツ系ページからWordPressっぽさを排除できた。だが、ログイン画面などの認証系周りは未施策なため、この章ではその辺の秘匿化を行なっていく。 まず、現状の…",[309],{"slug":74,"name":75},{"slug":311,"title":312,"date":313,"excerpt":314,"image":42,"categories":315},"may-be-satisfactorily-on-the-web-if-has-skill-set-of-javascript-and-php","PHP+JavaScriptのスキルセットがあればWebの世界では順風満帆かもしれない","2014-08-27T09:59:54","先日、2014年8月度のプログラミング言語のトレンド状況の統計が示された。話題としては、今年春先頃から騒がれていて先月にはTOP20入りしたAppleの新しいプログラミング言語「Swift」が再びTOP20から下落したと…",[316],{"slug":22,"name":23},{"slug":318,"title":319,"date":320,"excerpt":321,"image":42,"categories":322},"activate-link-manager-of-wordpress-without-plugin","WordPressのリンク管理をプラグインなしで有効化する","2014-09-03T17:35:13","WordPressのバージョン3.5からリンク管理の機能が無効化され、現在は管理パネルに「リンク」のメニューが表示されなくなっている。ただ、実際にはリンク管理の機能がなくなっているわけではなく、WordPressのデフォ…",[323],{"slug":74,"name":75},1793391398673]