icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【ヘッドレスCMS?】PHPのcURL・glob関数を使って、json出力したGetSimple CMS CE記事一覧をつくる方法

更新: 2023/11/20 4218文字

今回は、以前の記事でおこなった『GetSimple CMS CEでjson出力』の続きで、ブログとかCMSのような記事一覧を作ってみます。PHPファンクションとしてはループ処理などのほかに、『glob(xmlが保存されているので一覧)』『cURL(外部サイトの情報を取る)』なども扱います。さっそく内容を見ていきましょう。

前回のおさらい(テーマ改造してjson出力まで、)

ここで前回のおさらいをします。GetSimple CMS CEのテーマを改造して、json出力というところまでやりました。この段階では『pubDate』『title』『url』『content』『mg_eyecatch』などが出力されるようになっています。ほかにも出力フィールドはあるんですけど、今回はつかわないかも。

今回はここから、『特定ジャンル(スラッグの命名規則で絞った)』の一覧を出力してみたいと思います。

GetSimple CMS CE本体での設定

アイキャッチ出力する場合~I18N Custom Fieldsプラグインで設定

こちらは前回設定したので、詳しい説明は省きます。デフォルトではアイキャッチがないので、カスタムフィールドで設定する、というもの。 該当過去記事の以下の段落(#i-2の段落にリンクします)をご確認ください。

https://division-web.atelier-ss-agency.com/9682/output-json-from-getsimple/#i-2

記事の準備~スラッグ(url)で特定のカテゴリーが絞れるようにする

例えばWordPressだったら『固定ページ/投稿ページ』みたいなのがあるし、カテゴリー機能もあります。普通のフリーブログでもカテゴリ絞り込みはあります。 しかし、GetSimple CMS CEはカテゴリ機能がデフォルトでは、無いようです。 (*カテゴリなどのブログ機能プラグインは、PHP8以上の環境で動かない)

そこで(他にも良い方法があるかもしれませんが)、管理人は『ファイル命名規則を使って絞る』というのを思いつきました。 やり方としては、例えば『サイトの固定ページみたいなのにpage-』『ブログに使いたい記事にはblog-』のような接頭辞をつけました。『スラッグ(url)』の欄に入力します。 GetSimple CMSはフラットファイルにつきデータベースが無いので、この方がフォルダ内検索しやすいかな、という判断です。

この方法でいくつか記事をつくってみましたが、記事xmlファイルが保存されているフォルダは、こんな感じになります。ブログに使うことを想定しているものは『blog-』、固定ページ的なのは『page-』というようにわけてあります。

また、このCMSでは『親ページ・子ページ』という概念があるので、管理画面でまとめやすくするために『親ページ:blogarchives』というのを作りました。管理画面上ではこのようにまとまって表示されます。 このページにはコンテンツが無いので、直接『id=blogarchives』という形でアクセスされた場合は、『アーカイブページを表示する・またはそのページにリダイレクトする』のような処理でもよいでしょう。

PHPのcURLを使って、jsonを取ってこれるかテストする

管理人はこれまで、外部情報取得には『file_get_contents』を使っていました。しかし今回は『xmlをループ回して取る』みたいな処理が予測されます。 調べたところ『cURLの方が速い・エラーハンドリングや関連する関数が充実している』というのがわかったので、使ってみます。まずはjsonを取れるか、テストしましょうか。

PHPのcURLとは?

外部のurlから情報を取得してくるファンクションです。 マニュアルによると『 curl_init()でcURLセッション初期化』『curl_setopt()でオプションをセット』『curl_exec() で実行』『curl_close()でセッション閉じる』といった一連の流れがあるようです。

file_get_contentsより少しややこしいので熟練者向けかもしれませんが、流れを押さえて使ってみます。

PHPのcURLが使えるかの、確認方法は?

PHPマニュアルには、 cURLを使うためのlibcurlパッケージのインストール要件などが記載されています。使えなかった場合はインストールする必要がありますが、使えるか確認してみましょう。

phpinfo()ファンクションを使って確認してみました。ローカルのxampp環境(Version 8.1.6/ PHP 8.1.6)でしたが『cURL support:enabled』となってたのでokです。

コード&表示例

PHPマニュアルにあった流れでやってみました。ポイントはcurl_setoptの設定で『CURLOPT_RETURNTRANSFER, true』にする点。これで、curl_execしたときにjsonの文字列が出ます。そのあとはデコードしてダンプ、セッション終了という流れです。

このコードを実行したところ、このように記事データが出てきました。これで情報をとれそうですね。

PHPのcURL・glob関数で、json出力したGetSimple CMS CEの記事一覧を作る

コードと解説

前半の方ではglobを使って、『特定形式のファイル(’/〇〇/blog-*.xml’の部分)を取る』『スラッグのリストが入った配列を作る』という感じ。globの『*』は、『blog-』と『.xml』の間にゼロ文字以上の文字列がマッチ、という形になります。これで『blog-の接頭辞が付いたものだけに絞る』というのを行っています。

あとはstr_replaceを使って空白置きかえして、最終的にスラッグのリストが入った配列ができるようにします。
配列はarray{ [0]=> string(9) ”blog-0001” [1]=> string(9) ”blog-0002”~}という内容で、これを後半部分でurlにくっつけて curlで取る・この配列の中身ぶんループ回す、という流れです。

アイキャッチは『ない場合の処理』や日付は『Mon, 06 Nov 2023 02:20:55 +0900 の形式だったのでフォーマット変換($date->format();)』なども入れています。

表示例

上記のコードを実行したところ、こんな感じで一覧が表示されました。GetSimple CMSデフォルトで一覧ページが無かったので、ブログっぽくなりましたねー。

なお、ページ遷移先は『http://localhost/gs-ce/?id=blog-0004』のような形式になっており、gs-ceディレクトリのindex.phpで、idを判定して記事を表示するようにしてあります。

今後つけたい機能

日付などでのソート

上記の例では『フォルダ内のファイルの順番』に記事が並んでいます。これを日付順ソートしたい場合もあるでしょう。

方法としては、
『フォルダにアクセスする段階でファイルの日付も取って、この値でソートしてループぶぶんに渡す』
『要素に日付クラス/idを出力して、jqueryやw3.jsで並べ替える』

といったのが考えられます。

ページネーション

記事数が30~40件とか増えてきた場合は、ページネーションも必要になってきますね。管理人はWPページネーションとか、配列をn件ずつ分割してページネーションとか、jsライブラリとか扱いましたが、ラクそうなのはフロント処理かなって感じはします。

カテゴリ選択したら、スラッグに自動附番

GetSimple CMSのカスタムフィールドプラグインには『ラジオボタン』みたいなのもあるんですけど、これを選択した状態で保存すると、『ブログを選択した場合はblog-〇〇が自動的にスラッグに附番』みたいなのがあってもよさそうです。理屈的には『ラジオボタン選択かつ、保存前にフォームのname=”slag”の先頭5文字にblog-が無ければ附番してから保存』みたいな感じですかね。

あとがき・まとめ

  • GetSimple CMS CEには記事一覧が無いが、globとcURLを組み合わせて取ってこれる
  • cURLは初期化・オプション・実行・セッションクローズみたいな一連の流れで使う

まとめると、こんなところでしょうか。いくつか追加したい機能があるものの、形になったら、『新着情報のためだけにWordPress入れるのもなんかなー』というケースに対しての提案材料になるかもしれません。


【カテゴリ】- フラットファイルCMS
【タグ】- , , ,

関連記事