function faq_update_7002 in Frequently Asked Questions 7
Convert old-style detailed questions to new fields.
File
- ./faq.install, line 315 
- FAQ module install file.
Code
function faq_update_7002(&$sandbox) {
  // Number of nodes to update each pass.
  define('BATCH_SIZE_7002', '5');
  // Do this the first time.
  if (!isset($sandbox['progress'])) {
    // Initialize sandbox structure for multi-pass update.
    $sandbox['progress'] = 0;
    $sandbox['current_idx'] = 0;
    // Get faq nodes and run the query as user 1.
    $query = new EntityFieldQuery();
    $query
      ->entityCondition('entity_type', 'node')
      ->entityCondition('bundle', 'faq')
      ->addMetaData('account', user_load(1));
    $result = $query
      ->execute();
    if (isset($result['node'])) {
      $sandbox['faq_items_nids'] = array_keys($result['node']);
      $sandbox['max'] = count($sandbox['faq_items_nids']);
    }
    else {
      $sandbox['faq_items_nids'] = array();
      $sandbox['max'] = 0;
    }
    // Add the detailed question field.
    _faq_add_custom_fields();
    // Adjust the weight of the field so that it is above the answer (body).
    _faq_shift_fields_down();
  }
  $count = 0;
  // Convert old-style detailed questions to new full field.
  while (($nid = $sandbox['faq_items_nids'][$sandbox['current_idx']]) && $count < BATCH_SIZE_7002) {
    // Load the full node to be updated.
    $node = node_load($nid);
    // Load the detailed question.
    $dq = isset($node->detailed_question) ? $node->detailed_question : '';
    if ($dq == '') {
      $select = db_select('faq_questions', 'f');
      $dq = $select
        ->condition('f.nid', $node->nid)
        ->fields('f', array(
        'detailed_question',
      ))
        ->execute()
        ->fetchField();
    }
    // Get the default text filter format from DB as this might be integer if upgraded site or tekststring if new D7 site.
    // Default filter format: Filtered HTML.
    $filter_formats = filter_formats();
    $filter_formats_keys = array_keys($filter_formats);
    $filter_format = reset($filter_formats_keys);
    // Get the language(s) from the body, making sure we have the same set for detailed question too.
    $langs = array_keys($node->body);
    // Add proper taxonomy fields.
    $txonselect = db_select('taxonomy_index', 't');
    $taxres = $txonselect
      ->fields('t', array(
      'tid',
    ))
      ->condition('t.nid', $node->nid)
      ->execute();
    foreach ($taxres as $taxon) {
      $term = taxonomy_term_load($taxon->tid);
      $vocab = taxonomy_vocabulary_load($term->vid);
      foreach ($langs as $language) {
        // Find out if there is a field added with the vocabulary of this term.
        if (isset($node->{$vocab->module . "_" . $vocab->machine_name})) {
          $node->{$vocab->module . "_" . $vocab->machine_name}[$language][$term->tid] = (array) $term;
        }
      }
    }
    // Add detailed question field for all languages.
    foreach ($langs as $language) {
      $node->field_detailed_question[$language][0]['value'] = $dq;
      $node->field_detailed_question[$language][0]['format'] = $filter_format;
      $node->field_detailed_question[$language][0]['safe_value'] = check_markup($dq, $filter_format, $language);
    }
    // Save resulting node.
    node_save($node);
    // Should not be more than BATCH_SIZE_7002.
    $count++;
    // Progress counter.
    $sandbox['progress']++;
    // Node array index pointer.
    $sandbox['current_idx']++;
  }
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
  return t('Custom field added, @count questions converted into fields.', array(
    '@count' => $sandbox['max'] + 1,
  ));
}