Задать вопрос
Приветствую! Меня зовут Артем, я занимаюсь разработкой, оптимизацией и поддержкой сайтов на WordPress более 6 лет. Я специализируюсь на разработке пользовательских тем, их модификации, написании плагинов и пользовательского кода, заинтересован в работе над сложными и большими проектами

Проекты, над которыми я работал:

- Крупные информационные сайты и блоги

- Интернет-магазины на WooCommerce

- Сайты услуг для малого бизнеса

- Сайты для спортсменов, актеров и групп

- Сайты портфолио

- Сайты для аренды

Я могу помочь вам или вашему бизнесу создать сайт от концепции дизайна до готового проекта. Также я могу помочь в редизайне, поддержке и обновлении существующих сайтов
Контакты
Местоположение
Грузия, Грузия, Тбилиси

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (67)

Лучшие ответы пользователя

Все ответы (1083)
  • Форма подбора wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    1. Регистрируете гет-переменные

    add_filter( 'query_vars', 'add_query_vars' );
    function add_query_vars( $qvars ) {
    
    	$qvars[] = 'brand';
    	$qvars[] = 'model';
    	$qvars[] = 'price';
    	$qvars[] = 'location';
    
    	return $qvars;
    }


    2. Собираете и выводите html-форму
    <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>


    3. При нажатии кнопки Фильтровать страница перезагружается, вы получаете ссылку вида 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 );
    
    	}
    }
    Ответ написан
    Комментировать
  • Как вывести метки на яндекс карту из кастомных полей wordpess?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Посмотрите пример object_manager, примерно так вам нужно собрать данные записей в json для карты:

    $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 должен лежать массив: широта и долгота

    PS Скрипт я выводил с помощью функции 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 и стили для него

    <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&amp;apikey=' . $ya_map_key . '', array('jquery'), null, true);
    
    }


    Если у вас десятки тысяч объектов, желательно куда-то кешировать эти данные и обновлять только когда обновился какой-то объект на сайте
    Ответ написан
  • Как сделать пагинацию WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    // получаем номер страницы пагинации
    $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' );
    }
    Ответ написан
  • Как в wordpress в базе данных (phpMyAdmin) сделать 4000 копий одной страницы?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    На счет базы не подскажу, но вы можете воспользоваться нативными функциями 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
    	}
    }


    Поменяйте слаги на нужные, я так и на понял какие вам нужны
    Ответ написан
    Комментировать