Андрей 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. Не смог понять как вычислить максимальные значения цены и сроков, поэтому прописал их фиксированно. Как сделать правильно?