/** * WP Multi Wiki – AJAX Search Script */ (function ($) { 'use strict'; $(document).ready(function () { $('.wmw-search-widget').each(function () { var $widget = $(this); var $input = $widget.find('.wmw-search-input'); var $results = $widget.find('.wmw-search-results'); var $clear = $widget.find('.wmw-search-clear'); var wikiId = parseInt($widget.data('wiki-id'), 10) || 0; var timer = null; // ── Input handler ───────────────────────────────────────────────── $input.on('input', function () { clearTimeout(timer); var term = $input.val().trim(); if (term.length < 2) { closeResults(); $clear.hide(); return; } $clear.show(); timer = setTimeout(function () { doSearch(term); }, 280); }); // ── Clear button ────────────────────────────────────────────────── $clear.on('click', function () { $input.val('').trigger('input').focus(); }); // ── Close on outside click ──────────────────────────────────────── $(document).on('click.wmw', function (e) { if (!$widget.is(e.target) && !$widget.has(e.target).length) { closeResults(); } }); // ── Keyboard: escape closes ─────────────────────────────────────── $input.on('keydown', function (e) { if (e.key === 'Escape') closeResults(); }); function doSearch(term) { $results.html('
Suche...
').addClass('wmw-open'); $.ajax({ url: wmwData.ajaxUrl, type: 'POST', data: { action: 'wmw_search', nonce: wmwData.nonce, term: term, wiki_id: wikiId, }, success: function (response) { if (!response.success) { $results.html('
Fehler bei der Suche.
'); return; } var items = response.data; if (!items.length) { $results.html('
Keine Ergebnisse fuer “' + escHtml(term) + '”
'); return; } var html = ''; items.forEach(function (item) { html += ''; html += '
' + escHtml(item.title) + '
'; if (item.wiki_title) { html += '
' + escHtml(item.wiki_title) + '
'; } if (item.excerpt) { html += '
' + item.excerpt + '
'; } html += '
'; }); $results.html(html).addClass('wmw-open'); }, error: function () { $results.html('
Verbindungsfehler.
'); }, }); } function closeResults() { $results.removeClass('wmw-open').html(''); } }); // ── Helpers ─────────────────────────────────────────────────────────── function escHtml(str) { return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); } function escAttr(str) { return escHtml(str); } }); })(jQuery);