Custom Search API index condition in Drupal 7

Last updated on 02/10/2016
/**
 * Implements hook_search_api_alter_callback_info().
 * See includes/callback_search_api_people_archive.inc for scope.
 */
function HOOK_search_api_alter_callback_info() {
  $callbacks['people_archive_alter'] = array(
    'name' => t('People archive'),
    'description' => t('People archive.'),
    'class' => 'SearchApiPeopleArchiveAlter',
    'weight' => 100,
  );
  return $callbacks;
}

And the class itself:

/**
 * Search API People archive data alteration callback that will index only
 * node Title if People node is archived.
 */
class SearchApiPeopleArchiveAlter extends SearchApiAbstractAlterCallback {
 
  public function supportsIndex(SearchApiIndex $index) {
    return $index->getEntityType() === 'node';
  }
 
  public function alterItems(array &$items) {
    if (!$items)
      return;
 
    foreach ($items as &$item) {
 
      $archive_people_field = field_get_items('node', $item, 'field_archive');
 
      // For archived People we need to index only Node title.
      if (isset($archive_people_field[0]['value']) && $archive_people_field[0]['value']) {
        $item = $this->peopleArchiveUnsetFields($item);
      }
    }
  }
 
  private function peopleArchiveUnsetFields(&$item) {
    // Unneeded fields,
    // tip: $this->index->getFields()
    $excludeIndexFields = array(     
      'body',     
    );
 
    foreach ($item as $field_name => $field_data) {
      if (in_array($field_name, $excludeIndexFields) && is_array($field_data)) {
        $item->{$field_name} = array();
      }
    }
 
    return $item;
  }
 
}