WordPress
- 939 ответов
- 0 вопросов
434
Вклад в тег
add_filter( 'query_vars', 'add_query_vars' );
function add_query_vars( $qvars ) {
$qvars[] = 'brand';
$qvars[] = 'model';
$qvars[] = 'price';
$qvars[] = 'location';
return $qvars;
}
<form method="get" class="block obj-filter">
<div class="row d-flex align-items-center">
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<select name="brand" id="brand" class="obj-select">
<option value="audi">Audi</option>
<option value="volkswagen">Volkswagen</option>
<option value="mercedes">Mercedes</option>
<option value="bmw">BMW</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<select name="price" id="price" class="obj-select">
<option value="20">$20 000</option>
<option value="50">$50 000</option>
<option value="75">$75 000</option>
<option value="100">$100 000</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<input type="text" name="location" id="location" class="obj-filter-input" value="">
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<input id="obj-filter-submit" type="submit" class="button" value="Фильтровать">
</div>
</div>
</form>
https://example.loc/?brand=audi&price=50
. На хуке pre_get_posts
можно поправить основной запрос вытянув данные из гет-параметров. Вам нужно установить новые tax_query или meta_query в зависимости от логики сайтаadd_action( 'pre_get_posts', 'custom_pre_get_posts', 1 );
function custom_pre_get_posts( $query ) {
// Выходим, если это админ-панель или не основной запрос
if( is_admin() || ! $query->is_main_query() )
return;
// предположим, что это таксономия с машинами
if ( $query->is_tax( 'cars' ) ) {
$meta = array();
$meta['meta_query']['relation'] = 'AND';
// выбираем записи с GET запросами
$query_vars = ['brand', 'model', 'price', 'location'];
foreach ( $query_vars as $key => $query_var ) {
if ( $var = get_query_var( $query_var, false ) ) {
// тут пишем логику по которой собирается переменная meta_query и/или tax_query
}
}
$query->set( 'meta_query', $meta );
}
}
$args = array(
'post_type' => 'object',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
$mask = array();
$mask['type'] = 'FeatureCollection';
while ( $query->have_posts() ) {
$query->the_post();
$geo = get_post_meta( get_the_ID(), '_geo', true );
$mask['features'][] = array(
'type' => 'Feature',
'id' => $key,
'geometry' => array (
'type' => 'Point',
'coordinates' => [(float) $geo['lat'], (float) $geo['lat']],
),
'properties' => array (
'balloonContentBody' => '<strong class="map-title"><a class="link" href="' . get_the_title() . '">' . get_the_title() . '</a></strong>',
'balloonContentFooter' => '<a class="hidden" href="#">Я был здесь!</a>',
'clusterCaption' => '<strong>' . get_the_title() . '</strong>',
'hintContent' => '<strong>' . get_the_title() . '</strong>'
)
);
}
}
json_encode( $mask )
в обработчик в js. В поле _geo должен лежать массив: широта и долготаwp_add_inline_script()
, это не супер подход, но, в моем случае было удобнее всегоwp_enqueue_script( 'ya-map-api' );
$ya_map_init .= "<script type='text/javascript'>
jQuery(function($){
ymaps.ready(init);
function init () {
var map = new ymaps.Map('ya-map', {
center: [" . $geo_center . "],
zoom: " . $geo_zoom . ",
controls: ['geolocationControl' ,'zoomControl'],
}, {
avoidFractionalZoom: false,
}),
objectManager = new ymaps.ObjectManager({
clusterize: false
});
objectManager.objects.options.set('preset', 'islands#nightCircleDotIcon');
map.geoObjects.add(objectManager);
var resortLabels = " . json_encode( $mask ) . ";
objectManager.add(resortLabels);
}
});
</script>";
wp_add_inline_script( 'ya-map-api', $ya_map_init );
<div id="map" class="map"></div>
add_action( 'wp_enqueue_scripts', 'ya_scripts' );
function ya_scripts() {
$ya_map_key = '96193550-a00q-czce-p3vb-uh52odq1qhil';
wp_register_script('ya-map-api', 'https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=' . $ya_map_key . '', array('jquery'), null, true);
}
// получаем номер страницы пагинации
$current = absint( max( 1, get_query_var( 'paged' ) ? get_query_var( 'paged' ) : get_query_var( 'page' ) ) );
// собираем запрос
$my_query = new WP_Query( [
'post_type' => 'page',
'posts_per_page' => 10,
'paged' => $current,
] );
if ( $my_query->have_posts() ) {
// основной цикл
while ( $my_query->have_posts() ) {
$my_query->the_post();
###########
}
wp_reset_postdata(); // возвращаем глобальный цикл
// выводим пагинацию
echo wp_kses_post(
paginate_links( [
'total' => $my_query->max_num_pages, // количество берем из дефолтной опции запроса
'current' => $current, // текущая страница
] )
);
} else {
// выводим шаблон "нет контента", если в запросе нет постов
get_template_part( 'templates/content', 'none' );
}
get_posts()
и wp_insert_post()
// получаем данные исходного поста по слагу
$post_slug = '1543';
$args = array( 'name' => $post_slug, 'post_type' => 'post', 'post_status' => 'publish, draft, future', 'numberposts' => 1 );
$post = get_posts($args)[0];
for ( $i = 1; $i < 2771; $i++ ) {
// Создаем массив данных новой записи
$post_data = array(
'ID' => $post->ID++,
'post_title' => $post->post_title,
'post_name' => $post_slug . '-' . $i,
'post_date' => $post->post_date,
'post_date_gmt' => $post->post_date_gmt,
'post_content' => $post->post_content,
'post_status' => 'publish',
'post_type' => 'post',
'post_author' => 1,
);
// Вставляем запись в базу
$post_id = wp_insert_post( wp_slash( $post_data ) );
// пишем ошибку/успех
if( is_wp_error( $post_id ) ) {
var_dump( 'Ошибка инсерта поста ' . $post->post_title . ' таксономии category: ' . $post_id->get_error_message() );
} else {
var_dump( 'Пост ' . $post->post_title . ' таксономии category опубликован удачно!' );
//wp_set_object_terms( $post_id, 'cat_id', 'category' ); // если нужно назначить категорию, заменить cat_id
}
}