Получить пермалинк без домена (относительный пермалинк)
Вот код, который я использую:
<?php echo str_replace( home_url(), '', get_permalink($post->ID) ); ?>
Этот код выводит пермалинк как относительный URL, то есть только часть пути. Например, если пермалинк выглядит как http://example.com/2012/01/post-title/
, относительный URL, выведенный кодом, будет выглядеть как /2012/01/post-title/
.
Проблема: Для всех Записей и Страниц показывается правильный пермалинк, что хорошо. Но все остальные страницы (включая Главную, Поиск и Архивы) показывают относительный URL первой записи, а не соответствующих страниц. Есть идеи, почему? Что я делаю неправильно?
Ссылка: Получить пермалинк страницы без wpurl
РЕДАКТИРОВАНИЕ: Вот что еще я пробовал:
В functions.php
function get_relative_permalink( $url ) {
$url = get_permalink();
return str_replace( home_url(), "", $url );
}
В header.php
<link rel="alternate" hreflang="en-IN" href="http://in.example.com/<?php echo get_relative_permalink(); ?>" />
Та же проблема и с этим вариантом. Но этот еще показывает малоинформативную ошибку.

Нет необходимости использовать str_replace или preg_replace, просто передайте постоянную ссылку в wp_make_link_relative().
Встроенная функция гораздо проще и также аккуратно обрабатывает завершающие слэши, ситуации, когда home_url и site_url отличаются, и различные другие крайние случаи.

Используйте $_SERVER['REQUEST_URI']
вместо get_permalink()
для получения текущего URL. get_permalink
вернет полный адрес текущей записи, а не адрес посещенного URL.
Например, для example.com/test/page echo $_SERVER['REQUEST_URI'];
выведет /test/page
Обратите внимание, что это не включает хэштег, так как эта часть никогда не отправляется на сервер, а также не включает параметры типа ?foo=bar
— они находятся в массиве $_GET
.

Работает идеально!!! Небольшая поправка — во втором коде не хватает кавычки. echo $_SERVER['REQUEST_URI'];
— и спасибо!

@TomJNowell Если я не ошибаюсь, $_SERVER['REQUEST_URI'] вернёт вам текущий URL, что может быть проблемой, если это постраничный пост, то есть /test/page/2 будет получен, тогда как использование get_permalink() было бы решением этой проблемы. Я правильно понимаю?

Что похоже на изначальную проблему автора, мне нужно будет провести тесты, но вы всегда можете добавить свой ответ, и если он сработает, я проголосую за него =]

Почему этот ответ был принят? Он даже отдалённо не отвечает на вопрос автора!

@JimMaguire это определённо связано с тем, о чём спрашивал автор, однако отвечающий забыл упомянуть, что возвращается практически ВСЁ после домена вплоть до хэша (который по дизайну не отправляется на сервер). Так что это лишь отправная точка, не окончательное решение.

Получить почти окончательное решение: а) разбить строку с помощью explode()
по ?
и оставить только первую часть [0]
, чтобы удалить возможные GET-параметры б) выполнить замену через регулярное выражение (preg_replace()
), чтобы удалить возможные "красивые параметры URL", чаще всего page/N/
- номер страницы и другие возможные параметры могут меняться, поэтому regexp... например, preg_replace( '/\/page\/\d+\//', '/', $url )
