HameSlack
SlackとWordPressを統合するためのパーフェクトなヘルパープラグインです。WordPressからSlackに通知を送ったり、Slackから投稿を作成したり、あなた次第でなんでもできます。
コアコンセプト
デフォルトだとこのプラグインは何もしません。ほんとです。Slackはたくさんのインテグレーション用APIを持っていますが、HameSlackはそのうち3つだけを使います。
- Incoming Webhook をSlackへの投稿に使います。
- Outgoing Webhook をSlackからのリクエスト取得につかいます。
- Custom Bot をSlackとやりとりするときに使います。
上の方にあるものがより簡単なものです。このプラグインは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以上。