You are here

search_api.api.php in Search API 8

Same filename and directory in other branches
  1. 7 search_api.api.php

Hooks provided by the Search API module.

File

search_api.api.php
View source
<?php

/**
 * @file
 * Hooks provided by the Search API module.
 */

/**
 * @addtogroup hooks
 * @{
 */

/**
 * Alter the available Search API backends.
 *
 * Modules may implement this hook to alter the information that defines Search
 * API backends. All properties that are available in
 * \Drupal\search_api\Annotation\SearchApiBackend can be altered here, with the
 * addition of the "class" and "provider" keys.
 *
 * @param array $backend_info
 *   The Search API backend info array, keyed by backend ID.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_backends" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Backend\BackendPluginBase
 */
function hook_search_api_backend_info_alter(array &$backend_info) {
  foreach ($backend_info as $id => $info) {
    $backend_info[$id]['class'] = '\\Drupal\\my_module\\MyBackendDecorator';
    $backend_info[$id]['example_original_class'] = $info['class'];
  }
}

/**
 * Alter the features a given search server supports.
 *
 * @param string[] $features
 *   The features supported by the server's backend.
 * @param \Drupal\search_api\ServerInterface $server
 *   The search server in question.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.determining_server_features" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Backend\BackendSpecificInterface::getSupportedFeatures()
 */
function hook_search_api_server_features_alter(array &$features, \Drupal\search_api\ServerInterface $server) {
  if ($server
    ->getBackend() instanceof \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend) {
    $features[] = 'my_custom_feature';
  }
}

/**
 * Alter the available datasources.
 *
 * Modules may implement this hook to alter the information that defines
 * datasources. All properties that are available in
 * \Drupal\search_api\Annotation\SearchApiDatasource can be altered here, with
 * the addition of the "class" and "provider" keys.
 *
 * @param array $infos
 *   The datasource info array, keyed by datasource IDs.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_data_sources" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Datasource\DatasourcePluginBase
 */
function hook_search_api_datasource_info_alter(array &$infos) {

  // I'm a traditionalist, I want them called "nodes"!
  $infos['entity:node']['label'] = t('Node');
}

/**
 * Alter the available processors.
 *
 * Modules may implement this hook to alter the information that defines
 * processors. All properties that are available in
 * \Drupal\search_api\Annotation\SearchApiProcessor can be altered here, with
 * the addition of the "class" and "provider" keys.
 *
 * @param array $processors
 *   The processor information to be altered, keyed by processor IDs.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_processors" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Processor\ProcessorPluginBase
 */
function hook_search_api_processor_info_alter(array &$processors) {
  if (!empty($processors['example_processor'])) {
    $processors['example_processor']['class'] = '\\Drupal\\my_module\\MuchBetterExampleProcessor';
  }
}

/**
 * Alter the available data types.
 *
 * @param array $data_type_definitions
 *   The definitions of the parse mode plugins.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_data_types" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\DataType\DataTypePluginBase
 */
function hook_search_api_data_type_info_alter(array &$data_type_definitions) {
  if (isset($data_type_definitions['text'])) {
    $data_type_definitions['text']['label'] = t('Parsed text');
  }
}

/**
 * Alter the available parse modes.
 *
 * @param array $parse_mode_definitions
 *   The definitions of the parse mode plugins.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_parse_modes" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\ParseMode\ParseModePluginBase
 */
function hook_search_api_parse_mode_info_alter(array &$parse_mode_definitions) {
  if (isset($parse_mode_definitions['direct'])) {
    $parse_mode_definitions['direct']['label'] = t('Solr syntax');
  }
}

/**
 * Alter the tracker info.
 *
 * @param array $tracker_info
 *   The Search API tracker info array, keyed by tracker ID.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_trackers" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Tracker\TrackerPluginBase
 */
function hook_search_api_tracker_info_alter(array &$tracker_info) {
  if (isset($tracker_info['default'])) {
    $tracker_info['default']['example_original_class'] = $tracker_info['default']['class'];
    $tracker_info['default']['class'] = '\\Drupal\\my_module\\Plugin\\search_api\\tracker\\MyCustomImplementationTracker';
  }
}

/**
 * Alter the list of known search displays.
 *
 * @param array $displays
 *   The Search API display info array, keyed by display ID.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.gathering_displays" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Display\DisplayPluginBase
 */
function hook_search_api_displays_alter(array &$displays) {
  if (isset($displays['some_key'])) {
    $displays['some_key']['label'] = t('New label for existing Display');
  }
}

/**
 * Alter the mapping of Drupal data types to Search API data types.
 *
 * @param array $mapping
 *   An array mapping all known (and supported) Drupal data types to their
 *   corresponding Search API data types. A value of FALSE means that fields of
 *   that type should be ignored by the Search API.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.mapping_field_types" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 * @see \Drupal\search_api\Utility\DataTypeHelperInterface::getFieldTypeMapping()
 */
function hook_search_api_field_type_mapping_alter(array &$mapping) {
  $mapping['duration_iso8601'] = FALSE;
  $mapping['my_new_type'] = 'string';
}

/**
 * Alter the mapping of Search API data types to their default Views handlers.
 *
 * Field handlers are not determined by these simplified (Search API) types, but
 * by their actual property data types. For altering that mapping, see
 * hook_search_api_views_field_handler_mapping_alter().
 *
 * @param array $mapping
 *   An associative array with data types as the keys and Views table data
 *   definition items as the values. In addition to all normally defined Search
 *   API data types, keys can also be "options" for any field with an options
 *   list, "entity" for general entity-typed fields or "entity:ENTITY_TYPE"
 *   (with "ENTITY_TYPE" being the machine name of an entity type) for entities
 *   of that type.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.mapping_views_handlers" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_views_handler_mapping_alter(array &$mapping) {
  $mapping['entity:my_entity_type'] = [
    'argument' => [
      'id' => 'my_entity_type',
    ],
    'filter' => [
      'id' => 'my_entity_type',
    ],
    'sort' => [
      'id' => 'my_entity_type',
    ],
  ];
  $mapping['date']['filter']['id'] = 'my_date_filter';
}

/**
 * Alter the mapping of property types to their default Views field handlers.
 *
 * This is used in the Search API Views integration to create Search
 * API-specific field handlers for all properties of datasources and some entity
 * types.
 *
 * In addition to the definition returned here, for Field API fields, the
 * "field_name" will be set to the field's machine name.
 *
 * @param array $mapping
 *   An associative array with property data types as the keys and Views field
 *   handler definitions as the values (that is, just the inner "field" portion
 *   of Views data definition items). In some cases the value might also be NULL
 *   instead, to indicate that properties of this type shouldn't have field
 *   handlers. The data types in the keys might also contain asterisks (*) as
 *   wildcard characters. Data types with wildcards will be matched only if no
 *   specific type exists, and longer type patterns will be tried before shorter
 *   ones. The "*" mapping therefore is the default if no other match could be
 *   found.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.mapping_views_field_handlers" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_views_field_handler_mapping_alter(array &$mapping) {
  $mapping['field_item:string_long'] = [
    'id' => 'example_field',
  ];
  $mapping['example_property_type'] = [
    'id' => 'example_field',
    'some_option' => 'foo',
  ];
}

/**
 * Allows you to log or alter the items that are indexed.
 *
 * Please be aware that generally preventing the indexing of certain items is
 * deprecated. This is better done with processors, which can easily be
 * configured and only added to indexes where this behaviour is wanted.
 * If your module will use this hook to reject certain items from indexing,
 * please document this clearly to avoid confusion.
 *
 * @param \Drupal\search_api\IndexInterface $index
 *   The search index on which items will be indexed.
 * @param \Drupal\search_api\Item\ItemInterface[] $items
 *   The items that will be indexed.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.indexing_items" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_index_items_alter(\Drupal\search_api\IndexInterface $index, array &$items) {
  foreach ($items as $item_id => $item) {
    list(, $raw_id) = \Drupal\search_api\Utility\Utility::splitCombinedId($item
      ->getId());
    if ($raw_id % 5 == 0) {
      unset($items[$item_id]);
    }
  }
  $arguments = [
    '%index' => $index
      ->label(),
    '@ids' => implode(', ', array_keys($items)),
  ];
  $message = t('Indexing items on index %index with the following IDs: @ids', $arguments);
  \Drupal::messenger()
    ->addStatus($message);
}

/**
 * React after items were indexed.
 *
 * @param \Drupal\search_api\IndexInterface $index
 *   The used index.
 * @param array $item_ids
 *   An array containing the successfully indexed items' IDs.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.items_indexed" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_items_indexed(\Drupal\search_api\IndexInterface $index, array $item_ids) {
  if ($index
    ->isValidDatasource('entity:node')) {

    // Note that this is just an example, and would only work if there are only
    // nodes indexed in that index (and even then the printed IDs would probably
    // not be as expected).
    $message = t('Nodes indexed: @ids.', implode(', ', $item_ids));
    \Drupal::messenger()
      ->addStatus($message);
  }
}

/**
 * Alter a search query before it gets executed.
 *
 * The hook is invoked after all enabled processors have preprocessed the query.
 *
 * @param \Drupal\search_api\Query\QueryInterface $query
 *   The query that will be executed.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.query_pre_execute" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_query_alter(\Drupal\search_api\Query\QueryInterface $query) {

  // Do not run for queries with a certain tag.
  if ($query
    ->hasTag('example_tag')) {
    return;
  }

  // Otherwise, exclude the node with ID 10 from the search results.
  $fields = $query
    ->getIndex()
    ->getFields();
  foreach ($query
    ->getIndex()
    ->getDatasources() as $datasource_id => $datasource) {
    if ($datasource
      ->getEntityTypeId() == 'node') {
      if (isset($fields['nid'])) {
        $query
          ->addCondition('nid', 10, '<>');
      }
    }
  }
}

/**
 * Alter a search query with a specific tag before it gets executed.
 *
 * The hook is invoked after all enabled processors have preprocessed the query.
 *
 * @param \Drupal\search_api\Query\QueryInterface $query
 *   The query that will be executed.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.query_pre_execute.TAG" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_query_TAG_alter(\Drupal\search_api\Query\QueryInterface $query) {

  // Exclude the node with ID 10 from the search results.
  $fields = $query
    ->getIndex()
    ->getFields();
  foreach ($query
    ->getIndex()
    ->getDatasources() as $datasource_id => $datasource) {
    if ($datasource
      ->getEntityTypeId() == 'node') {
      if (isset($fields['nid'])) {
        $query
          ->addCondition('nid', 10, '<>');
      }
    }
  }
}

/**
 * Alter a search query's result set.
 *
 * The hook is invoked after all enabled processors have postprocessed the
 * results.
 *
 * @param \Drupal\search_api\Query\ResultSetInterface $results
 *   The search results to alter.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.processing_results" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_results_alter(\Drupal\search_api\Query\ResultSetInterface &$results) {
  $results
    ->setExtraData('example_hook_invoked', microtime(TRUE));
}

/**
 * Alter the result set of a search query with a specific tag.
 *
 * The hook is invoked after all enabled processors have postprocessed the
 * results.
 *
 * @param \Drupal\search_api\Query\ResultSetInterface $results
 *   The search results to alter.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.processing_results.TAG" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_results_TAG_alter(\Drupal\search_api\Query\ResultSetInterface &$results) {
  $results
    ->setExtraData('example_hook_invoked', microtime(TRUE));
}

/**
 * React when a search index was scheduled for reindexing.
 *
 * @param \Drupal\search_api\IndexInterface $index
 *   The index scheduled for reindexing.
 * @param bool $clear
 *   Boolean indicating whether the index was also cleared.
 *
 * @deprecated in search_api:8.x-1.14 and is removed from search_api:2.0.0.
 *   Please use the "search_api.reindex_scheduled" event instead.
 *
 * @see https://www.drupal.org/node/3059866
 */
function hook_search_api_index_reindex(\Drupal\search_api\IndexInterface $index, $clear = FALSE) {
  \Drupal\Core\Database\Database::getConnection()
    ->insert('example_search_index_reindexed')
    ->fields([
    'index' => $index
      ->id(),
    'clear' => $clear,
    'update_time' => \Drupal::time()
      ->getRequestTime(),
  ])
    ->execute();
}

/**
 * @} End of "addtogroup hooks".
 */

Functions

Namesort descending Description
hook_search_api_backend_info_alter Deprecated Alter the available Search API backends.
hook_search_api_datasource_info_alter Deprecated Alter the available datasources.
hook_search_api_data_type_info_alter Deprecated Alter the available data types.
hook_search_api_displays_alter Deprecated Alter the list of known search displays.
hook_search_api_field_type_mapping_alter Deprecated Alter the mapping of Drupal data types to Search API data types.
hook_search_api_index_items_alter Deprecated Allows you to log or alter the items that are indexed.
hook_search_api_index_reindex Deprecated React when a search index was scheduled for reindexing.
hook_search_api_items_indexed Deprecated React after items were indexed.
hook_search_api_parse_mode_info_alter Deprecated Alter the available parse modes.
hook_search_api_processor_info_alter Deprecated Alter the available processors.
hook_search_api_query_alter Deprecated Alter a search query before it gets executed.
hook_search_api_query_TAG_alter Deprecated Alter a search query with a specific tag before it gets executed.
hook_search_api_results_alter Deprecated Alter a search query's result set.
hook_search_api_results_TAG_alter Deprecated Alter the result set of a search query with a specific tag.
hook_search_api_server_features_alter Deprecated Alter the features a given search server supports.
hook_search_api_tracker_info_alter Deprecated Alter the tracker info.
hook_search_api_views_field_handler_mapping_alter Deprecated Alter the mapping of property types to their default Views field handlers.
hook_search_api_views_handler_mapping_alter Deprecated Alter the mapping of Search API data types to their default Views handlers.