Андрей CS сказал(а)
попробуйте поискать доступные плагины для организации поиска публикаций в репозитории WP или можно взять за основу функцию вывода поискового фильтра из дополнения Freelance NextGen и переделать ее для поиска услуг от дополнения Shop Service
Здравствуйте!
взял за основу фриланс нехтген добавил в файл functions-action.php
add_action( 'pre_get_posts', 'sm_task_query_filter', 10);
function sm_task_query_filter($query) {
    if ( ! is_admin() && $query->is_main_query() ) {
        
        if(!$query->is_post_type_archive('service')) return;
        
        $meta_query = array();
        
        if(isset($_GET['sms'])){
            
            $query->set('s', $_GET['sms']);
            
        }
        
        if($_GET['ssubject']){
                
            $query->set('tax_query', array(
                array(
                    'taxonomy' => 'service-category',
                    'field' => 'id',
                    'terms' => $_GET['ssubject']
                )
            ));
        }
        
      
        
        if(isset($_GET['smprice'])){
            
            $meta_query[] = array(
                array(
                    'key' => 'sm-price',
                    'value' => $_GET['smprice'],
                    'type'    => 'numeric',
                    'compare' => 'BETWEEN'
                )
            );
            
        }
		
		 
        if(isset($_GET['smdays'])){
            
            $meta_query[] = array(
                array(
                    'key' => 'sm-service-days',
                    'value' => $_GET['smdays'],
                    'type'    => 'numeric',
                    'compare' => 'BETWEEN'
                )
            );
            
        }
        
        if(isset($_GET['forderby'])){
            
            $sort = $_GET['forderby'];
            
            if($sort == 'date'){
                $query->set('orderby', $_GET['forderby']);
            }
            
            if($sort == 'price'){
                $query->set('orderby', 'meta_value_num');
                $query->set('meta_key', 'sm-price');
            }
			
			 if($sort == 'days'){
                $query->set('orderby', 'meta_value_num');
                $query->set('meta_key', 'sm-service-days');
            }
        }
        
        if(isset($_GET['forder'])){
            $query->set('order', $_GET['forder']);
        }
        
        if($meta_query)
            $query->set('meta_query', $meta_query);
    }
}
и в файл shortcodes.php
add_shortcode('sm-search-form', 'sm_get_search_form');
function sm_get_search_form($atts = false){
    global $wpdb;
    extract(shortcode_atts(array(
        'type'=> 'vertical'
    ),
    $atts));
    $maxPrice = $wpdb->get_var("SELECT MAX(cast(postmeta.meta_value as unsigned)) FROM $wpdb->postmeta AS postmeta "
                    . "INNER JOIN $wpdb->posts AS posts ON postmeta.post_id=posts.ID "
                    . "WHERE posts.post_type = 'service' "
                    . "AND posts.post_status='publish' "
                    . "AND postmeta.meta_key='fng-price'");
    $terms = get_terms( array(
        'taxonomy' => 'service-category',
        'hide_empty' => false,
        'parent' => 0
    ) );
    $category = array( '' => __('Все категории') );
    foreach($terms as $term){
        $category[$term->term_id] = $term->name;
    }
    $fields = array(
        array(
            'type' => 'text',
            'slug' => 'sms',
            'default' => isset($_GET['sms'])? $_GET['sms']: '',
            'title' => __('Поиск по слову'),
            'placeholder' => __('Поиск...')
        ),
        
        array(
            'type' => 'select',
            'slug' => 'ssubject',
            'title' => __('Категория'),
            'default' => isset($_GET['ssubject'])? $_GET['ssubject']: '',
            'values' => $category
        ),
        array(
            'type' => 'range',
            'slug' => 'smprice',
            'title' => __('Стоимость'),
            'value_max' => ($maxPrice && $maxPrice > 100000)? $maxPrice: 100000,
            'value_step' => 100,
            'default' => isset($_GET['smprice'])? $_GET['smprice']: '',
        ),
		 array(
            'type' => 'range',
            'slug' => 'smdays',
            'title' => __('Срок выполнения'),
            'value_max' => ($maxDays && $maxDays > 365)? $maxDays: 365,
            'value_step' => 1,
            'default' => isset($_GET['smdays'])? $_GET['smdays']: '',
        ),
        array(
            'type' => 'radio',
            'slug' => 'forderby',
            'title' => __('Сортировка по'),
            'values' => array(
			    'price' => __('стоимости'),
                'date' => __('дате'),
				'days' => __('сроку')            
            ),
            'default' => isset($_GET['forderby'])? $_GET['forderby']: 'price',
        ),
        array(
            'type' => 'radio',
            'slug' => 'forder',
            'title' => __('Вывод по'),
            'values' => array(
			    'ASC' => __('возрастанию'),
                'DESC' => __('убыванию')             
            ),
            'default' => isset($_GET['forder'])? $_GET['forder']: 'ASC',
        ),
        array(
            'type' => 'hidden',
            'slug' => 'post_type',
            'value' => 'service'
        )
    );
    $fields = apply_filters('sm_search_fields', $fields);
    $content = '<div class="fng-search-form type-'.$type.'">';
    $content .= rcl_get_form(array(
        'fields' => $fields,
        'method' => 'get',
        'action' => get_post_type_archive_link('service'),
        'submit' => __('Найти проект')
    ));
    $content .= '</div>';
    return $content;
}
Работает, но есть пара вопросов
1. Как сделать чтобы отображались также подкатегории?
2. Не смог понять как вычислить максимальные значения цены и сроков, поэтому прописал их фиксированно. Как сделать правильно?
 
                     
                    
                    
                 
                