Получить текущий URL страницы (включая пагинацию)

1 февр. 2013 г., 00:05:33
Просмотры: 75.8K
Голосов: 18

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

Я искал в документации, но не нашел то, что искал. (Даже get_pagenum_link() там не документирована.)

Я уже знаю о этой функции, но было бы здорово, если бы существовала "нативная" функция WordPress, которая выполняет эту задачу.

0
Все ответы на вопрос 8
1
37

В дополнение к ответу 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 сайта мультисайта, поэтому этого должно быть достаточно.

15 дек. 2013 г. 14:04:44
Комментарии

Обидно, что автор вопроса не выбрал этот ответ в качестве решения, хотя он именно таковым и является. Спасибо.

cfx cfx
9 авг. 2019 г. 19:05:43
1
global $wp;
$current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) );

Не функция, но определенно использует код WordPress..

http://kovshenin.com/2012/current-url-in-wordpress/

1 февр. 2013 г. 08:17:45
Комментарии

Это частично работает, но некоторые вещи работают не так, как я хочу: параметры, такие как year, добавляются в строку запроса, даже если их там не было раньше, а другие параметры, например replytocom, теряются. Вы знаете решение этой проблемы?

René René
1 февр. 2013 г. 15:32:56
0

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([]);
29 авг. 2016 г. 19:35:32
2

Для меня <?php esc_url(the_permalink()); ?> работает (на странице архива с пагинацией).

6 февр. 2017 г. 10:56:57
Комментарии

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

fuxia fuxia
6 февр. 2017 г. 11:38:37

Ты прав, это работало только из-за кэширования постоянных ссылок, я думаю.

herrfischer herrfischer
6 февр. 2017 г. 17:33:21
1

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.

2 февр. 2014 г. 22:49:58
Комментарии

Имейте в виду, что ни одна из этих функций недоступна в CLI и, следовательно, бесполезна для cron-заданий.

kaiser kaiser
26 февр. 2014 г. 13:38:11
2
-1

Я не знаю о пагинации, но Вы можете использовать эту функцию для получения 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 вне цикла.

1 февр. 2013 г. 07:55:02
Комментарии

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

René René
1 февр. 2013 г. 12:04:53

Этот ответ практически не относится к исходному вопросу. Он не дал правильного ответа и не предоставил действительно ценной информации по теме.

jounileander jounileander
4 июл. 2013 г. 11:22:21
1
-1

wp_guess_url — это то, что вам нужно.

Определяет URL сайта.

Удаляет ссылки на wp-admin, возвращая только URL-адреса вне директории wp-admin.

11 мар. 2013 г. 12:15:23
Комментарии

При попытке использования он возвращает совершенно другой URL, отличный от текущей страницы.

Kirby Kirby
19 мая 2015 г. 19:10:40
1
-2

Вы можете использовать функцию WordPress для получения URL текущей страницы:

the_permalink()

Эта функция вернет вам ссылку на текущую страницу.

26 февр. 2014 г. 12:15:51
Комментарии

Почти; the_permalink() будет выводить URL текущей записи. Но это не сработает для других запросов и не будет включать переменные, такие как пагинация. Так что это не совсем ответ, который ищет @René Schubert.

TheDeadMedic TheDeadMedic
26 февр. 2014 г. 13:10:24