Drupal で node type 毎に twitter へのつぶやき書式を変える方法

Drupal で Twitter モジュールと Twitter actions モジュールをインストールすると、コンテンツ投稿時に Twitter にメッセージを投稿してくれる。これ多分、使いようによっては便利で、知り合いの Webディレクターもやっている(ちなみに彼は Drupal じゃなくて、どこかのブログサービス)。

Twitter にはどんな感じでつぶやかれるかというと、

New post: タイトル <短いURL>

みたいな感じ。

で、ブログの投稿だけ twitter につぶやくような簡単な使い方なら特に問題もないと思うんだけど、うちの場合はお知らせ投稿時にもつぶやきたい。そうなると、お客さんの為にはブログとお知らせの書式を分けた方が分かりやすい。

ブログ投稿: タイトル <短いURL>

とか

お知らせ: タイトル <短いURL>

とか

[新規Q&A] タイトル <短いURL>

とか。

ということで、コンテンツタイプ(node 種別)毎に書式を設定しようとしたんだけど

設定方法が見つからない。

デフォルトの書式は、全コンテンツタイプ共通。

管理画面の twitter つぶやき書式設定画面

それ以外に変える方法はコンテンツの作成画面。つまり、各ノード毎にしか変えることは出来ない。

コンテンツの作成画面での twitter つぶやき書式設定画面

ということでプログラムを修正する必要が出てきた。 Twitter モジュールの修正?いやいや、そんな事したら他の Drupal ユーザに笑われるよ。

Drupal には各処理毎に hook関数を呼び出す仕組みが埋め込まれてあり、hook 関数を定義してやる事で、元のモジュールを拡張出来るようになっている。

今回の場合は、コンテンツ作成フォームを生成する処理の hook関数である、hook_form_alter() を定義してやれば良い(hook_form_alter()は全てのフォーム生成時の hook関数であり、コンテンツ作成フォームだけとは限りません)。

コンテンツ作成フォームを生成する際に、作成しようとするコンテンツタイプに応じて、twitterへのつぶやきフォーマットを切り替えるようにするモジュールのサンプルを以下に示す。

モジュール名は、twitter_format_by_node_type みたいな感じだとちょっと長いので、twitter_fbnt にしてみた(モジュールの作り方は今回は省略。該当部分だけ)。なので、ファイル名は twitter_fbnt.moduleになる。

<?php
function twitter_fbnt_form_alter(&$form, &$form_state, $form_id) {
  if (isset(
$form['#node'])
      &&
$form['#node']->type . '_node_form' == $form_id) {
    if (!
$form['twitter']) {
      return;
    }
    if (
$form['#node']->type == "news") {
     
$form['twitter']['status']['#default_value'] = 'お知らせ: !title !tinyurl';
    } elseif (
$form['#node']->type == "blog") {
     
$form['twitter']['status']['#default_value'] = 'ブログ投稿: !title !tinyurl';
    } else {
      
// Twitter モジュールで設定したデフォルトフォーマット
   
}
  }
}
?>

Twitter モジュールを直接修正するのに比べると若干面倒くさいプログラムになってしまった。しかし、Twitter モジュールがバージョンアップする度に、そのプログラムを修正することを考えると 少しはまし なんじゃないだろうか。

うちのサイトでは、お問い合わせフォームも同じように hook_form_alter()関数を使って拡張している。だって、Webform モジュールって大きすぎて使いにくいやん?Viewsも同じ理由で使ってない。

ちょっと脱線してしまったが、こんな感じでコンテンツタイプ毎につぶやくメッセージのフォーマットが切り替えられる。

あと、twitter モジュールは weight3 になっているので、同じ 3 とか、ちょっと大きい 4 に設定しておく必要がある(weight が同じ場合、アルファベット順にモジュールが呼び出されるので)。じゃないと twitter モジュールが呼び出される前に自作モジュールが呼び出されてしまって、せっかくの hook 関数が意味をなさない。SQLを直接たたけるのなら、以下の文を実行すれば良い。本当は moduleのインストール時に設定するんだけどね。

mysql> update system set weight = 4 where type = 'module' and name = 'twitter_fbnt';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • HTMLタグは使用できません
  • 行と段落は自動的に折り返されます。

書式オプションに関するより詳しい情報...