Drupal 7 で特定のモジュールの cron 処理が他のモジュールのものよりも後に実行されるようにする方法

Drupal でモジュールの cron 処理の順序を指定する方法について。

Drupal のモジュールの hook の実行順序はデフォルトではアルファベット順ですが、 weight を変更することで任意の順序で処理を実行する事が可能です。

次のコードでは、 mymodule というモジュールの処理を another_module という名前のモジュールよりも後に実行することを保証するための処理です。 次回の cron 実行からこの順序が反映される形になります。

<?php

/**
 * Implements hook_cron().
 * 
 * $module_to_process の重みが知らないところで変えられた万が一の場合に対応するために
 * cron 内で毎回実行します。
 */
function mymodule_cron() {
  // mymodule_cron() が another_module の cron 処理よりも後に実行されるようモジュールの重みを変更する
  _mymodule_set_module_weight_heavier('mymodule', 'another_module');
}

/**
 * 特定のモジュールの重みを変えて実行順序を設定する
 *
 * @param string $module
 * @param string $module_to_preprocess
 */
function _mymodule_set_module_weight_heavier($module, $module_to_preprocess) {
  $weight = db_select('system', 's')
    ->fields('s', array('weight'))
    ->condition('name', $module_to_preprocess, '=')
    ->execute()
    ->fetchField();

  db_update('system')
    ->fields(array('weight' => $weight + 1))
    ->condition('name', $module, '=')
    ->execute();
}