Как получить URL текущей страницы?

56

Я хочу добавить пользовательский код PHP, чтобы всякий раз, когда страница моего сайта загружалась в моем браузере, URL-адрес этой страницы отображался на экране. Я могу использовать echo get_permalink(), но это не работает на всех страницах. Некоторые страницы (например, моя домашняя страница ) отображают несколько сообщений, и если я использую get_permalink()на этих страницах, URL отображаемой страницы не возвращается (я считаю, что он возвращает URL последнего сообщения в цикле). Для этих страниц, как я могу вернуть URL?

Могу ли я прикрепить get_permalink()к определенному хуку, который срабатывает до выполнения цикла? Или я могу как-то вырваться из цикла, или сбросить его после завершения?

Благодарю.

cag8f
источник
Можете ли вы предоставить некоторый контекст относительно того, что вы хотели бы сделать с этим URL? Вы пытаетесь создать общие URL? Собирать пользовательские URL для ссылок / действий?
Том Дж. Новелл
@ TomJNowell Я хотел бы поставить в очередь определенный JS-скрипт, но только на определенных страницах (в данном случае эти страницы являются домашней страницей моего сайта на разных языках: example.com , example.com/fr , example.com/es , и т.д). Файл JS будет содержать сервер для добавления гиперссылок к нескольким заголовкам, которые появляются только на главной странице.
cag8f
почему бы просто не использовать is_home()или и is_page( 'fr' )т. д. и ставить скрипт в очередь, только если он верный?
Том Дж. Новелл
@ TomJNowell Ну, теперь мой код: if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Это, кажется, срабатывает на каждой домашней странице, независимо от языка. Это то, что вы предлагали?
cag8f
Почему бы не использовать $_SERVER['REQUEST_URI']и компанию? Смотрите этот вопрос: stackoverflow.com/q/6768793/247696
Flimm

Ответы:

88

get_permalink() действительно полезно только для отдельных страниц и постов, и работает только внутри цикла.

Самый простой способ, который я видел, это:

global $wp;
echo home_url( $wp->request )

$wp->requestвключает в себя часть пути URL, например. /path/to/pageи home_url()выводит URL в Настройки> Общие, но вы можете добавить к нему путь, поэтому мы добавляем путь запроса к домашнему URL в этом коде.

Обратите внимание, что это, вероятно, не будет работать с постоянными ссылками, установленными на Plain, и исключит строки запроса ( ?foo=barчасть URL).

Чтобы получить URL-адрес, когда постоянные ссылки заданы как обычные, вы можете использовать его $wp->query_vars, передав его add_query_arg():

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );

И вы можете объединить эти два метода, чтобы получить текущий URL, включая строку запроса, независимо от настроек постоянной ссылки:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
Джейкоб Питти
источник
7
Если Permalinks установлен на равнине: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Макс Юдин
1
@Jacob Я пытался это сделать, но, похоже, он возвращает только URL моей домашней страницы. Как вы можете видеть в левом верхнем углу на этой странице ( dev.horizonhomes-samui.com/properties/hs0540 ), куда я вставил код echo home_url( $wp->request ). Я обеспечил, чтобы включить global $wpтакже. Постоянные ссылки не являются «Обычными», но имеют значение «Имя публикации». Я также не вижу соответствующих ошибок PHP в журнале. Эта конкретная страница является частью моего сайта разработчика, который в противном случае заблокирован для посетителей. Я не уверен, имеет ли это значение или нет. редактировать: на самом деле, держите эту мысль - может быть ошибка пользователя.
Ожидание
@Jacob edit 2: ОК, ваш код действительно работает. Моя проблема заключалась в том, что я включал код в functions.php «голым», то есть не в какую-либо функцию, прикрепленную к хуку. Таким образом, ваш код возвращал URL домашней страницы, независимо от страницы, которая отображалась в моем браузере. Как только я переместил код в функцию - функцию, прикрепленную к хуку WP (wp_enqueue_scripts), он действительно вернул URL отображаемой страницы. Вы знаете причину такого поведения? Может быть, мне нужно создать новый вопрос для этого.
cag8f
3
@ cag8f Если код хранится «голым» в functions.php, вы запускаете его до того, как все свойства объекта $ wp были установлены. Когда вы заключаете его в функцию, присоединенную к соответствующему хуку, вы задерживаете его выполнение до тех пор, пока не будет запущена подходящая точка в коде Wordpress.
Энди Маколей-Брук,
Все эти методы потрясающие и отличные идеи для работы с WordPress. Вы можете добавить trailingslashit()к ним, хотя, в зависимости от ваших потребностей.
Джейк
8

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

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));

Это покажет полный путь, включая параметры запроса.

rescue1155
источник
Привет - если вы загляните на developer.wordpress.org/reference/functions/add_query_arg, вы увидите, что ваш код фактически не сохраняет существующие параметры запроса.
Энди Маколей-Брук
2
Чтобы сохранить параметры запроса, вам нужно заменить пустой array()на $_GET. то есть:home_url(add_query_arg($_GET,$wp->request));
Брэд Адамс
Это не будет работать, если WordPress установлен в подкаталоге
ManzoorWani
1
function current_location()
{
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

echo current_location();
Шри Стхапит
источник
Можете ли вы объяснить, как и почему этот код решает вопрос?
Керо
На мой взгляд самое гибкое решение. Он работает на любой странице WP (даже на wp-admin, wp-login.php, страницах архивов и т. Д.). Просто обратите внимание, что он не содержит URL-параметров
Филипп
1

Следующий код даст текущий URL:

global $wp;
echo home_url($wp->request)

Вы можете использовать приведенный ниже код, чтобы получить полный URL вместе с параметрами запроса.

global $wp;  
$current_url = home_url(add_query_arg(array($_GET), $wp->request));

Это покажет полный путь, включая параметры запроса. Это сохранит параметры запроса, если они уже есть в URL.

Адия Тадикамалла
источник
Этот фрагмент пропускает wp-admin/plugins.phpмой текущий URL, это только корневой путь и строки запроса.
Рышард Йендрашик
0

Это улучшенный способ примера, который упоминался ранее. Он работает, когда включены красивые URL, однако он отбрасывает, если есть какой-либо параметр запроса, такой как / page-slug /? Param = 1, или если URL вообще безобразен.

Следующий пример будет работать в обоих случаях.

    $query_args = array();

    $query = wp_parse_url( $YOUR_URL );

    $permalink = get_option( 'permalink_structure' );

    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    echo home_url( add_query_arg( $query_args , $wp->request ) )
tolginho
источник
0

Может быть, wp_guess_url()это то, что вам нужно. Доступно с версии 2.6.0.

поток
источник
Это только угадывает базовый URL. На внешнем интерфейсе вы получите эффект, аналогичный home_url().
Джейк
0

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

get_permalink(get_the_ID());
Дарио Задро
источник