Функция ADD_QUERY_ARG() │ WP 1.5.0
Функция add_query_arg() позволяет изменить строку запроса URL, добавляя к ней параметры.
Как использовать функцию
Существует два способа использования этой функции: передача единственного ключа и значения, либо массив ассоциативных данных (ключ-значение).
Использование единственного ключа и значения:
add_query_arg( 'key', 'value', 'http://example.com' );
Использование ассоциативного массива:
add_query_arg( array(
'key1' => 'value1',
'key2' => 'value2',
), 'http://example.com' );
Если не указать URL, функция использует текущий URL на странице (значение $_SERVER['REQUEST_URI']).
Кодирование значений
Значения параметров должны быть корректно закодированы с помощью функций urlencode() или rawurlencode().
Важно: Если значение какого-либо параметра равно false, этот параметр будет удалён. Для этого используйте функцию remove_query_arg().
Важные замечания
Результат работы add_query_arg() не экранирован по умолчанию. Чтобы избежать уязвимостей, связанных с атаками на сайты (XSS), вывод должен быть безопасно экранирован с помощью esc_url() или аналогичных функций.
Использование функции
add_query_arg( ...$args );
...$args(обязательный параметр) — вы можете передать как массив, так и парные значения.
Примеры использования
Пример 1: Перенаправление пользователя на страницу плагина
// Перенаправление на страницу приветствия.
$redirect_url = add_query_arg( array( 'page' => 'your_plugin_page' ), admin_url( 'plugins.php' ) );
wp_safe_redirect( $redirect_url );
exit;
Пример 2: Добавление параметров к указанному URL
echo add_query_arg( 'hello', 'world', 'http://blog.example.com/2009/04/16/' );
echo add_query_arg( array('hello' => 'world'), 'http://blog.example.com/2009/04/16/' );
// Оба примера вернут: http://blog.example.com/2009/04/16/?hello=world
Пример 3: Добавление параметров к текущему URL
// Предположим, что мы находимся на http://example.com/client/?s=word.
echo esc_url( add_query_arg( 'foo', 'bar' ) );
// Вернет: /client/?s=word&foo=bar
$arr_params = array( 'foo' => 'bar', 'baz' => 'tiny' );
echo esc_url( add_query_arg( $arr_params ) );
// Вернет: /client/?s=word&foo=bar&baz=tiny
Примечание: Если не указан конкретный URL для добавления параметров, обязательно используйте esc_url() перед выводом на экран. Это необходимо, так как параметры запроса могут добавляться пользователем произвольным образом.
Пример 4: Добавление параметра к URL поста
echo add_query_arg( 'hello', 'there', get_permalink(9) );
// Получаем: http://example.com/post-name?hello=there
Пример 5: Удаление параметра запроса из URL
$url = 'http://example.com/asd?key=val&key1=val1';
echo esc_url( add_query_arg( [ 'key'=>null ], $url ) );
// Вернет: http://example.com/asd?key1=val1
Пример 6: Разные способы задания параметров
// Можно добавить параметр к текущему URL так:
$url = add_query_arg( 'foo' );
// Или установить его значение:
$url = add_query_arg( 'foo', 'bar' );
// Или так:
$url = add_query_arg( array('foo'=>'bar') );
// Указываем, для какого URL это делается:
$url = add_query_arg( 'foo', 'bar', $URL );
// Или так:
$url = add_query_arg( array('foo'=>'bar'), $URL );
Изменения
- С версии 1.5.0 функция была введена.
- С версии 5.3.0 формализованы уже существующие и задокументированные параметры с добавлением
...$argsв сигнатуру функции.
Код функции ADD_QUERY_ARG()
function add_query_arg( ...$args ) {
if ( is_array( $args[0] ) ) {
if ( count( $args ) < 2 || false === $args[1] ) {
$uri = $_SERVER['REQUEST_URI'];
} else {
$uri = $args[1];
}
} else {
if ( count( $args ) < 3 || false === $args[2] ) {
$uri = $_SERVER['REQUEST_URI'];
} else {
$uri = $args[2];
}
}
$frag = strstr( $uri, '#' );
if ( $frag ) {
$uri = substr( $uri, 0, -strlen( $frag ) );
} else {
$frag = '';
}
if ( 0 === stripos( $uri, 'http://' ) ) {
$protocol = 'http://';
$uri = substr( $uri, 7 );
} elseif ( 0 === stripos( $uri, 'https://' ) ) {
$protocol = 'https://';
$uri = substr( $uri, 8 );
} else {
$protocol = '';
}
if ( str_contains( $uri, '?' ) ) {
list( $base, $query ) = explode( '?', $uri, 2 );
$base .= '?';
} elseif ( $protocol || ! str_contains( $uri, '=' ) ) {
$base = $uri . '?';
$query = '';
} else {
$base = '';
$query = $uri;
}
wp_parse_str( $query, $qs );
$qs = urlencode_deep( $qs ); // Пере-кодирует данные, которые уже есть в строке запроса.
if ( is_array( $args[0] ) ) {
foreach ( $args[0] as $k => $v ) {
$qs[ $k ] = $v;
}
} else {
$qs[ $args[0] ] = $args[1];
}
foreach ( $qs as $k => $v ) {
if ( false === $v ) {
unset( $qs[ $k ] );
}
}
$ret = build_query( $qs );
$ret = trim( $ret, '?' );
$ret = preg_replace( '#=(&|$)#', '$1', $ret );
$ret = $protocol . $base . $ret . $frag;
$ret = rtrim( $ret, '?' );
$ret = str_replace( '?#', '#', $ret );
return $ret;
}
Теперь вы знаете, как использовать функцию add_query_arg() и как управлять параметрами URL на вашем сайте WordPress!