Чтение значения параметра из URL

Получить из URL значение конкретного параметра

Предположим, что адрес текущей страницы имеет вид http://site.ru/?p=1&s=2 и мы хотим получить значение параметра p. Проще всего сделать это так:

Скопировано
echo $_GET['p'];
Показать код

Получить из URL все пары параметр-значение

Скопировано
foreach( $_GET as $key => $value ) {
echo $key . ' = ' . $value . '<br>';
}
Показать код

Если адрес текущей страницы имеет вид http://site.ru/?p=1&s=2, то код выведет следующее:

p = 1
s = 2

Если надо получить параметры из URL в виде переменной, то можно использовать функцию parse_url:

Скопировано
$url = 'http://site.ru/?p=1&s=2';
$parts = parse_url( $url );
parse_str( $parts['query'], $query );
Показать код

В результате переменная $query будет содержать такой массив:

Array (
  [p] => 1
  [s] => 2
)

 

Если параметры в URL имеют одинаковое название

Допустим URL имеет такой вид https://site.ru/?cat=15&cat=2 и надо прочитать из него все значения для параметра cat. Способы, описанные выше, вернут только последнее значение этого параметра.

Ниже показано, как правильно извлечь параметры из такого URL при обычном или Ajax-запросе.

Скопировано
if( wp_doing_ajax() ) {		// если это Ajax-запрос
	$url = $_POST['url'];
	$query_string = parse_url( $url, PHP_URL_QUERY );
	$params = proper_parse_str( urldecode( $query_string ) );
} else {					// если это не Ajax-запрос
	$params = '';
	if( $_SERVER['QUERY_STRING'] ) $params = proper_parse_str( urldecode( $_SERVER['QUERY_STRING'] ) );
}

function proper_parse_str( $str ) {
	$arr = [];
	$pairs = explode( '&', $str );
	foreach( $pairs as $i ) {
		list( $name, $value ) = explode( '=', $i, 2 );
		if( isset( $arr[$name] ) ) {
			if( is_array( $arr[$name] ) ) {
				$arr[$name][] = $value;
			}
			else {
				$arr[$name] = [ $arr[$name], $value ];
			}
		}
		else {
			$arr[$name] = $value;
		}
	}
	return $arr;
}
Показать код

На что следует обратить внимание:

  • проверка на Ajax-запрос идет с помощью ВП-функции wp_doing_ajax();
  • при Ajax-запросе предполагается, что URL передается как один из его параметров.

В результате переменная $params будет содержать такой массив параметров:

Array (
  [cat] => Array (
    [0] => 15
    [1] => 2
  )
)