Расширенная форма поиска с несколькими пользовательскими полями

Вопрос или проблема

Я работаю на сайте, который позволяет искать иски о медицинской халатности. Клиент хочет иметь форму поиска, почти идентичную той, что на этом сайте:

http://psychcrime.org/database/

Вся информация хранится в пользовательских типах записей с пользовательскими полями, включая иск, запись о больнице и врача.

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

Существует ли плагин, который может достичь такой компоновки и поведения?
Если нет, каков был бы лучший подход к созданию этой формы поиска? Я никогда раньше не модифицировал поиск в WordPress.

Мы используем плагин Advanced Custom Fields.

Пользовательские поля хранятся в метаданных записи, что очень затратно (медленно) для выполнения запросов. В идеале, было бы лучше переписать сайт, чтобы использовать пользовательские таксономии вместо пользовательских полей. С этой точки зрения, поиск был бы проще.

Если вы останетесь с ACF или другими метаданными, вы сможете настроить форму поиска и запросы, но вы создадите большую нагрузку на сервер. В такой ситуации было бы предпочтительнее добавить поисковую службу, такую как ElasticSearch или Swiftype. Клиент будет платить за эту ежемесячную или ежегодную услугу, но он сможет проводить различные виды фильтрации и сортировки без необходимости большого объема пользовательского кода, и все будет загружаться гораздо быстрее, потому что вы будете выполнять запросы к внешней службе, а не к базе данных WP.

Ответ или решение

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

1. Анализ требований

Ваш сайт требует создания формы поиска, аналогичной той, что представлена на сайте Psych Crime Database. Основные функции, которые должны быть реализованы:

  • Поля для ввода данных, включая, но не ограничиваясь:

    • Дата и место инцидента;
    • Имя пострадавшего и врача;
    • Название больницы;
    • Категория дела.
  • Возможность комбинированного поиска по нескольким полям одновременно.

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

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

Рекомендация: Плагин FacetWP может стать одним из вариантов. Он поддерживает фильтрацию по пользовательским полям и может быть настроен для работы с ACF (Advanced Custom Fields).

3. Создание собственного решения

Если подходящий плагин не был найден, вам нужно будет создать собственное решение. В этом случае рекомендуется рассмотреть следующие шаги:

3.1. Разработка формы поиска

Создайте HTML-форму с необходимыми полями. Например:

<form method="GET" action="<?php echo esc_url(home_url('/')); ?>">
    <input type="text" name="doctor_name" placeholder="Имя врача">
    <input type="text" name="hospital_name" placeholder="Название больницы">
    <input type="text" name="incident_date" placeholder="Дата инцидента">
    <input type="text" name="patient_name" placeholder="Имя пострадавшего">
    <button type="submit">Поиск</button>
</form>

3.2. Обработка запроса

Используйте pre_get_posts для модификации основных запросов WordPress:

add_action('pre_get_posts', 'custom_search_query');

function custom_search_query($query) {
    if ($query->is_search() && !is_admin()) {
        // Получение значений из формы
        $doctor_name = isset($_GET['doctor_name']) ? sanitize_text_field($_GET['doctor_name']) : '';
        $hospital_name = isset($_GET['hospital_name']) ? sanitize_text_field($_GET['hospital_name']) : '';

        // Модификация запроса
        if (!empty($doctor_name)) {
            $meta_query[] = [
                'key' => 'doctor_name',
                'value' => $doctor_name,
                'compare' => 'LIKE'
            ];
        }

        if (!empty($hospital_name)) {
            $meta_query[] = [
                'key' => 'hospital_name',
                'value' => $hospital_name,
                'compare' => 'LIKE'
            ];
        }

        if (!empty($meta_query)) {
            $query->set('meta_query', $meta_query);
        }
    }
}

3.3. Оптимизация запросов

Поскольку запросы по пользовательским полям могут быть медленными из-за особенностей работы с метаданными, рассмотрите возможность применения альтернативных решений:

  • Перепроектирование базы данных: Если это уместно, используйте пользовательские таксономии. Они обеспечивают более быстрый доступ и удобную фильтрацию.
  • Использование поиска ElasticSearch: Это позволит значительно ускорить поиск и улучшить его точность. Вы можете подключить ElasticSearch через плагины, такие как ElasticPress.

4. Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...