4.6.x core.php hook_search($op = 'search', $keys = null)
4.7.x core.php hook_search($op = 'search', $keys = null)
5.x core.php hook_search($op = 'search', $keys = null)
6.x core.php hook_search($op = 'search', $keys = NULL)

Define a custom search routine.

This hook allows a module to perform searches on content it defines (custom node types, users, or comments, for example) when a site search is performed.

Note that you can use form API to extend the search. You will need to use hook_form_alter() to add any additional required form elements. You can process their values on submission using a custom validation function. You will need to merge any custom search values into the search keys using a key:value syntax. This allows all search queries to have a clean and permanent URL. See node_form_alter() for an example.


$op: A string defining which operation to perform:

  • 'name': the hook should return a translated name defining the type of items that are searched for with this module ('content', 'users', ...)
  • 'reset': the search index is going to be rebuilt. Modules which use hook_update_index() should update their indexing bookkeeping so that it starts from scratch the next time hook_update_index() is called.
  • 'search': the hook should perform a search using the keywords in $keys
  • 'status': if the module implements hook_update_index(), it should return an array containing the following keys:

    • remaining: the amount of items that still need to be indexed
    • total: the total amount of items (both indexed and unindexed)

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

Return value

An array of search results. Each item in the result set array may contain whatever information the module wishes to display as a search result. To use the default search result display, each item should be an array which can have the following keys:

  • link: the URL of the found item
  • type: the type of item
  • title: 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())

Only 'link' and 'title' are required, but it is advised to fill in as many of these fields as possible.

The example given here is for node.module, which uses the indexed search capabilities. To do this, node module also implements hook_update_index() which is used to create and maintain the index.

We call do_search() with the keys, the module name and extra SQL fragments to use when searching. See hook_update_index() for more information.

Related topics

5 functions implement hook_search()

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

do_search in modules/search.module
Do a query on the full-text search index for a word or words.
locale_string_search in modules/locale.module
Page handler for the string search.
node_admin_search in modules/node.module
node_search in modules/node.module
Implementation of hook_search().
user_search in modules/user.module
Implementation of hook_search().
2 invocations of hook_search()
search_settings in modules/search.module
Menu callback; displays the search module settings page.
search_wipe in modules/search.module
Wipes a part of or the entire search index.


developer/hooks/core.php, line 854
These are the hooks that are invoked by the Drupal core.


function hook_search($op = 'search', $keys = null) {
  switch ($op) {
    case 'name':
      return t('content');
    case 'reset':
    case 'search':
      $find = do_search($keys, 'node', 'INNER JOIN {node} n ON n.nid = i.sid ' . node_access_join_sql() . ' INNER JOIN {users} u ON n.uid = u.uid', 'n.status = 1 AND ' . node_access_where_sql());
      $results = array();
      foreach ($find as $item) {
        $node = node_load(array(
          'nid' => $item,
        $extra = node_invoke_nodeapi($node, 'search result');
        $results[] = array(
          'link' => url('node/' . $item),
          'type' => node_invoke($node, 'node_name'),
          'title' => $node->title,
          'user' => theme('username', $node),
          'date' => $node->changed,
          'extra' => $extra,
          'snippet' => search_excerpt($keys, check_output($node->body, $node->format)),
      return $results;