2016 年 5 月 4 日 329日前)
3,635文字 (読了時間9分)

SPONSORED LINK

こんにちは。最近破滅派にもSlackを導入しました。正確には前から導入してたんですけど、TravisやGithubからのボット投稿を延々と僕が眺めるだけだったのですが、それを編集部的に使っていこうということになったのですね。

さて、掲題の件なのですが、WordPressはCMSとして利用されているはずなので、共同編集の場合はいろんな通知があると助かります。具体例を上げるとこんな感じ。

  • 公開権限のない人が投稿を公開申請した(投稿者からpublish_postsの権限を剥奪しておいて、編集者がチェックの上で公開を行うなど)
  • Cron処理などでランキングを自動生成しており、そのランキングが作成された
  • ものすごく重要な情報(決済サービスのIDなど)が変更された

こういう場合、Slackに通知を送っておくと色々便利かもしれません。まあ、メールでもいいんですけどね。

WordPressとSlackを連携するプラグインはいくつかある(ズバリSlackもある)のですが、Slackへの投稿自体はそんなに難しくないので、やり方を紹介します。

ステップ1. WebhookのURLを取得

Incoming Webhooksのページに移動して、新たに作成します。チャンネルやアイコンの指定などを行えますが、これは上書きできるので、適当に。

「slack incoming webhook」でググればたどり着く
「slack incoming webhook」でググればたどり着く

必要なのはWebhook URLというヤツ。このURLにJSONをPOSTすると投稿されます。このURLが漏れてしまうと外部の人が好きなように投稿できてセキュリティ的にウザいことになりますが、その場合は再生成できます。

モザイクのかかってる部分が知られちゃダメな部分
モザイクのかかってる部分が知られちゃダメな部分

ステップ2. 関数を作成

JSONをPOSTするだけなので、こんな感じの関数を用意しておけばよいでしょう。

/**
 * Slackに投稿する
 *
 * @param string $content Slackに投稿する文字列
 * @param array $attachment 添付がある場合は、連想配列を渡す
 * @param string $channel 初期値は '#general'
 * @return bool
 */
function hametuha_slack( $content, $attachment = [], $channel = '#general' ) {
    // wp-config.phpとかに、上で取得したWebhook URLを定義しておく
    if ( ! defined( 'SLACK_ENDPOINT' ) ) {
        return false;
    }
    $payload = [
        'channel' => $channel,
    ];
    if ( WP_DEBUG ) {
        // デバッグモードならテストをつける
        $content = "【テスト投稿】 {$content}";
    }
    $payload['text'] = $content;
    // attachmentsについては
    // @see https://api.slack.com/docs/attachments

    if ( $attachment ) {
        $payload['attachments'] = [ $attachment ];
    }
    $ch = curl_init();
    curl_setopt_array( $ch, [
        CURLOPT_URL => SLACK_ENDPOINT,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => 'payload='.json_encode( $payload ),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_TIMEOUT => 5,
    ] );
    $result = curl_exec( $ch );
    curl_close( $ch );
    return false !== $result;
}

これでhametuha_slack( '通知があります' );と書くだけで通知が行えます。

ステップ3. 任意の場所で実行

あとは好きな場所で実行すればよいのですが、なにか具体例が必要ですね。今回は次のようなケースを想定します。

  • 毎日50件のコンテンツが投稿されるサイトである。
  • 特定の投稿タイプ special-column は広告記事であり、広告担当者はそれがきちんと公開されたかどうか知っておく必要がある。
  • よって、special-columnが公開された場合、広告関連チャンネル #ads にSlackが通知される。

これを実現するコードはこんな感じでしょうか。

/**
 * 投稿が公開されたときにSlack
 *
 * @param string $new_status
 * @param string $old_status
 * @param object $post
 */
add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) {
    //はじめて公開にしたときだけ。非公開はありえないとする。
    if ( 'special-column' === $post->post_type && 'publish' === $new_status ) {
        switch ( $old_status ) {
            case 'new':
            case 'draft':
            case 'pending':
            case 'auto-draft':
            case 'future':
                  $string = sprintf( '広告記事が公開されました: <%s|%s>', get_permalink( $post ), get_the_title( $post ) );
                  hametuha_slack( $string, [], '#ad' );
                  break;
        }
    }
}, 10, 3 );

ちなみに、破滅派では以下のケースで通知を行っています。

  • 電子書籍の販売申請があった
  • 電子書籍が販売開始された
電子書籍販売通知。ボーダーの色が変でしたね。
電子書籍販売通知。ボーダーの色が変でしたね。

公開される情報だったら、たとえばTwitterの投稿に特定の文字列が入っている場合だけIFTTTとかZapier使ってSlack連携できるので、そっちの方が手っ取り早いかもしれません。

プラグインを利用してもいいのですが、プラグインに該当する機能がない場合やサーバが複数台構成の場合は自分でできるとなにかとはかどります。関数自体も20行程度とシンプルですし、使わなくなったら中身空っぽにしておけばよいので、便利なのではないでしょうか。なにより手作りなので、心がこもっています(真顔)

ちなみに破滅派の運営に興味がある人はこちらを読んでみてください。終わり。

WEB+DB PRESS Vol.91

WEB+DB PRESS Vol.91 [書籍]

著者丸山 晋平, 清水 雅人, 舘野 祐一, 小野 将之, 佐藤 歩, 泉水 翔吾, 伊藤 直也, 佐藤 太一, 海野 弘成, 福本 貴之, うさみ けんた, 西尾 泰和, 中島 聡, はまちや2, 竹原

クリエーターWEB+DB PRESS編集部

出版社技術評論社

出版日2016 年 2 月 24 日

商品カテゴリー大型本

ページ数160

ISBN4774178993

SlackはIoTとかとも相性よさそうですね。

Supported by amazon Product Advertising API

 

フォローしてください

ここで会ったのもなにかの縁。
高橋文樹.comの最新情報を見逃さないためにもフォローをお願いします。
めったに送らないメルマガもあります。

SPONSORED LINK

この記事について

この記事はが2016 年 5 月 4 日にプログラミングの記事として公開しました。

高橋先生の電子書籍

高橋先生の電子書籍

Amazonで電子書籍も買えます。

好きな言葉

神だって人間を創るとき、新たな創作ができなかったのか敢えてそうしなかったのかは知らぬが、いずれにせよ自分の姿に似せて創った。だからこそ、同時代の作家から一場面をそっくり盗み出していることがあるとアホな批評家に非難されたとき、シェイクスピアはこんな言葉を口にできたのである。「私はうら若い娘さんをお下劣な連中とのつきあいから救い出して上品な社会に入れてやったのです!」同様の批判を受けたとき、これも同じ理由からモリエールはもっと素朴にこう答えている。「俺は見つけたらすぐ自分の財産にする」シェイクスピアもモリエールも正しい。才能あるものは盗まず、奪い取るからである。

— アレクサンドル・デュマ

高橋先生の処女作

『途中下車』高橋文樹

2001年幻冬舎NET学生文学大賞受賞作です。

Web制作やります

Web制作やります

Web制作のご依頼は株式会社破滅派へ

不定期メルマガ

高橋文樹.comでは、不定期でニュースレターを配信しています。滅多に送らないので是非購読してください。

高橋文樹.comではプライバシーポリシーに準じて登録情報を取り扱います。