• Как передать метку на карту по координатам из админки?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Тоже решал подобную проблему, в итоге решил собирать весь скрипт на php. Сначала собираю обычный массив, как в документации object_manager

    $mask         = array();
    $mask['type'] = 'FeatureCollection';
    
    foreach ( $resorts as $key => $resort ) {
    
    	$geo_point = get_post_meta( $resort->ID, '_geo_location', true );
    	$geo_point = explode( ',', $geo_point );
    
    	// Собираем php массив для карты, который энкодим в json формат
    	$mask['features'][] = array(
    		'type'       => 'Feature',
    		'id'         => $key,
    		'geometry'   => array (
    			'type'        => 'Point',
    			'coordinates' => [(float) trim($geo_point[0]), (float) trim($geo_point[1])],
    		),
    		'properties' => array (
    			'balloonContentBody' => '<strong class="balloon-title"><a class="link" href="' . esc_url( get_the_permalink( $resort->ID ) ) . '" target="_blank">' . $resort->post_title . '</a></strong>',
    			'clusterCaption'     => '<strong>' . $resort->post_title . '</strong>',
    			'hintContent'        => '<strong>' . $resort->post_title . '</strong>'
    		)
    	);
    }


    С помощью json_encode() и wp_add_inline_script() вставляю все во фронт

    $frontend_scripts = "<script type='text/javascript'>
    
    	jQuery(function($){
    
    		ymaps.ready(init);
    
    		function init () {
    			var map = new ymaps.Map('ya-map', {
    					center: [55.76, 37.64],
    					zoom: 4,
    					controls: ['geolocationControl' ,'zoomControl'],
    				}, {
    					avoidFractionalZoom: false,
    				});
    				
    			map.behaviors.disable(\"scrollZoom\");
    
    			var objectManager = new ymaps.ObjectManager({
    				clusterize: true,
    				gridSize: 32,
    				clusterDisableClickZoom: true
    			});
    
    			objectManager.objects.options.set( 'preset', 'islands#greenCircleDotIcon' );
    			objectManager.clusters.options.set( 'preset', 'islands#greenClusterIcons' );
    
    			map.geoObjects.add(objectManager);
    
    			var pointLabels = " . json_encode( $mask ) . ";
    			objectManager.add(pointLabels);
    
    			// эта костыльная хуйня центрирует карту и делает автозум, чтобы попали все точки
    			var geoObjects = ymaps.geoQuery(pointLabels)
    				.applyBoundsToMap(map, {
    					checkZoomRange: true
    				});
    
    		}
    
    	});
    
    </script>";
    
    wp_add_inline_script( 'main', minify_js( $frontend_scripts ) );
    Ответ написан
  • Как вывести список городов и областей на WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для начала вам понадобится простая функция конвертации городов, а так же зарегистрировать гет-параметр на фильтре query_vars

    if ( ! function_exists( 'get_converter_wp_cities' ) ) {
    
    	/**
    	 * Return string or array with wp cities.
    	 *
    	 * @param string $control Key to get one value. Optional. Default null.
    	 *
    	 * @return string|array|false
    	 */
    	function get_converter_wp_cities( $control = null ) {
    
    		// Sanitize string (just to be safe).
    		if ( ! is_null( $control ) ) {
    			$control = get_title_slug( $control );
    		}
    
    		// Main converter array.
    		$converter = array(
    			'moscow'           => 'Москва',
    			'saint-petersburg' => 'Санкт-Петербург',
    			'novosibirsk'      => 'Новосибирск',
    		);
    
    		$converter = apply_filters( 'get_converter_wp_cities', $converter );
    
    		// Return controls.
    		if ( is_null( $control ) ) {
    			return $converter;
    		} elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) {
    			return false;
    		} else {
    			return $converter[ $control ];
    		}
    	}
    }
    
    if ( ! function_exists( 'query_vars_wp_cities' ) ) {
    
    	/**
    	 * Function for 'query_vars' filter-hook.
    	 * 
    	 * @param string[] $public_query_vars The array of allowed query variable names.
    	 *
    	 * @return string[]
    	 */
    	function query_vars_wp_cities( $public_query_vars ){
    
    		$public_query_vars[] = 'city';
    
    		return $public_query_vars;
    	}
    }
    add_filter( 'query_vars', 'query_vars_wp_cities' );


    Вывести список городов вы можете простым циклом, создавая ссылки с помощью функции add_query_arg()

    echo '<ul class="city-list">';
    
    foreach ( get_converter_wp_cities() as $key => $city ) {
    	$url = add_query_arg( array( 'city' => $key ), get_home_url( '/' ) );
    
    	echo '<li class="city-list-item"><a href="' . esc_url( $url ) . '" class="link">' . esc_html( $city ) . '</a></li>';
    }
    
    echo '</ul>';


    Получить значение текущего горда из гет-параметра мы можете функцией get_query_var()

    $city = get_query_var( 'city', false );
    var_dump( $city );


    Чтобы создать записи физически, как в вашем примере, вы можете зарегистрировать тип записи и таксономии для него с помощью register_post_type() и register_taxonomy(), а создать записи wp_insert_post()

    Шорткод можете создать по этому шаблону
    if ( ! function_exists( 'wp_city' ) ) {
    
    	/**
    	* Add shortcode with city [wp_city city=""]
    	*
    	* @param array $atts shortcode attributes.
    	*
    	* @return string
    	*/
    	function wp_city( $atts ) {
    
    		// Define a white list of attributes.
    		$atts = shortcode_atts( array(
    			'city' => get_query_var( 'city', false ),
    		), $atts );
    
    		if ( $atts['city'] ) {
    			$output = '<span class="current-city">' . esc_html( get_converter_wp_cities( $atts['city'] ) ) . '</span>';
    		}
    
    		return apply_filters( 'wp_city', $output );
    	}
    }
    add_shortcode( 'wp_city', 'wp_city' );


    Большая проблема — собирать тексты и заголовки для SEO. Для создания переменных плагина Yoast можете взять этот шаблон

    function get_yoast_current_city() {
    
    	$city = get_query_var( 'city', false );
    
    	if ( $city ) {
    		$string = $city;
    	} else {
    		$string = '';
    	}
    
    	return $string;
    }
    
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%CurrentCity%%', 'get_yoast_current_city', 'advanced', __( 'Some instead title text', 'wpgen' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );


    Еще одна проблема в том, что вам понадобятся склонения городов в тексте и заголовках. Для решения этой задачи я создавал большую excel-таблицу со списком и парсил ее библиотекой SimpleXLSX

    655af38fd63a6389461115.png
    Ответ написан
    2 комментария
  • Почему не выводится изображение в шапку сайта?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Используйте функцию get_theme_file_uri()

    $image_path = get_theme_file_uri( '/assets/images/MyTheme-Header.png' );
    Ответ написан
    Комментировать
  • Как можно настроить генерацию имен полей, что бы не повторялись?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть функция wp_unique_post_slug(), которая не дает публиковать записи с двумя одинаковыми слагами. Можно использовать ее или по аналогии написать такую же для полей wp_postmeta
    Ответ написан
  • Как создать структуру сайта на Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можно сделать через get-параметры, так довольно просто размножить страницы, но зависит от того на сколько у вас различается контент

    • /math/?type=mcko&klass=1
    • /math/?type=mcko&klass=2
    • /math/?type=vpr&klass=1
    • /math/?type=vpr&klass=2


    • /rus-yaz/?type=mcko&klass=1
    • /rus-yaz/?type=mcko&klass=2
    • /rus-yaz/?type=vpr&klass=1
    • /rus-yaz/?type=vpr&klass=2
    Ответ написан
    Комментировать
  • Как убрать дубликат главной страницы Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Я вам больше скажу, главная страница, как и любая другая, будет доступна с бесконечным множеством указанных get-параметров или якорей

    • domain-name.com/#creation-of-the-order
    • domain-name.com/#all-roads-lead-to-rome
    • domain-name.com/?brand=123
    • domain-name.com/?model=123
    • domain-name.com/?form-email=123
    • domain-name.com/?custom_query_var=123
    Ответ написан
    Комментировать
  • Как изменить заголовок на конкретной странице в WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Чтобы получить значение гет-запроса вы можете использовать функцию get_query_var(). Например, вы можете использовать эту функцию в фильтре the_title

    if ( ! function_exists( 'the_title_callback' ) ) {
    
    	/**
    	 * Function for 'the_title' filter-hook.
    	 * 
    	 * @param string $post_title The post title.
    	 * @param int    $post_id    The post ID.
    	 *
    	 * @return string
    	 */
    	function the_title_callback( $post_title, $post_id ) {
    
    		$city = get_query_var( 'location_location1', false );
    
    		if ( $city && get_converter_cities( $city ) ) {
    			$post_title = $post_title . ' ' . get_converter_cities( $city );
    		}
    
    		return $post_title;
    	}
    }
    add_filter( 'the_title', 'the_title_callback', 10, 2 );
    
    if ( ! function_exists( 'get_converter_cities' ) ) {
    
    	/**
    	 * Return string or array with city values.
    	 * 
    	 * @since 1.0.0
    	 *
    	 * @param string $control Key to get one value. Optional. Default null.
    	 *
    	 * @return string|array|false
    	 */
    	function get_converter_cities( $control = null ) {
    
    		// Sanitize string (just to be safe).
    		if ( ! is_null( $control ) ) {
    			$control = sanitize_title( $control );
    		}
    
    		// Main converter array.
    		$converter = array(
    			'abakan'  => __( 'Abakan', 'domain' ),
    			'moscow'  => __( 'Moscow', 'domain' ),
    			'saratov' => __( 'Saratov', 'domain' ),
    		);
    
    		$converter = apply_filters( 'get_converter_cities', $converter );
    
    		// Return controls.
    		if ( is_null( $control ) ) {
    			return $converter;
    		} elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) {
    			return false;
    		} else {
    			return $converter[ $control ];
    		}
    	}
    }
    Ответ написан
    6 комментариев
  • Как настроить перенаправление редирект?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Решение на php, в зависимости от структуры ссылок, возможно нужно доработать

    if ( ! function_exists( 'template_redirect_callback' ) ) {
    
    	/**
    	 * Function for 'template_redirect` action-hook.
    	 * 
    	 * @return void
    	 * 
    	 * @since 1.0.0
    	 */
    	function template_redirect_callback() {
    
    		global $wp;
    
    		if ( str_contains( $wp->request, 'zapchasty/' ) ) {
    
    			$new_url = str_replace( 'zapchasty/', '/spareparts/', $wp->request );
    
    			wp_safe_redirect( home_url( trailingslashit( $new_url )  ), 301 );
    		}
    	}
    }
    add_action( 'template_redirect', 'template_redirect_callback' );
    Ответ написан
    Комментировать
  • Woocommerce - использовать стандартные шаблоны или собирать новые через get_posts() и тд?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Лучше использовать вукомерсовские шаблоны, wc_get_products() или WC_Product_Query для запросов, так у вас меньше вероятность что-то сломать. И лучше смотреть код плагина и делать по аналогии
    Ответ написан
    Комментировать
  • Как поменять лого в подвале и как изменить title?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    У нас есть сайт и мы хотим изменить подвал сайта


    По текстовому описанию вам никто не поможет. Смотрите документацию по теме, пишите тикет ее автору. Если тема бесплатная, проще посмотреть как все работает в файле footer.php

    хотя все настройки Yoast SEO выполнены правильно


    Если у вас были сначала один Заголовок и Описание, а потом вы их поменяли, то поисковому роботу нужно будет время, чтобы переобойти ваш сайт и изменить информацию о его страницах в своей базе данных

    Ускорить это можно отправив на переобход нужных страниц в панели управления Яндекс Вебмастер и Google Search Console

    Кроме этого, если у вас добавлена карта сайта в эти панели управления, то поможет пересохранение записи — изменится параметр date-modified по которому поисковики понимают, что запись была обновлена и нужно ее переобойти
    Ответ написан
    Комментировать
  • Как интегрировать ChatGPT в WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Да, на сайте есть документация по API https://platform.openai.com/docs/guides/gpt

    Вот пример запроса и работы функции. 100% работу не гарантирую, т.к. несколько раз переписывал функцию, а у них выходят новые модели и изменения в запросах API, поэтому вам нужно будет все проверить и сделать настройки передаваемых аргументов под конкретную задачу

    if ( ! function_exists( 'get_chatgpt_responce' ) ) {
    
    	/**
    	 * Returns query result or error
    	 *
    	 * @param string $question Text API question.
    	 * @param string $promt    Text API promt (for chat).
    	 * @param string $model    API model.
    	 * @param string $api_key  API key.
    	 *
    	 * @return void
    	 */
    	function get_chatgpt_responce( $question = null, $promt = null, $model = 'gpt-3.5-turbo', $api_key = 'sk-le000000000000000000000000000000000000' ) {
    
    		if ( is_null( $question ) ) {
    			return null;
    		}
    
    		$type = 'text';
    
    		if ( $model === 'davinci-codex' ) {
    			$type = 'codex';
    		}
    
    		if ( in_array( $model, array( 'gpt-4', 'gpt-4-0314', 'gpt-4-32k', 'gpt-4-32k-0314', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301' ), true ) ) {
    			$type = 'chat';
    		}
    
    		$headers = "Content-Type: application/json\r\n" . "Authorization: Bearer " . $api_key . "\r\n";
    
    		$params = array(
    			'model'       => $model,
    			'temperature' => 0.7,
    			'top_p'       => 1,
    		);
    
    		if ( $type === 'chat' ) {
    			$url         = 'https://api.openai.com/v1/chat/completions';
    			$params['n'] = 1;
    			if ( ! is_null( $promt ) ) {
    				$params['messages'][] = array(
    					'role'    => 'system',
    					'content' => $promt,
    				);
    			}
    			$params['messages'][] = array(
    				'role'    => 'user',
    				'content' => $question,
    			);
    		} elseif( $type === 'codex' ) {
    			$url                  = 'https://api.openai.com/v1/engines/davinci-codex/completions';
    			$params['prompt']     = $question;
    			$params['max_tokens'] = 4096 - iconv_strlen( $question );
    		} else {
    			$url                  = 'https://api.openai.com/v1/completions';
    			$params['prompt']     = $question;
    			$params['max_tokens'] = 4096 - iconv_strlen( $question );
    		}
    
    		$args = array(
    			'method'       => 'POST',
    			'timeout'      => 240,
    			'redirection'  => 5,
    			'httpversion'  => '1.0',
    			'blocking'     => true,
    			'headers'      => $headers,
    			'body'         => json_encode( $params ),
    			'sslverify'    => true,
    		);
    
    		$response = wp_remote_request( $url, $args );
    
    		if ( is_wp_error( $response ) ) {
    			$notification = $response->get_error_message();
    		} elseif ( in_array( wp_remote_retrieve_response_code( $response ), array( 400, 401, 403, 404 ), true ) ) {
    			$body         = json_decode( wp_remote_retrieve_body( $response ), true );
    			$notification = $body['error']['message'];
    		} elseif ( wp_remote_retrieve_response_code( $response ) === 200 ) {
    			$body         = json_decode( wp_remote_retrieve_body( $response ), true );
    			$notification = 'Расход GPT токенов: ' . $body['usage']['total_tokens'] . '. Причина остановки: ' . $body['choices'][0]['finish_reason'];
    
    			if ( $type === 'chat' ) {
    				return $body['choices'][0]['message']['content'];
    			} else {
    				return $body['choices'][0]['text'];
    			}
    		}
    
    		if ( function_exists( 'telegram_notification' ) ) {
    			telegram_notification( $notification );
    		}
    
    		return false;
    	}
    }
    
    $query   = 'Write a list frequently asked questions about the get_the_title() WordPress function.';
    $chatgpt = get_chatgpt_responce( $query );
    var_dump( $chatgpt );
    Ответ написан
    Комментировать
  • Как отобразить единицу измерения после цены товара Woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Потому что фильтр должен возвращать return, а не выводить echo

    add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 );
    
    function add_some_text_after_price ( $value ) {
    	$value = get_post_meta( get_the_ID(), '_edinica', true );
    
    	if ( empty( $value ) ) {
    		return;
    	}
    
    	return '<span>/ <span>' . esc_html( $value ) . '</span></span>';
    };
    Ответ написан
    1 комментарий
  • Как выводить в цикле wordpress несколько постов без дублирования?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    <?php
    
    $args = array(
    	'category'       => 4,
    	'orderby'        => 'date',
    	'posts_per_page' => 4,
    );
    
    $query = new WP_Query( $args );
    
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post(); ?>
    
    		<div class="col-md-3 col-sm-3 col-xs-12 off-pd line-item">
    			<div class="prod-card">
    
    				<?php $tags = get_the_tags(); ?>
    				<?php if ( $tags ) { ?>
    					<ul class="tag-list">
    						<?php foreach ( $tags as $key => $tag ) { ?>
    							<li class="tag-list__item">
    								<a href="<?php echo get_tag_link( $tag->term_id ); ?>" class="product-tag"></a>
    							</li>
    						<?php } ?>
    					</ul>
    				<?php } ?>
    
    				<img src="<?php the_post_thumbnail_url( 'medium' ); ?>" class="product-img img-responsive" ></a>
    				<div class="product-discr">
    					<p class="product-h"><a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a></p>
    					<?php if ( get_field( 'short_diskr_post' ) ): ?>
    						<p class="product-short"><?php the_field( 'short_diskr_post' ); ?></p>
    					<?php endif; ?>
    				</div>
    			</div>
    		</div>
    
    		<?php
    	}
    }
    
    wp_reset_postdata();
    
    ?>
    Ответ написан
  • Как добавить дополнительный класс хедеру на определенных страницах?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Посмотрите как работают функции WordPress body_class() и post_class(). По аналогии вы можете создать свою функцию header_class() с нужными вам условиями, пример:

    if ( ! function_exists( 'get_header_class' ) ) {
    
    	/**
    	 * Get classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 *
    	 * @return array
    	 */
    	function get_header_class( $class = '' ) {
    
    		// Add elements to array.
    		$classes   = array();
    		$classes[] = 'header';
    
    		if ( has_custom_header() ) {
    			$classes[] = 'header_background-image';
    		}
    
    		if ( is_admin_bar_showing() ) {
    			$classes[] = 'is_wpadminbar';
    		}
    
    		if ( is_category( 'example' ) ) {
    			$classes[] = 'header_example';
    		}
    
    		// Check the function has accepted any classes.
    		if ( isset( $class ) && ! empty( $class ) ) {
    			if ( is_array( $class ) ) {
    				$classes = array_merge( $classes, $class );
    			} elseif ( is_string( $class ) ) {
    				$classes = array_merge( $classes, explode( ' ', $class ) );
    			}
    		}
    
    		$classes = apply_filters( 'get_header_class', $classes );
    		$classes = array_unique( (array) $classes );
    
    		return $classes;
    	}
    }
    
    if ( ! function_exists( 'header_class' ) ) {
    
    	/**
    	 * Display classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 * @param bool   $echo  Echo or return header classes.
    	 *
    	 * @return string|void
    	 */
    	function header_class( $class = '', $echo = true ) {
    
    		$classes = get_header_class( $class );
    
    		if ( $echo ) {
    			echo 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		} else {
    			return 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		}
    	}
    }


    Использование:

    <header id="header" <?php header_class(); ?> aria-label="<?php _ex( 'Site header', 'aria-label', 'themename' ); ?>">
    	<!-- ... -->
    </header>
    Ответ написан
    Комментировать
  • Как сформировать безопасный запрос к базе WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $args = array(
    	'posts_per_page' => -1,
    	'post_type'      => array( 'post', 'page', 'movie', 'book' ),
    	's'              => 'search phrase',
    );
    
    $query = new WP_Query( $args );
    Ответ написан
  • Как вывести количество записей в категории?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    global $wp_query;
    echo $wp_query->found_posts;
    Ответ написан
    Комментировать
  • Как создать свои переменные для мета тегов в плагине YOAST?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function get_yoast_brand() {
    
    	$string = '';
    
    	if ( is_single() ) {
    		$string = get_post_meta( get_the_ID(), '_brand', true ) ?? __( 'Default Brand', 'textdomain' );
    	}
    
    	return $string;
    }
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%Brand%%', 'get_yoast_brand', 'advanced', __( 'Description of this field', 'textdomain' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );
    Ответ написан
  • Как изменить контент на сайте, который загрузил на хостинг?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Если вы купите шаред-хостинг, то WordPress, Joomla, Drupal и некоторые другие CMS вы можете установить в пару кликов, особенные знания программирования для этого не нужны

    В репозитории WordPress 5000+ бесплатных тем

    648b5ba1f2069911504883.png

    Тема отвечает за визуальное оформление сайта, но контент вам придется создавать самостоятельно. Для более специализированных платных тем есть themeforest.net или вы можете заказать разработку на фрилансе. Возможно, что для вашей задачи подойдет больше Tilda, лендинги на ней получаются относительно неплохо
    Ответ написан
    Комментировать
  • Какие сейчас CMS или движки для документации используют?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    По WordPress есть https://themeforest.net/category/wordpress?term=do..., тем по вашему запросу довольно много, может быть у вас есть более конкретные требования?
    Ответ написан
  • Поменять сортировку записей в RSS-ленте wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function add_new_post_types_to_feed( $query ) {
    	if ( $query->is_feed ) {
    		$query->set( 'orderby', 'modified' );
    	}
    }
    add_filter( 'pre_get_posts', 'add_new_post_types_to_feed' );
    Ответ написан
    Комментировать