function hook_search_execute

Execute a search for a set of key words.

Use database API with the 'Drupal\Core\Database\Query\PagerSelectExtender' query extension to perform your search.

If your module uses hook_update_index() and search_index() to index its items, use table 'search_index' aliased to 'i' as the main table in your query, with the 'Drupal\search\SearchQuery' extension. You can join to your module's table using the 'i.sid' field, which will contain the $sid values you provided to search_index(). Add the main keywords to the query by using method searchExpression(). The functions search_expression_extract() and search_expression_insert() may also be helpful for adding custom search parameters to the search expression.

See node_search_execute() for an example of a module that uses the search index, and user_search_execute() for an example that doesn't use the search index.

Parameters

$keys: The search keywords as entered by the user. Defaults to NULL.

$conditions: (optional) An array of additional conditions, such as filters. Defaults to NULL.

Return value

An array of search results. To use the default search result display, each item should have the following keys':

  • link: (required) The URL of the found item.
  • type: The type of item (such as the content type).
  • title: (required) The name of the item.
  • user: The author of the item.
  • date: A timestamp when the item was last modified.
  • extra: An array of optional extra information items.
  • snippet: An excerpt or preview to show with the result (can be generated with search_excerpt()).
  • language: Language code for the item (usually two characters).

Related topics

3 functions implement hook_search_execute()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

node_search_execute in drupal/core/modules/node/node.module
Implements hook_search_execute().
search_extra_type_search_execute in drupal/core/modules/search/tests/modules/search_extra_type/search_extra_type.module
Implements hook_search_execute().
user_search_execute in drupal/core/modules/user/user.module
Implements hook_search_execute().
1 invocation of hook_search_execute()
search_data in drupal/core/modules/search/search.module
Performs a search by calling hook_search_execute().

File

drupal/core/modules/search/search.api.php, line 173
Hooks provided by the Search module.

Code

function hook_search_execute($keys = NULL, $conditions = NULL) {

  // Build matching conditions
  $query = db_select('search_index', 'i', array(
    'target' => 'slave',
  ))
    ->extend('Drupal\\search\\SearchQuery')
    ->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender');
  $query
    ->join('node_field_data', 'n', 'n.nid = i.sid');
  $query
    ->condition('n.status', 1)
    ->addTag('node_access')
    ->searchExpression($keys, 'node');

  // Insert special keywords.
  $query
    ->setOption('type', 'n.type');
  $query
    ->setOption('langcode', 'n.langcode');
  if ($query
    ->setOption('term', 'ti.tid')) {
    $query
      ->join('taxonomy_index', 'ti', 'n.nid = ti.nid');
  }

  // Only continue if the first pass query matches.
  if (!$query
    ->executeFirstPass()) {
    return array();
  }

  // Add the ranking expressions.
  _node_rankings($query);

  // Load results.
  $find = $query
    ->fields('i', array(
    'langcode',
  ))
    ->limit(10)
    ->execute();
  $results = array();
  foreach ($find as $item) {

    // Render the node.
    $node = node_load($item->sid);
    $build = node_view($node, 'search_result', $item->langcode);
    unset($build['#theme']);
    $node->rendered = drupal_render($build);

    // Fetch comments for snippet.
    $node->rendered .= ' ' . module_invoke('comment', 'node_update_index', $node, $item->langcode);
    $extra = module_invoke_all('node_search_result', $node, $item->langcode);
    $language = language_load($item->langcode);
    $uri = $node
      ->uri();
    $results[] = array(
      'link' => url($uri['path'], array_merge($uri['options'], array(
        'absolute' => TRUE,
        'language' => $language,
      ))),
      'type' => check_plain(node_get_type_label($node)),
      'title' => $node
        ->label($item->langcode),
      'user' => theme('username', array(
        'account' => $node,
      )),
      'date' => $node->changed,
      'node' => $node,
      'extra' => $extra,
      'score' => $item->calculated_score,
      'snippet' => search_excerpt($keys, $node->rendered, $item->langcode),
      'langcode' => $node->langcode,
    );
  }
  return $results;
}