Краткий ответ: поиск по PDF/документам на сайте нужен, чтобы посетитель мог искать не только по страницам WordPress, но и внутри файлов: PDF, DOCX, XLSX, инструкций, каталогов, прайсов, договоров, технической документации и базы знаний. Обычный поиск WordPress чаще всего не читает содержимое файлов, поэтому для нормального результата нужна индексация текста документов.
Правильный поиск по документам — это не просто список PDF-файлов на странице. Сайт должен извлечь текст из файла, сохранить его в поисковый индекс, связать результат с названием документа, страницей, категорией, правами доступа и показать пользователю понятный фрагмент найденного текста.
Проблема появляется, когда на сайте много полезной информации, но она спрятана внутри файлов. Посетитель ищет слово, артикул, модель, пункт инструкции или номер документа, а WordPress находит только страницы и записи.
Если сайт уже использует AI-помощника, поиск по PDF можно сделать частью базы знаний. Тогда AI-чат для сайта сможет отвечать не только по страницам, но и по загруженным инструкциям, каталогам и PDF-документам.
Есть два разных уровня поиска, и их часто путают.
| Тип поиска | Что ищет | Проблема |
|---|---|---|
| Поиск по названию файла | Только имя PDF, title, alt, описание в медиатеке | Не находит текст внутри документа |
| Поиск по тексту документа | Слова, фразы, номера, пункты внутри PDF/DOCX/XLSX | Нужна индексация и извлечение текста |
| Поиск по сканированному PDF | Текст на изображениях внутри PDF | Нужен OCR, иначе текста для поиска нет |
| AI-поиск по документам | Ищет смысл, а не только точное совпадение слов | Нужна база знаний, чанки, embeddings или похожая логика |
Технически сайт может искать по разным типам файлов, но способ обработки зависит от формата.
Перед внедрением поиска нужно понять, какие документы есть на сайте и что именно должно находиться. Без диагностики легко поставить плагин, который красиво показывает файлы, но не ищет внутри них.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Нормальная схема поиска по PDF/документам состоит из нескольких этапов: загрузка файла, извлечение текста, очистка текста, сохранение в индекс, поиск по индексу, вывод результата и проверка доступа.
Готовый плагин подходит, если задача стандартная: загрузить документы, показать библиотеку файлов, добавить поиск по PDF и фильтры. Это хороший вариант для небольших сайтов, где не нужна сложная логика доступа.
Кастомный поиск нужен, если документы связаны с пользователями, компаниями, заказами, личным кабинетом, технической базой, LMS, CRM или закрытым доступом. Например, если каждый клиент должен видеть только свои PDF-документы, это уже задача для отдельного модуля, похожая на личный кабинет на WordPress.
Важно: код ниже показывает упрощённую архитектуру индекса и поиска. Он не извлекает текст из PDF сам по себе. Для реального проекта нужен модуль извлечения текста через серверную утилиту, библиотеку, внешний API или отдельный обработчик. Перед внедрением на рабочий сайт сделайте бэкап базы данных.
Куда вставлять: в отдельный WordPress-плагин. Не рекомендуется хранить такую логику в теме.
<?php
if (!defined('ABSPATH')) {
exit;
}
register_activation_hook(__FILE__, 'sc_document_search_create_table');
function sc_document_search_create_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'sc_document_search_index';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
attachment_id BIGINT UNSIGNED NOT NULL DEFAULT 0,
document_title TEXT NOT NULL,
document_url TEXT NOT NULL,
document_type VARCHAR(50) NOT NULL DEFAULT '',
page_number INT UNSIGNED NOT NULL DEFAULT 0,
indexed_text LONGTEXT NOT NULL,
access_level VARCHAR(50) NOT NULL DEFAULT 'public',
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id),
KEY attachment_id (attachment_id),
KEY document_type (document_type),
KEY access_level (access_level)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
}
Этот пример предполагает, что текст документа уже извлечён другим способом.
<?php
function sc_document_search_save_index($attachment_id, $document_title, $document_url, $document_type, $page_number, $indexed_text, $access_level = 'public') {
global $wpdb;
$table_name = $wpdb->prefix . 'sc_document_search_index';
$wpdb->insert(
$table_name,
array(
'attachment_id' => (int) $attachment_id,
'document_title' => sanitize_text_field($document_title),
'document_url' => esc_url_raw($document_url),
'document_type' => sanitize_text_field($document_type),
'page_number' => (int) $page_number,
'indexed_text' => sanitize_textarea_field($indexed_text),
'access_level' => sanitize_text_field($access_level),
'created_at' => current_time('mysql'),
'updated_at' => current_time('mysql'),
),
array(
'%d',
'%s',
'%s',
'%s',
'%d',
'%s',
'%s',
'%s',
'%s',
)
);
return $wpdb->insert_id;
}
Важно: поиск работает с пользовательским вводом. Нужно использовать nonce, sanitize и $wpdb->prepare(). Если документы закрытые, обязательно проверяйте права пользователя перед выводом результата.
<?php
add_action('wp_ajax_sc_document_search', 'sc_document_search');
add_action('wp_ajax_nopriv_sc_document_search', 'sc_document_search');
function sc_document_search() {
check_ajax_referer('sc_document_search_nonce', 'nonce');
global $wpdb;
$query = isset($_POST['query']) ? sanitize_text_field($_POST['query']) : '';
$query = trim($query);
if (mb_strlen($query) < 3) {
wp_send_json_error(array(
'message' => 'Введите минимум 3 символа.'
));
}
$table_name = $wpdb->prefix . 'sc_document_search_index';
$like = '%' . $wpdb->esc_like($query) . '%';
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT id, document_title, document_url, document_type, page_number, indexed_text
FROM $table_name
WHERE access_level = %s
AND indexed_text LIKE %s
ORDER BY updated_at DESC
LIMIT 20",
'public',
$like
),
ARRAY_A
);
$items = array();
foreach ($results as $row) {
$items[] = array(
'title' => esc_html($row['document_title']),
'url' => esc_url($row['document_url']),
'type' => esc_html($row['document_type']),
'page' => (int) $row['page_number'],
'excerpt' => esc_html(sc_document_search_make_excerpt($row['indexed_text'], $query)),
);
}
wp_send_json_success(array(
'items' => $items
));
}
function sc_document_search_make_excerpt($text, $query) {
$text = wp_strip_all_tags($text);
$position = mb_stripos($text, $query);
if ($position === false) {
return mb_substr($text, 0, 220) . '...';
}
$start = max(0, $position - 80);
$excerpt = mb_substr($text, $start, 220);
return '...' . $excerpt . '...';
}
Куда вставлять: в шаблон страницы, shortcode или файл плагина.
<div class="sc-document-search-box">
<input type="text" id="sc_document_search_query" placeholder="Введите слово, артикул или фразу">
<input type="hidden" id="sc_document_search_nonce" value="<?php echo esc_attr(wp_create_nonce('sc_document_search_nonce')); ?>">
<button type="button" id="sc_document_search_button">Найти</button>
<div id="sc_document_search_status"></div>
<div id="sc_document_search_results"></div>
</div>
Куда вставлять: лучше подключать отдельным JS-файлом только на странице поиска документов.
<script>
jQuery(document).ready(function() {
jQuery(document).on('click', '#sc_document_search_button', function() {
var query = jQuery('#sc_document_search_query').val();
var nonce = jQuery('#sc_document_search_nonce').val();
jQuery('#sc_document_search_status').html('Идёт поиск...');
jQuery('#sc_document_search_results').html('');
jQuery.ajax({
url: '<?php echo admin_url("admin-ajax.php") ?>',
type: 'POST',
dataType: 'json',
data: {
action: 'sc_document_search',
nonce: nonce,
query: query
},
success: function(response) {
if (!response.success) {
jQuery('#sc_document_search_status').html(response.data.message);
return;
}
jQuery('#sc_document_search_status').html('');
if (!response.data.items.length) {
jQuery('#sc_document_search_results').html('<p>Ничего не найдено.</p>');
return;
}
var html = '<div class="sc-document-search-results-list">';
jQuery.each(response.data.items, function(index, item) {
html += '<div class="sc-document-search-result">';
html += '<h3><a href="' + item.url + '" target="_blank" rel="noopener">' + item.title + '</a></h3>';
html += '<p><strong>Тип:</strong> ' + item.type + ' <strong>Страница:</strong> ' + item.page + '</p>';
html += '<p>' + item.excerpt + '</p>';
html += '</div>';
});
html += '</div>';
jQuery('#sc_document_search_results').html(html);
},
error: function() {
jQuery('#sc_document_search_status').html('Ошибка поиска. Попробуйте позже.');
}
});
});
});
</script>
После правильной настройки посетитель может искать внутри документов так же удобно, как по обычным страницам сайта. Он вводит запрос и получает не просто файл, а понятный результат: название документа, тип, страницу, фрагмент найденного текста и ссылку на открытие или скачивание.
Подходит, если нужно быстро добавить поиск по документам без разработки. Важно проверить, ищет ли плагин именно внутри текста PDF, а не только по названию файла.
Плюсы: быстрее запуск, настройки в админке, меньше кода.
Минусы: ограничения логики, не всегда есть OCR, сложнее сделать права доступа под бизнес-процесс.
Подходит для сайтов с каталогами, инструкциями, прайсами, архивами, техническими файлами и фильтрами.
Плюсы: удобный список документов, категории, теги, фильтрация.
Минусы: сама библиотека не всегда означает полноценный поиск внутри текста файлов.
Подходит, если документы нужно связать с пользователями, компаниями, заказами, ролями, CRM, личным кабинетом или закрытой базой знаний.
Плюсы: точная логика под проект, контроль доступа, свои таблицы, логи, интеграции.
Минусы: нужно проектирование, тестирование и обработка разных форматов файлов.
Подходит, если пользователь ищет не точное слово, а смысл. Например: “как заменить фильтр”, “где указана гарантия”, “какой артикул подходит к модели”.
Плюсы: лучше понимает вопросы обычным языком.
Минусы: нужна подготовка базы знаний, разбиение документов на части и контроль неправильных ответов.
Если PDF создан из сканов, обычный поиск не найдёт текст, потому что текста внутри нет. На странице видна картинка с буквами, но для программы это изображение.
Поиск по документам может случайно раскрыть закрытую информацию. Это особенно важно для личных кабинетов, B2B-порталов, инструкций, договоров, актов, счетов, технической документации и клиентских файлов.
Индексация документов может быть тяжёлой. Особенно если на сайте сотни PDF-файлов, большие каталоги, таблицы XLSX или сканы с OCR. Нельзя извлекать текст из PDF при каждом поисковом запросе пользователя.
Если после добавления поиска сайт или админка начали работать медленнее, нужно проверить AJAX, базу данных, cron и логи. Общий подход похож на ускорение WordPress/WooCommerce, только дополнительно проверяется индексация файлов.
Медиатека хранит файл и его метаданные, но это не значит, что стандартный поиск WordPress умеет читать весь текст документа.
PDF viewer может красиво открыть файл на странице, но это не означает, что сайт индексирует содержимое документа.
Если файл называется catalog-2026.pdf, пользователь не найдёт артикул, инструкцию или пункт договора внутри документа.
Сканированный PDF без OCR не даст нормального поиска. Его нужно распознать или заменить текстовой версией.
Если в поисковый индекс попали закрытые документы, пользователь может увидеть чужую информацию через результаты поиска.
Это сильно нагружает сервер. Текст нужно извлекать заранее и хранить в индексе.
Без логов непонятно, какой файл не обработался, почему не извлёкся текст и где произошла ошибка.
Если PDF заменили, а индекс остался старым, поиск будет показывать устаревшие результаты.
Поиск по PDF/документам на сайте — это система, которая извлекает текст из файлов, сохраняет его в индекс и позволяет пользователю искать внутри PDF, DOCX, XLSX, инструкций, каталогов и других документов.
Стандартный поиск WordPress обычно ищет по страницам, записям и метаданным, но не всегда индексирует содержимое файлов. Для поиска внутри PDF нужен отдельный индексатор или плагин.
Да, но сначала нужен OCR. Без распознавания текста сканированный PDF остаётся изображением, и обычный поиск не найдёт слова внутри него.
Да. Для этого документы нужно извлечь в текст, разделить на фрагменты, добавить в базу знаний и подключить AI-модель или семантический поиск.
Да. Это можно сделать через готовый плагин, кастомный индекс документов или отдельный поисковый движок. Главное — индексировать текст внутри файлов, а не только названия.
Потому что загрузка PDF в медиатеку не означает автоматическую индексацию текста внутри файла. Нужно извлечь текст и добавить его в поисковый индекс.
Готовый плагин подходит для простой библиотеки документов. Кастомный поиск нужен, если есть закрытые документы, роли, личный кабинет, CRM, AI-поиск или сложные фильтры.
Да, если система умеет извлекать текст из DOCX, XLSX и сохранять его в индекс. Для таблиц важно правильно обрабатывать листы, строки, артикулы и числовые значения.
OCR нужен только для сканированных PDF, где текст не выделяется мышкой и не находится через Ctrl+F.
Иногда да, если PDF viewer и индекс хранят номер страницы. Но точное открытие зависит от просмотрщика PDF и структуры ссылки.
Да. Нужно хранить уровень доступа документа и проверять права пользователя перед выводом результата и перед скачиванием файла.
Может влиять, если извлекать текст во время поиска. Правильно делать индексацию заранее и искать уже по подготовленному индексу.
Да. Документы можно превратить в базу знаний, чтобы AI-чат отвечал на вопросы по инструкциям, прайсам, каталогам и PDF-файлам.
Нужно использовать фоновую индексацию, очередь, разбиение на фрагменты, фильтры и, при необходимости, отдельный поисковый движок вместо простого LIKE-поиска в MySQL.
Поиск по PDF/документам на сайте нужен там, где важная информация хранится не только на страницах WordPress, но и внутри файлов: инструкций, каталогов, прайсов, договоров, архивов, технической документации и закрытых материалов.
Лучший результат даёт не просто PDF viewer, а полноценная система: извлечение текста, индексация, фильтры, права доступа, логи, фоновая обработка и понятный вывод результатов. Если добавить AI-поиск, документы становятся не мёртвым архивом, а рабочей базой знаний для посетителей, клиентов и сотрудников.
Об авторе