Как вывести список городов и областей на WordPress?

Ссылка скопирована
1 ответ

Как вывести список городов (без привязки к айпи и тд) являющихся ссылками на виртуальную страницу в которой будет текст с шорткодом города и в зависимости от того на какой ссылке находимся отображать вместо шорткода город.
Как пример нужно в точности как сделано тут https://oceninasledstvo.ru/russia/

Дополнительно:

Ответы:

Для начала вам понадобится простая функция конвертации городов, а так же зарегистрировать гет-параметр на фильтре 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' );

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>';

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 );

$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' );

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' );

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

Как вывести список городов и областей на WordPress?

  • а где это всё делать? я пхп почти не знаю, надо чтобы я мог в тексте вставить шорткод и получить список городов, а так же на странице на которую попали через ссылку города так же в тексте подставить шорткод города в нужных местах, чтобы он вывелся со склонениями, есть вариант это как плагин найти?
  • eeeman1, если php не знаете, стоит делать на фрилансе. Про плагины не подскажу, не знаю
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Frontend-редакция Ответ

Если нужно вывести города и области на WordPress, сначала решите, это реальные SEO-страницы или просто динамические подстановки. Если городов сотни или тысячи, создавать под каждый обычную страницу вручную неудобно и часто вредно: появится много тонких дублей.

Нормальная архитектура: хранить города в отдельной таблице, CPT или таксономии, а URL обрабатывать через rewrite rule. Например:

/city/moskva/
/city/sankt-peterburg/
/region/moskovskaya-oblast/

/city/moskva/ /city/sankt-peterburg/ /region/moskovskaya-oblast/

Для виртуальных страниц добавляется query var:

add_action('init', function () {
    add_rewrite_rule('^city/([^/]+)/?$', 'index.php?site_city=$matches[1]', 'top');
});
 
add_filter('query_vars', function ($vars) {
    $vars[] = 'site_city';
    return $vars;
});

add_action('init', function () { add_rewrite_rule('^city/([^/]+)/?$', 'index.php?site_city=$matches[1]', 'top'); }); add_filter('query_vars', function ($vars) { $vars[] = 'site_city'; return $vars; });

Дальше в шаблоне берёте get_query_var('site_city'), находите город в справочнике и выводите нужные данные. Shortcode может подставлять название города в тексте, но не должен сам решать всю маршрутизацию.

Если страницы нужны для SEO, у каждой должен быть уникальный title, description, H1, текст, canonical и место в sitemap. Если это просто справочник, можно закрыть от индексации лишние комбинации.

Для списка городов на странице используйте группировку по областям и кэширование. Не делайте тяжёлый запрос на каждую загрузку страницы, особенно если справочник большой.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно