Создание выпадающего поиска на jQuery в WordPress

Буквально на днях такой поиск появился у меня на блоге и я решил поделиться с вами рецептом его приготовления.

HTML

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

Вставляем этот код куда вздумается.

<div id="aj_search">
    <form action="<?php bloginfo('url') ?>" method="GET">
        <input type="text" name="s" id="s" value="поиск..." autocomplete="off" />
    </form>
    <div id="aj_searchresults"></div>
</div>

CSS

На этом блоге позиционирование элементов устроено немного по-другому, поэтому если стили вам не подойдут, подправьте их сами, либо попросите об этом в комментариях к посту.

#aj_search{
    position:relative;
}
 
#aj_search input{
    height:20px;
    padding:5px;
}
 
#aj_searchresults{
    position:absolute;
    z-index:100;
    top:30px;
    left:0;
    display:none;
}

Обратите внимание, что здесь перечислены только необходимые стили, вам возможно придётся добавлять собственные как к полю ввода, так и к результатам поиска.

jQuery

Описывать все эффекты, которые используются в поиске на моём блоге не вижу смысла, ведь главное уловить саму суть, итак:

$(document).ready(function(){
    $('#s').focus(function(){
        if($(this).val() == 'поиск...') {
            $(this).val('');
        } else {
            $('#aj_searchresults').show();
        }
        $(this).addClass('blured');
    }).blur(function(){
        if($('#s').hasClass('blured')){
            $('#aj_searchresults').hide();
            if($(this).val() == ''){
                $(this).val('поиск...');
            }
        }
    }).keyup(function() {
        $.ajax({
            'type':   'post',
            'url' :   '<?php bloginfo('stylesheet_directory') ?>/my_search.php',
            'data':   's=' + $(this).val(),
            'success': function (result) {
                $('#aj_searchresults').show().html(result);
            }
        })
    });
    $('#aj_searchresults').mouseout(function(){
        $('#s').addClass('blured');
    }).mouseover(function(){
        $('#s').removeClass('blured');
    });
});

PHP

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

<?php
if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
    header('Allow: POST');
    header('HTTP/1.1 405 Method Not Allowed');
    header('Content-Type: text/html');
    include '404.php';
    exit;
}
 
include_once '../../../wp-load.php';
 
$str = addslashes($_POST['s']);
 
function filter_where( $where = ''){
    global $str;
    $where .= " AND post_title LIKE '%$str%' ";
    return $where;
}
 
add_filter('posts_where', 'filter_where');
 
$result = new WP_Query('post_status=publish');
 
remove_filter('posts_where', 'filter_where');
 
if($result->have_posts()):
    while ($result->have_posts()) : $result->the_post(); ?>
        <a href="<?php the_permalink(); ?>">
            <h5><?php the_title(); ?></h5>
            <p><?php the_excerpt(); ?></p>
        </a><?php
    endwhile; 
else: ?>
    <div>
        <p>Ничо не найдено.</p>
    </div>
<?php endif;

Если у вас что-то не получилось — обращайтесь ко мне, буду рад помочь 🙂

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

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

%d такие блоггеры, как: