WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Рекомендуемые продукты со скидкой от Template Monster

get_search_form() WP 2.7.0

Подключает форму поиска, файл темы searchform.php. Если такого файла в шаблоне темы нет, то будет использован дефолтный код для формы поиска.

Не забывайте про безопасность

В строку поиска, пользователь может вписать что угодно, например рабочий скрипт <script>alert('aaaa');<script>. И если вывести строку запроса на странице как есть, то такой скрипт будет обработан браузером. А если в него написать что-то нехорошее, то ваш сайт можно будет легко взломать.

Поэтому для вывода запроса поиска на экран, всегда используйте функцию get_search_query(). Она обезопасит вас от XSS атак. Именно это место является одним из самых слабых в безопасности самодельных WordPress тем.

<?php echo get_search_query(); ?>

Выводимую строку также можно очистить с помощью: esc_attr(), esc_html().

Использование

<?php get_search_form( $echo ); ?>
$echo(логический)
Выводить код на экран (true) или возвращать для обработки (false).
По умолчанию: true

Примеры

#1. HTML формы поиска через файл searchform.php

Создаем файл searchform.php в папке темы с кодом:

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ) ?>" >
	<label class="screen-reader-text" for="s">Поиск: </label>
	<input type="text" value="<?php echo get_search_query() ?>" name="s" id="s" />
	<input type="submit" id="searchsubmit" value="найти" />
</form>

Затем, там где нужна форма поиска, вызываем функцию get_search_form(), которая выведет содержимое созданного нами файла searchform.php:

<?php get_search_form(); ?>

Имейте ввиду, что форма поиска должна отправлять GET запрос на главную страницу сайта: action="<?php echo home_url( '/' ); ?>") и обязательно должен присутствовать параметр s (что искать): <input type="text" value="" name="s" id="s" />.

#1.1 HTML формы поиска по умолчанию

Если в теме нет файла searchform.php, то вызов этой функции выведет HTML формы по умолчанию:

<form role="search" method="get" id="searchform" class="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
	<div>
		<label class="screen-reader-text" for="s"><?php _x( 'Search for:', 'label' ); ?></label>
		<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" />
		<input type="submit" id="searchsubmit" value="<?php echo esc_attr_x( 'Search', 'submit button' ); ?>" />
	</div>
</form>

Такая HTML разметка будет выведена если, НЕ установлена поддержка html5 в теме. Напомню, устанавливается она через функцию add_theme_support() так:

add_theme_support( 'html5', array( 'search-form' ) );

Однако, если поддержка html5 включена, то по умолчанию мы получим такой HTML код формы поиска:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
	<label>
		<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
		<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
	</label>
	<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>

То есть тип поля меняется с text на search: type="search".

Предпочтение стоит отдавать html5 форме, поэтому всегда включайте эту настройку в темах!

#2. HTML формы поиска через хук

Можно не создавать файл темы searchform.php, а изменить HTML код формы через хук get_search_form, который нужно вставлять в файл темы functions.php.

add_filter( 'get_search_form', 'my_search_form' );
function my_search_form( $form ) {

	$form = '
	<form role="search" method="get" id="searchform" action="' . home_url( '/' ) . '" >
		<label class="screen-reader-text" for="s">Запрос для поиска:</label>
		<input type="text" value="' . get_search_query() . '" name="s" id="s" />
		<input type="submit" id="searchsubmit" value="Найти" />
	</form>';

	return $form;
}

#3. Фильтр (ограничение) результатов поиска

Кроме параметра запроса s, можно отфильтровать поиск по типу записи. Для этого добавьте в форму еще одно input поле с именем post_type:

<input type="hidden" value="post" name="post_type" />

В результате при отправке формы (сабмите) мы получит строку запроса вида: ?s=текст&post_type=post. А это значит, что поиск будет проходить не по всем типам записей, а только по типу записи указанному в поле name="post_type", в данном случае по типу post. По умолчанию там указано: post_type = any (любой тип записи).

Также результаты поиска можно отфильтровать как угодно, используя событие pre_get_posts. Примеры смотрите в описании.

Список изменений

С версии 2.7.0 Введена.
С версии 5.2.0 The $args array parameter was added in place of an $echo boolean flag.

Код get search form: wp-includes/general-template.php WP 5.2.3

<?php
function get_search_form( $args = array() ) {
	/**
	 * Fires before the search form is retrieved, at the start of get_search_form().
	 *
	 * @since 2.7.0 as 'get_search_form' action.
	 * @since 3.6.0
	 *
	 * @link https://core.trac.wordpress.org/ticket/19321
	 */
	do_action( 'pre_get_search_form' );

	$echo = true;

	if ( ! is_array( $args ) ) {
		/*
		 * Back compat: to ensure previous uses of get_search_form() continue to
		 * function as expected, we handle a value for the boolean $echo param removed
		 * in 5.2.0. Then we deal with the $args array and cast its defaults.
		 */
		$echo = (bool) $args;

		// Set an empty array and allow default arguments to take over.
		$args = array();
	}

	// Defaults are to echo and to output no custom label on the form.
	$defaults = array(
		'echo'       => $echo,
		'aria_label' => '',
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the array of arguments used when generating the search form.
	 *
	 * @since 5.2.0
	 *
	 * @param array $args The array of arguments for building the search form.
	 */
	$args = apply_filters( 'search_form_args', $args );

	$format = current_theme_supports( 'html5', 'search-form' ) ? 'html5' : 'xhtml';

	/**
	 * Filters the HTML format of the search form.
	 *
	 * @since 3.6.0
	 *
	 * @param string $format The type of markup to use in the search form.
	 *                       Accepts 'html5', 'xhtml'.
	 */
	$format = apply_filters( 'search_form_format', $format );

	$search_form_template = locate_template( 'searchform.php' );
	if ( '' != $search_form_template ) {
		ob_start();
		require( $search_form_template );
		$form = ob_get_clean();
	} else {
		// Build a string containing an aria-label to use for the search form.
		if ( isset( $args['aria_label'] ) && $args['aria_label'] ) {
			$aria_label = 'aria-label="' . esc_attr( $args['aria_label'] ) . '" ';
		} else {
			/*
			 * If there's no custom aria-label, we can set a default here. At the
			 * moment it's empty as there's uncertainty about what the default should be.
			 */
			$aria_label = '';
		}
		if ( 'html5' == $format ) {
			$form = '<form role="search" ' . $aria_label . 'method="get" class="search-form" action="' . esc_url( home_url( '/' ) ) . '">
				<label>
					<span class="screen-reader-text">' . _x( 'Search for:', 'label' ) . '</span>
					<input type="search" class="search-field" placeholder="' . esc_attr_x( 'Search &hellip;', 'placeholder' ) . '" value="' . get_search_query() . '" name="s" />
				</label>
				<input type="submit" class="search-submit" value="' . esc_attr_x( 'Search', 'submit button' ) . '" />
			</form>';
		} else {
			$form = '<form role="search" ' . $aria_label . 'method="get" id="searchform" class="searchform" action="' . esc_url( home_url( '/' ) ) . '">
				<div>
					<label class="screen-reader-text" for="s">' . _x( 'Search for:', 'label' ) . '</label>
					<input type="text" value="' . get_search_query() . '" name="s" id="s" />
					<input type="submit" id="searchsubmit" value="' . esc_attr_x( 'Search', 'submit button' ) . '" />
				</div>
			</form>';
		}
	}

	/**
	 * Filters the HTML output of the search form.
	 *
	 * @since 2.7.0
	 *
	 * @param string $form The search form HTML output.
	 */
	$result = apply_filters( 'get_search_form', $form );

	if ( null === $result ) {
		$result = $form;
	}

	if ( isset( $args['echo'] ) && $args['echo'] ) {
		echo $result;
	} else {
		return $result;
	}
}

Cвязанные функции

Из раздела: Подключение файлов темы

Еще из тегов шаблона: Основные

33 коммента
Полезные 1 Вопросы 4 Все
  • Юрий

    Здравствуйте, подскажите пожалуйста, возможно ли как то сделать что бы поиск происходил только в опредиленной категории, или странице, а не по всему сайту?
    Скажем по ID.

    Ответить8 мес назад #
    • campusboy3416 www.youtube.com/c/wpplus

      Здравствуйте. Да, вы можете воспользоваться мощью хука pre_get_posts для решения этой задачи.

      Ответить8 мес назад #
  • Виктория creativportal.ru

    Очень хорошая статья. Благодарю за проделанную работу. С наилучшими пожеланиями всё подробно и понятно!

    1
    Ответить5 мес назад #
  • а в какую часть кнопки вызова формы вообще нужно прописать функцию get_search_form(), чтобы она срабатывала по нажатию?
    а-то написали "там где нужна форма поиска, вызываем функцию", а как её вызвать то вообще?

    Ответить3 мес назад #
    • квезаль q-uetzal.ru

      в код надо вставить строчку . как если бы вы новый блок вставляли.там появится строка поиска. ну и потом стилями подогнать уже получше. например, я вставила в рубрику статей между теми блоками, где хотела отобразить. И потом уже позиционировала стилями. Сершформ файл помогает отобразить форму . а просто серш выводит данные.

      Ответить2 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться