Получить текущий URL страницы (включая пагинацию)
Существует ли функция WordPress для автоматического получения правильного URL текущей страницы?
То есть, если я просто открыл отдельный пост, функция возвращает то же самое, что и get_permalink()
, но если я нахожусь на странице с пагинацией (при пролистывании комментариев), функция возвращает то же самое, что сделала бы get_pagenum_link(get_query_var('paged'))
.
Я искал в документации, но не нашел то, что искал. (Даже get_pagenum_link()
там не документирована.)
Я уже знаю о этой функции, но было бы здорово, если бы существовала "нативная" функция WordPress, которая выполняет эту задачу.

В дополнение к ответу Rajeev Vyas, вам не нужно передавать никакие непустые параметры в add_query_arg()
. Следующий вариант всегда хорошо работал для меня:
// относительный текущий URI:
$current_rel_uri = add_query_arg( NULL, NULL );
// абсолютный текущий URI (на одиночном сайте):
$current_uri = home_url( add_query_arg( NULL, NULL ) );
Функция использует запасной вариант $_SERVER[ 'REQUEST_URI' ]
и применяет к нему urlencode_deep()
. См. https://github.com/WordPress/WordPress/blob/3.8/wp-includes/functions.php#L673
Редактирование:
Поскольку $_SERVER[ 'REQUEST_URI' ]
представляет собой нефильтрованный пользовательский ввод, всегда следует экранировать возвращаемое значение add_query_arg()
, когда контекст изменяется. Например, используйте esc_url_raw()
для работы с базой данных или esc_attr()
или esc_url()
для HTML.
Обновление
Приведённый пример, который должен создавать абсолютный URI (включающий схему и хост), не работает в мультисайте с подкаталогами, так как home_url()
возвращает полный URI, включая сегмент пути. Лучшим решением для кода, учитывающего мультисайт, будет следующее:
// абсолютный URI в среде, поддерживающей мультисайт
$parts = parse_url( home_url() );
$current_uri = "{$parts['scheme']}://{$parts['host']}" . add_query_arg( NULL, NULL );
Ядро WordPress не поддерживает порт, пользователя или пароль в URL сайта мультисайта, поэтому этого должно быть достаточно.

global $wp;
$current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) );
Не функция, но определенно использует код WordPress..

add_query_args( null, null )
создаст элемент массива с пустым ключом ($qs[""] = null
), хотя это не повлияет на результат.
Согласно add_query_arg() | Функция | Ресурсы для разработчиков WordPress, второй и третий параметры являются необязательными и могут быть опущены.
add_query_args( null, null )
можно сделать еще короче.
$current_url = add_query_args( [] );
Также существует самая короткая версия, хотя она не рекомендуется, так как первый параметр является обязательным.
$current_url = add_query_args();
Кроме того, обратите внимание, что и home_url( add_query_vars( [] ) )
, и home_url( add_query_arg( null, null ) )
могут не возвращать фактический URL, если WordPress установлен в подкаталоге.
Например, может быть возвращен https://example.com/wp/wp/foo
, если WordPress установлен в https://example.com/wp/
.
Обновление: 23.01.2017
Моя версия на основе решения Дэвида для получения абсолютного URL.
$parts = parse_url(home_url());
$uri = $parts['scheme'] . '://' . $parts['host'];
if (array_key_exists('port', $parts)) {
$uri .= ':' . $parts['port'];
}
$uri .= add_query_arg([]);

Невозможно. the_permalink()
выводит экранированную постоянную ссылку, она ничего не возвращает. Функция esc_url()
ничего не получает, а если бы получала, это был бы экранированный URL.

1) $_SERVER['REQUEST_URI']
- Возвращает URL, по которому был осуществлен доступ к исполняемому скрипту. Например, если для доступа к странице был введен адрес http://www.example.com/product.php?id=5
, то $_SERVER['REQUEST_URI']
вернет /product.php?id=5
.
2) $_SERVER['DOCUMENT_ROOT']
– Возвращает корневую директорию сервера, указанную в его конфигурационном файле. Обычно эта переменная содержит путь вида /usr/yoursite/www
в Linux и D:/xamps/xampp/htdocs
в Windows.
3) $_SERVER['HTTP_HOST']
– Возвращает имя хоста, указанное в HTTP-заголовке. Например, при обращении по адресу http://example.com
переменная вернет example.com
, а для http://www.example.com
вернет www.example.com
. Это особенно полезно при работе с сессиями во время онлайн-платежей, так как сессии для http://example.com
и http://www.example.com
считаются разными.
4) $_SERVER['HTTP_USER_AGENT']
- Возвращает информацию о браузере пользователя, который запрашивает страницу. Например, для определения Microsoft Internet Explorer можно использовать strpos($_SERVER["HTTP_USER_AGENT"],”MSIE”)
, а для Firefox — strpos($_SERVER["HTTP_USER_AGENT"],”Firefox”)
.
5) $_SERVER['PHP_SELF']
- Возвращает имя файла текущего исполняемого скрипта. Например, если страница запрашивается по адресу http://www.example.com/product.php?id=5
, то $_SERVER['PHP_SELF']
вернет /product.php
.
6) $_SERVER['QUERY_STRING']
– Возвращает строку запроса, если она использовалась для доступа к текущему скрипту. Строка запроса — это часть URL, следующая после знака «?». Например, при обращении по адресу http://www.example.com/index.php?id=5&page=product
функция вернет id=5&page=product
.
7) $_SERVER['REMOTE_ADDR']
– Возвращает IP-адрес клиента, запрашивающего страницу. Однако полностью полагаться на эту переменную нельзя, так как она может не всегда возвращать реальный IP-адрес пользователя. Подробнее о получении реального IP можно узнать в соответствующей статье.
8) $_SERVER['SCRIPT_FILENAME']
- Возвращает абсолютный путь к исполняемому файлу. В Linux путь может выглядеть как var/example.com/www/product.php
, а в Windows — как D:/xampp/xampp/htdocs/test/example.php
.

Я не знаю о пагинации, но Вы можете использовать эту функцию для получения URL в цикле:
<?php $ID = get_the_ID();
echo get_permalink( $ID ); ?>
Или, если вы не хотите использовать PHP, вы можете воспользоваться методом на jQuery (это поможет вам сделать это вне цикла):
$(document).ready(function () {
var vhref = $(location).attr('href');
var vTitle = $(this).attr('title');
$('#spnTitle').html('' + vTitle + '');
$('#spnURL').html('' + vhref + '');
});
Или, если вы предпочитаете использовать функцию PHP, вам нужно получить ID вне цикла.

Извините, но это совсем не то, о чём я просил... + the_permalink()
не требует указания ID, когда вызывается внутри цикла.

wp_guess_url — это то, что вам нужно.
Определяет URL сайта.
Удаляет ссылки на wp-admin, возвращая только URL-адреса вне директории wp-admin.
