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

Как вывести список городов (без привязки к айпи и тд) являющихся ссылками на виртуальную страницу в которой будет текст с шорткодом города и в зависимости от того на какой ссылке находимся отображать вместо шорткода город.
Как пример нужно в точности как сделано тут https://oceninasledstvo.ru/russia/
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 1
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
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы