プラグイン

HameSlack

SlackとWordPressを統合するためのパーフェクトなヘルパープラグインです。WordPressからSlackに通知を送ったり、Slackから投稿を作成したり、あなた次第でなんでもできます。

コアコンセプト

デフォルトだとこのプラグインは何もしません。ほんとです。Slackはたくさんのインテグレーション用APIを持っていますが、HameSlackはそのうち3つだけを使います。

上の方にあるものがより簡単なものです。このプラグインはSlackとWordPressの接続を手助けしてくれるので、あなたはSlackでなにをするかだけに集中できます。

設定

必要なものはすべて管理画面で設定できます。設定 > HameSlack 設定 へ行き、認証情報を保存してください。

使い方

一番簡単なのは、Slackに投稿することです。このためのシンプルな方法があります。

<?php do_action( 'hameslack', $content, $attachments, $channel ) ?>

なぜdo_actionなのでしょう? というのは、WordPres環境において、プラグインを停止するとPHP関数が存在しないため、Fatal Errorを引き起こします。 do_action はプラグインが突然停止しても何一つ影響を与えません。$attachments は連想配列の配列で、画像やタイトル、色などを設定できます。詳しくはSlack ドキュメンテーション をごらんください。

よし、それではいつこれを実行すべきでしょうか?

ケース 1: レビューの要求

あなたはWordPressでニュースメディアを管理していると仮定しましょう。何人かの編集者とたくさんのライターがいます。あなたのワークフローでは、新米ライターはまだ信頼がおけないので、レビューなしに記事を公開することはできません。ニュースサイトにはよくあることです。新米ライターは記事を書き終えると、投稿ステータスを 「承認待ち」に変更します。これで編集者が管理画面に行き、投稿ステータスを「公開済み」に変更します。

このワークフローは編集者のレビューで止まってしまうことがあります。したがってSlackに通知を送るのはよいアイデアでしょう。Incoming Webhooks がこれを可能にしてくれます。

<?php
// 投稿ステータスが変更したら通知を送る
add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) {
  if ( 'post' !== $post->post_type ) {
    // 投稿でなければ無視
    return;
  }
  if ( ( 'pending' === $new_status ) && ( 'pending' !== $old_status ) ) {
    // 投稿が新たに「承認待ち」になったら
    $edit_link = admin_url(  "post.php?post={$post->ID}&action=edit" );
    $title = get_the_title( $post );
    $content = "@channel  new post is waiting review: {$title} {$edit_link}";
    do_action( 'hameslack',  $content ) );
  }
}, 10, 3 );

ケース 2: Slackから下書きを作る

もしあなたがSlackをコミュニケーションツールとして、WordPressをパブリッシングプラットフォームとして利用している場合、おそらくSlackでより長い時間を過ごしていることでしょう。しかし、Slack上における会話は「フロー」であり、時間が経つと見つけるのが困難になります。もし誰かがよいアイデアを投稿したら、それを下書きとして保存しましょう。

Outgoing Webhooks がこれを可能にします。

<?php

// このフィルターはoutgoing webhookによって起動します。
add_filter( 'hameslack_rest_response', function ( $response, $request, $post ) {
    // 投稿スラッグによって、どのエンドポイントがヒットしたのか識別します。
    switch ( $post->post_name ) {
        case 'save-draft':
                // テキストを分割し、1行目をタイトルにします。
                $lines = explode( "", $request['text'] );
                $title  = array_shift( $lines );
                $content = implode( "n", $lines );
                $post_id = wp_insert_post( [
                    'post_title' => $title,
                    'post_content' => $content,
                    'post_status' => 'draft',
                    'post_type' => 'post',
                ] );
                // レスポンスを作成。これはボットとして投稿します。
                $edit_link = admin_url( "post.php?post={$post_id}&action=edit" );
                $response['text'] = "新しい下書きが作成されました: {$edit_link}";
                break;
    }
    return $response;
} );

定期的な通知があるなら、このワークフローはもっとよくなるでしょう(例・「あなたが下書きxxxを作成してから7日が経過しました。どうしますか?」)

ケース 3: 特定のキーワードを持つチャットを週次で保存する

あなたが音楽レビューサイトを運営していて、ツイートの週間まとめを作っていると仮定しましょう。あなたはネガティブなツイートをそこに含めたくないので、あなたのチームメンバーは”GT”というキーワードをつけてtwitterのURLをSlackに投稿するようにしています。そのため、あなたは「よいツイート」のリストを「GT」で探すことによって取得できるわけです。

ユーザーやメッセージ、チャットのリストを取得するには Bot がうまく働いてくれます。HameSlackはボットと統合できます。Slackでボットを登録し、APIトークンをWordPressの管理画面で入力してください。それで終わりです。

ボットはSlackのAPIを簡単に操作できます。このケースでは channels.histroy エンドポイントが必要です。このAPIにおけるchannelパラメーターはチャンネルID(例 CX92810)を意味し、チャンネル名(例 general)ではないことに注意してください。心配いりません、HameSlackはそのためのショートカットを用意しています。以下のコードをごらんください。

<?php

// 週次のCronを登録する
add_action( 'init', function () {
  if ( ! wp_next_scheduled( 'weekly_tweet_summary' ) ) {
    wp_schedule_event( current_time( 'timestamp', true ), 'weekly', 'weekly_tweet_summary' );
  }
} );

// Cronで行うアクションを登録
add_action( 'weekly_tweet_summary', function () {
  // APIを取得。
  $latest   = current_time( 'timestamp', true );
  $oldest   = $latest - 60 * 60 * 24 * 7;
  $messages = hameslack_channel_history( 'general', $latest, $oldest, [
    'count' => 100,
  ] );
  if ( is_wp_error( $messages ) ) {
    // 失敗。
    return;
  }
  // コンテンツを作成する
  $content = implode( "\n\n", array_filter( array_map( function ( $message ) {
    // $message is an object.
    $text = trim( $message->text );
    if ( 0 !== strpos( $text, 'GT' ) ) {
      return false;
    }
    $text = trim( str_replace( 'GT', '', $text ) );
    if ( 0 === strpos( $text, 'https://twitter.com' ) ) {
      return $text;
    } else {
      return false;
    }
  }, $messages ) ) );
  // コンテンツができているかチェック
  if ( ! $content ) {
    return;
  }
  // 投稿して通知を出す
  $post_id   = wp_insert_post( [
    'post_title'   => sprintf( 'Twitterログ: %s', date_i18n( 'Y-m-d', $now ) ),
    'post_content' => $content,
    'post_type'    => 'post',
    'post_status'  => 'draft',
  ] );
  $edit_link = admin_url( "post.php?post={$post_id}&action=edit" );
  hameslack_post( "twitterのログを作成しました: {$edit_link}" );
} );

ちょっと長いですか? でも、カスタマイズするといろんなことができますよ。

必要環境

PHP 5.4以上。

ダウンロード

このプラグインはオープンソースで、プルリクエストも受け付け中です!