9月19日(金)a-blog cms DAYを開催しました

先日の9月19日(金)にa-blog cms DAYを開催しました。

a-blog cms DAYとは、全国各地でa-blog cmsの勉強をする日です。ビデオチャットを通して全国各地のa-blog cmsユーザーと繋がることができ、リアルタイムでわからないところを質問することができます。5カ所の都市で開催されていますが、ビデオチャットで各地とつながっているため、お近くに会場がない場合は開催していただくこともできますし、ご自宅からでもご参加できます。

当日は山形、名古屋、神戸、広島、金沢の5カ所のサテライト会場で開催されました。今回、金沢があたらしくサテライト会場として追加されました。


a-blog cms DAY 名古屋会場風景

当日は名古屋会場から#ablogcms STREAMの放送、当日会場に来られた方のサポート、各サテライト会場からのご質問にもお答えしました。

#ablogcms STREAMの放送では、a-blog cmsの開発担当から先日リリースしたVer.2.1.1の解説に加え、a-blog cmsを使って主に受託案件をこなしているスタッフから便利機能・カスタマイズなどについてご紹介しました。スタッフからの新機能、カスタマイズ方法のご紹介につきましては後日YouTubeにまとめて公開する予定です。

名古屋会場には東京からの参加者にもお越し頂きました


#ablog cms STREAMの放送だけではなくサポートも行っています

東京にはまだサテライト会場がなく、名古屋会場には東京からのご参加もありました。まだまだサテライト会場の募集をしているので、お問い合わせやa-blog cmsのFacebookTwitterアカウントでお知らせいただければと思います。


次回のa-blog cms DAYは10月17日(土)の開催です。ご興味ある方はお近くの会場、またはオフィスやご自宅からぜひご参加ください。

CSVファイルからのインポート

管理ページからカンマ区切りデータ(csv形式)をエントリー・カスタムフィールド、ユニットに変換してインポートすることができます。

実行は慎重に

データ数が多いインポート処理はサーバーへの負荷が高くなります。そのため、作業時間・タイミングに注意しておこなってください。

カテゴリーコードとエントリーコードの重複

既存のコンテンツとインポートされるコンテンツとの間で同じコードをもつエントリーやカテゴリーが存在する場合はコードの重複が発生します。その場合はコンテンツが正しく表示されない可能性がありますので、インポート後に管理ページから個別に修正してください。

インポートの仕様

CSVファイルの内容によって、以下のような仕様があります。

  • CSVファイルに、カスタムフィールドの情報のみが含まれる場合は、エントリー情報は自動で作成されます。
  • CSVに entry_category_id を指定することで、優先してそのカテゴリーにインポートされます。
  • CSVに entry_id (エントリーID)フィールドを用意すると、同じエントリーIDのエントリーを上書きするようになります。 すべて、新規追加する場合は、 entry_id を指定しないでください。
  • データとして改行を含みたい場合は、値をダブルクウォートで囲みます。

プロフェッショナル版以上

プロフェッショナルライセンス以上限定になりますが、 CSVの項目に entry_id がなく「*(アスタリスク)」から始まる項目名(1つ)がある場合、その項目をキーにして一意(unique)になるエントリーをアップデートします。

CSVに指定できるフィールド



フィールド名 フォーマット 説明 指定なしの場合
entry_id 数値 エントリーIDを指定。 123 新規eid
entry_code 文字列 コード(ファイル名)を指定。 entry-123.html 通常エントリ作成時と同様
entry_sort 数値 表示順を指定(新規追加のみ)。 1 通常エントリ作成時と同様
entry_user_sort 数値 ユーザーを指定して一覧表示する時の表示順を指定(新規追加のみ)。 1 通常エントリ作成時と同様
entry_category_sort 数値 カテゴリーを指定して一覧表示する時の表示順を指定(新規追加のみ)。 1 通常エントリ作成時と同様
entry_status open | close | draft | trash ステータスを指定(open: 公開、close: 非公開、draft: 下書き、trash: ゴミ箱)のいずれかを指定。 open open
entry_title 文字列 タイトルを指定。 テストエントリー CSV_IMPORT-[eid]
entry_link 文字列 リンク先URLを指定。 https://www.a-blogcms.jp/
entry_datetime yyyy-MM-dd H:mm:ss 日付を指定。 2018-12-06 15:08:01 インポート時の日時
entry_start_datetime yyyy-MM-dd H:mm:ss 公開日時を指定。 2018-12-06 15:08:01 1000-01-01 00:00:00
entry_end_datetime yyyy-MM-dd H:mm:ss 掲載期限を指定。 2018-12-06 15:08:01 9999-12-31 23:59:59
entry_posted_datetime yyyy-MM-dd H:mm:ss 作成日を指定。 2018-12-06 15:08:01 インポート時の日時
entry_updated_datetime yyyy-MM-dd H:mm:ss 更新日を指定。 2018-12-06 15:08:01 インポート時の日時
entry_hash 文字列 ハッシュ値を指定(新規追加のみ)。 通常エントリ作成時と同様
entry_summary_range 数値 ユニットの「続きを読む」の位置を指定(例: 3 -> 上から3番目のユニットを一覧で出力)。 3
entry_indexing on | off インデキシング(一覧に出力するかどうか)を設定(on: 出力する、off: 出力しない)。 on on
entry_members_only on | off 会員限定エントリーを設定(on または、off) on off
entry_primary_image 数値 メイン画像のユニットIDを指定。 123
entry_category_id 数値 カテゴリーIDを指定。 1
entry_user_id 数値 エントリー所有者のユーザーIDを指定。 1 インポート実行者のUID
entry_tag 文字列/文字列/文字列 エントリーのタグを指定。 aaa/bbb/ccc
entry_sub_category カンマ区切り数値 サブカテゴリーの数値をカンマ区切りで指定(必ずダブルクウォートで囲むこと)。 "1,2,3"
geo_lat 数値 エントリーの経度を指定。 136.761737
geo_lng 数値 エントリーの緯度を指定。 35.424289
geo_zoom 数値 エントリーのズームを指定。 10
unit@タグセレクト[数値] 文字列 テキストユニットの追加。
タグセレクト: テキストタグセレクトで設定できるもの [p, h2, h3, ul, markdown, none....] 
[]の中の数値: ユニットの順番を指定
テストユニット
カスタムフィールド変数 カスタムフィールド としてインポートされます。インポート先のフィールド仕様にあった値を設定ください。
また、保存されるカスタムフィールドの値は、自動的に検索対象となります。

※ エントリーの追加や更新が混ざっている CSV でインポートする際には、新規追加のエントリーID は 空ではなく -1 を設定 ください。

CSVファイルからのインポート手順

  1. インポートするカンマ区切りデータ(csv形式)を用意します。
  2. ログインをして管理ページのインポートにアクセスします。(図1)
  3. インポート先のブログを確認し、インポート先のカテゴリーを必要に応じて選択してください。(図2)
  4. インポート元になるCSVファイルを選択します。
  5. [インポートを実行する]ボタンをクリックすると、インポートを実行します。

(図1)インポート管理トップ

(図1)インポート管理トップ

(図2)CSVインポート画面

(図2)CSVインポート画面

CSVファイルの例

"entry_title","entry_code","zip","tel","address","unit@p[1]","unit@markdown[2]"
"アップルップル","csv-1","450-0002","052-485-8577","名古屋市中村区名駅3-18-5 モンマートビル5F","1つ目のユニット","## 見出し2"
"あっぷるっぷる","csv-2","000-0000","000-000-0000","指定したentry_titleやentry_codeの通りにエントリーが生成されます", "1つ目のユニット","### 見出し3"
"appleple","csv-3","111-1111","111-111-1111","フィールド名は任意の英数字で指定できます","1つ目のユニット","
## 見出し2

ダブルクウォートで囲むことで改行できます。

- リスト1
- リスト2
- リスト3
"
  • entry_title:エントリーのタイトル
  • entry_code:エントリーのコード(既存のエントリーとの重複を避けユニークな文字列を指定してください。拡張子はいりません。)
  • zip:カスタムフィールド、郵便番号として利用
  • tel:カスタムフィールド、電話番号として利用
  • address:カスタムフィールド、住所として利用
  • unit@[1] : 1番目のテキストユニット
  • unit@markdown[2] : 2番目のマークダウンテキストユニット

Webhookで外部サービスとCMSを連携してみよう


この講座では、Ver.2.12の新機能、Webhookをカスタマイズする方法をご紹介します。

また、この講座の内容はYouTubeにアップされています。記事と合わせてご覧ください。



UTSUWAテーマを元にカスタマイズを紹介するので、 ablogcms.io ベータ版 にてインストールしてください。デフォルトでUTSUWAが指定された状態でインストールされます。

この講座では以下の環境が必要になります。事前に取得しておくとスムーズに講座が受けられます。

  • Slackで自由に使えるワークスペース(テスト用にチャンネルにbotを追加します)
  • Googleのアカウント(Google Driveに送信した画像ファイルを保存します)
  • IFTTTのアカウント(1つ、Appletを追加します)

APIとWebhookの違い

APIはApplication Programming Interfaceの略で、「アプリケーションとプログラムを繋ぐ」という意味になります。例えば、基本的にはリクエストを出してあげないと動いてくれません。

Webhookはリクエストしなくてもレスポンスをしてくれます。ただし、あらかじめ設定した条件を満たした場合に限ります。例えば、どこかのサイトが更新されたら自動的に通知されるなど、ユーザーが何もしていなくてもレスポンスを返してくれます。

例えば、サイトの通知を受け取りたい場合、APIの場合は更新されたか何度も確認させる必要がありますが、Webhookの場合は最初に更新したら通知するという指示を与えておき、更新されるたびに通知できるようになります。

Webhookに対応したサービス

Webhookに対応したサービスです。

  • Slack
  • ChatWork
  • Facebook
  • Twitter
  • LINE
  • Trello
  • PayPay
  • PayPal
  • Dropbox
  • Evernote
  • Google Drive

などのたくさんのサービスが対応しています。

a-blog cms がサポートしているイベント

  • エントリー(作成・更新・削除・公開)
  • フォーム(送信)

例えば、a-blog cms でエントリーが更新されたら、ツイッターやFacebookページに自動的に投稿することが可能になります。

SlackやChatworkなどはすでに拡張アプリも用意してありますが、こちらはフォーム送信時のみになりますが、Webhookの場合はSlackやChatworkを使った際にもエントリーに対応しすることができます。

今回は、Slackに通知する方法と、IFTTTを使ってGoogle Driveにファイルを送信する方法をご紹介します。

Webhookを有効化する

ルートディレクトリにあるconfig.server.phpのHook_Enableを1にし、Webhookを有効化します。

define('HOOK_ENABLE', 1);

カスタマイズ1:エントリーを公開したらSlackに通知する

CMSでエントリーを公開したら、Slackに通知が行くように設定しましょう。

最終的には、以下のような通知が届くようになります。


Slackの設定

SlackのIncoming Webhookという機能を使います。

Incoming Webhookにアクセスしてください。 この時、右上のプルダウンで追加したいワークスペースか確認しましょう。追加したいワークスペースがない場合は新規作成してください。

  • Post to channel でチャンネルを選択する
  • 「スタッフブログ更新情報」チャンネルを新しく作成する
  • 「Add Incoming WebHooks integration」でWebhookの設定を追加する
  • Webhook URLをコピーしする

a-blog cms の設定

a-blog cms の管理画面で、webhookを追加し、必要な項目を入力していきます。

  • 名前は任意なものを指定する(例:Slack通知:エントリー公開用)
  • タイプは「エントリー」を選択
  • イベントは「エントリー公開」を選択
  • 先ほどコピーした Webhook URL をペーストする
  • リクエスト履歴にチェック(チェックすると、ログが残ります。基本的にはオンにする)
  • Slackとの連携では、ペイロードは必須なので、「ペイロードをカスタムする」にチェックする
  • SlackのIncoming Webhookのドキュメントを参考にテンプレートを指定する
    • \n で改行します
    • icon_emojiまたはicon_urlを指定します
  • 一度ペイロードのチェックを外しエントリーを公開し、一番新しいログのRequest Bodyを参考に変数を指定します(ペイロードのチェックを外した状態でログを表示すると、使用できる変数がわかります)
    • {{$contents->entry->title}}
    • {{$url}}

400になっているログのRequest Bodyでは、使用できる変数が表示される

最終的にはJSON形式でa-blog cmsに保存します。以下のようになります。

{
  "text": "ページを更新しました!\n「{{$contents->entry->title}}」\n{{$url}}",
  "username": "更新情報おまわりbot",
  "icon_emoji": ":dog:"
}

または

{
  "text": "ページを更新しました!\n「{{$contents->entry->title}}」\n{{$url}}",
  "username": "更新情報おまわりbot",
  "icon_url": "https://slack.com/img/icons/好きな画像のURL入れてください.png"
}

動作の確認

Webhookの設定をし、エントリーを公開した状態で作成すると、Slackに通知が来ます。

Slackの通知が来なかった場合は

来ていない場合は、a-blog cms の管理画面>Wehook>ログを表示し、ステータスコードが400になっていないか(400だとエラー、200だと成功)確認します。


400ステータスと200ステータス

もし400になっていて、ログ>Response Bodyの項目で missing_text_or_fallback_or_attachmentsと表示されていたら、ペイロードの書き方が悪いかもしれません。見直してみてください。


missing_text_or_fallback_or_attachmentsと表示されている様子

今回はエントリーの公開された記事を通知するようにしましたが、エントリーが削除した時も通知できるようになります。例えば、削除された記事の履歴を残すのにも使えそうですね。

それでは次はIFTTT経由でGoogle Driveに画像を保存する方法を紹介します。

カスタマイズ2:IFTTT経由で、CMSにフォーム送信した画像ファイルをGoogle Driveに保存する

先ほどはエントリーの更新でしたが、今度はフォームが送信された時に動作する仕組みを作ります。


Google Driveにペットのフォトコンテスト用のフォームを用意しました。

UTSUWAテーマで使用できるテンプレートです。ダウンロードしたら、themes/utsuwa/に設置してください。

管理画面>フォームの順にページを移動し、フォームIDを新規作成します。
フォームIDは以下のように設定します。設定ができたら、念のため、今の時点で画像が送信できるか確認しましょう。

基本設定



項目 入力内容
フォームID contestForm
フォーム名 フォトコンテスト

一般メール設定



項目 入力内容 テンプレート指定を無効
管理者宛 件名ファイル /contest/form/subject.txt
管理者宛 本文ファイル /contest/form/body.txt
管理者宛 本文HTMLファイル /contest/form/body.html
To
From info@example.com オン
Cc オン
Bcc オン
Reply-To オン

管理者宛メール設定



項目 入力内容 テンプレート指定を無効
管理者宛 件名ファイル /contest/form/adminsubject.txt
管理者宛 本文ファイル /contest/form/adminbody.txt
管理者宛 本文HTMLファイル /contest/form/adminbody.html
AdminTo info@example.com
AdminFrom info@example.com オン
AdminCc オン
AdminBcc オン
AdminReply-To オン
ファイル添付 「メールに添付する」をオン

今回はIFTTTを使います。(アカウント登録が必要になるので、アカウントを持っていない方はまずはアカウントの作成をお願いします)

「Create」ボタンをクリックして新しいAppletを作成します。

If Thisの設定

「If This」に「Webhooks」を指定します

  • 「Receive a web Request」を選択
  • 「Event Name」は任意でなんでも。ここでは「acms_trigger」とします

Then thatの設定

「Then that」に「Google Drive」を指定します

  • 「Upload file from URL」を選択
  • File URL は、フォームに追加した画像を指定したいです。ですが、a-blog cmsの変数をIFTTT側は知らないので、一旦「Add ingredient」ボタンをクリックし、Value1を選択して挿入します。
  • File nameは、日付と、ペットのなまえと飼い主の名前をつけたいので、OcurredAtに続き、「_」と「Add ingredient」からValue2とValue3を挿入します。
  • Drive folder pathは、ここで指定した階層にa-blog cmsのフォームから送信した画像が送られるようになります。今回はこのままでいいです。

If ThisとThen thatを設定したら

設定したら、Create actionをクリックします。

  • 「Continue」をクリック
  • 「Finish」をクリック

これで、連携の仕組みを保存できました。

Webhookのアイコンをクリックして、「Documentation」をクリックし、Webhook URLを取得します


Webhooksのアイコンをクリックする

Webhooksのページに移動したら、「Documentation」をクリックする


次に行うa-blog cmsの設定で必要なWebhook URLを取得する

Webhookの設定をする

a-blog cms に戻り、新しいWebhookを追加します

  • タイプは「フォーム」を選びます
  • イベントは「送信」にします
  • コピーしたWebhook URLをペーストします
    • eventには、「Event Name」に指定した文字列を入れます。「acms_trigger」と設定したので、記入します
  • 今回はAdd ingredientで変数を使っているので、ペイロードを使います。
    • ドキュメントのJSONの記述をコピペしし、テンプレートに貼ります。

ドキュメントのJSONの記述をa-blog cms のペイロードの記述で使います

  • Request Bodyを参考に変数を指定します
    • フォームで使用できる変数は、ペイロードをオフにしてフォームを送信し、ログを表示すると一覧で表示されます
    • URLは、外部からもアクセスできる必要があるので、グローバル変数を指定します。%{HTTP_ARCHIVES_DIR}{{$contents->field->pet_image@path}}
    • {{$contents->field->pet_name}}
    • {{$contents->field->name}

実際には、今回の場合は以下のようになります。

{
  "value1" : "%{HTTP_ARCHIVES_DIR}{{ $contents->field->pet_image_path }}",
  "value2" : "{{ $contents->field->pet_name }}",
  "value3" : "{{ $contents->field->name }}"
}

設定ができたら、フォトコンテストフォームを送信して、Google Driveに写真が入ってきているか確認します。 今回はDrive folder path を「IFTTT/MakerWebooks/{{EventName}}」に指定したので、もしなかった場合は新しくディレクトリが作られています。

以上で今回のカスタマイズは終了となります。


Google Driveに写真が入ってきている様子

もしエラーになっていたら、a-blog cms 管理画面の「ログ」か、IFTTTの作成したAppletのページで「View Activity」を見ると、Value1に正常な値が入っているか、urlに正常なURLが渡されているか確認することができます。


View activity をクリックした後の画面。どの変数にどんな値が入っているか確認できる。

最後に

これで講座は終了になります。
ぜひ a-blog cms と連携して、より便利なWebサイト運用を提供してください。

Ver.2.1.1から追加されたjs-incremental-searchと隠されていたomitUrlの変数の利用事例紹介


先日、a-blog cms 制作者向け情報サイトに、Tipsというコンテンツが追加されました。そのTipsのページで使用しているVer.2.1.1から追加された組み込みJS「js-incremental-search」と、隠されていたタグフィルターモジュールの「{omitUrl}」という変数についてご紹介します。

WordPressからのインポート

WordPressのエクスポートデータからa-blog cmsにインポートする事ができます。

記事のインポート

データ数が多い状況ではインポート処理におけるサーバーへの負荷が高くなります。そのため、作業時間・タイミングに注意しておこなってください。

仕様

  • WordPressの「投稿」のみのエクスポートデータを対象とする
  • 現在のブログ&ユーザーでインポートされる
  • WordPressの各投稿における、パスワード保護設定は無視する
  • インポート先カテゴリーを選択してインポートする
  • 記事のユニットをpタグで囲む、ウィジウィグ、マークダウン、自由記入から選択してインポート
  • カスタムフィールドもインポートされます
  • <!--more--> でユニットの分割をし、続きを読むにすることが出来ます
  • 記事内で最初に挿入されているimg要素に設定されている画像URLがカスタムフィールド 「wp_thumbnail_url」 に保存されます

インポート手順

  • WordPressで投稿データのエクスポートをします。(WordPress管理画面 > ツール > エクスポートで投稿を選択)
  • a-blog cmsのログイン後に、管理ページのインポートにアクセスします。(a-blog cms 管理画面 > WordPressインポート)
  • インポート先のブログを確認し、インポート先のカテゴリーを必要に応じて選択してください。
  • WordPressのエクスポートデータ(XML)を選択します。
  • インポートするユニットを選択します。(pタグ | ウィジウィグ | マークダウン| 自由記入)
  • [インポートを実行する]ボタンをクリックすると、インポートを実行します。

WordPress管理画面 > ツール > エクスポート

WordPress管理画面 > ツール > エクスポート


WordPressの記事インポートで投稿を選択

WordPressの記事インポートで投稿を選択


サムネイル画像URLのインポート

Ver. 3.1.0 から WordPressのアイキャッチ画像URLをカスタムフォールドにインポートすることが出来るようになりました。

注意点として、必ず投稿データのインポートを行った後、アイキャッチ画像URLのインポートを行うようにしてください。

仕様

  • 投稿データのインポート後に実行する
  • 「メディア」を選択したエクスポートデータを使用
  • 「wordpress.com」のエクスポートデータには対応していません
  • アイキャッチの画像URLがカスタムフィールド 「wp_thumbnail_url」 に設定されます

インポート手順

  • WordPressでメディアのエクスポートをします。(WordPress管理画面 > ツール > エクスポートでメディアを選択)
  • a-blog cmsのログイン後に、管理ページのインポートにアクセスします。(a-blog cms 管理画面 > WordPressインポート)
  • Wordpressのエクスポートデータ(XML)を選択します。
  • [インポートを実行する]ボタンをクリックすると、インポートを実行します。

WordPress管理画面 > ツール > エクスポートでメディアを選択

WordPress管理画面 > ツール > エクスポートでメディアを選択


WordPressのサムネイル画像URLインポート

WordPressのサムネイル画像URLインポート