Получить пермалинк без домена (относительный пермалинк)

28 авг. 2012 г., 16:09:19
Просмотры: 48.4K
Голосов: 17

Вот код, который я использую:

<?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(); ?>" />

Та же проблема и с этим вариантом. Но этот еще показывает малоинформативную ошибку.

5
Комментарии

Где именно вы пытаетесь использовать этот код...?? Вы используете global $post перед вашим кодом?

Joshua Abenazer Joshua Abenazer
28 авг. 2012 г. 16:31:12

@JoshuaAbenazer Я использую код как есть в моем файле header.php — похоже, это неправильный способ. Я отредактирую свой вопрос, чтобы отразить другие попытки, чтобы вы могли помочь мне лучше.

its_me its_me
28 авг. 2012 г. 16:35:29

Можно спросить, зачем вам это нужно?

Tom J Nowell Tom J Nowell
28 авг. 2012 г. 16:37:36

@TomJNowell Привет. Мне нужно использовать другой домен для этой разметки: <link rel="alternate" hreflang="en-IN" href="http://in.example.com/2012/01/post-title/" /> — но фактический постоянный ссылка выглядит так: http://example.com/2012/01/post-title/. (Прочитав это, вы лучше поймете, что я делаю.)

its_me its_me
28 авг. 2012 г. 16:41:14

Если вы хотите пойти WP-путем, вы должны понимать, что get_permalink() предназначен для получения ссылок экземпляров класса WP_Post (записи, страницы, пользовательские типы записей и т.д.)... для архивов, меток и прочего — в общем, категорий — экземпляров класса WP_Term — используйте get_term_link(), для главной страницы — home_url().

jave.web jave.web
18 мар. 2018 г. 21:49:33
Все ответы на вопрос 3
4
17

Я использую

str_replace(home_url(), '', get_permalink());

Если корень сайта не /

1 нояб. 2013 г. 00:40:57
Комментарии

Нет, не работает, когда WP находится в подкаталоге...

Nabil Kadimi Nabil Kadimi
27 дек. 2014 г. 10:17:41

Что вы имеете в виду под "WP в подкаталоге"?

Jim Maguire Jim Maguire
26 июл. 2017 г. 04:53:17

@JimMaguire http://example.com/not-the-root-dir/

Walf Walf
8 нояб. 2017 г. 08:17:47

Нет необходимости использовать str_replace или preg_replace, просто передайте постоянную ссылку в wp_make_link_relative().

Встроенная функция гораздо проще и также аккуратно обрабатывает завершающие слэши, ситуации, когда home_url и site_url отличаются, и различные другие крайние случаи.

senectus senectus
19 нояб. 2021 г. 14:05:16
6
13

Используйте $_SERVER['REQUEST_URI'] вместо get_permalink() для получения текущего URL. get_permalink вернет полный адрес текущей записи, а не адрес посещенного URL.

Например, для example.com/test/page echo $_SERVER['REQUEST_URI']; выведет /test/page

Обратите внимание, что это не включает хэштег, так как эта часть никогда не отправляется на сервер, а также не включает параметры типа ?foo=bar — они находятся в массиве $_GET.

28 авг. 2012 г. 16:46:26
Комментарии

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

its_me its_me
28 авг. 2012 г. 16:51:42

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

Christine Cooper Christine Cooper
10 июн. 2014 г. 21:36:39

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

Tom J Nowell Tom J Nowell
10 июн. 2014 г. 23:34:07

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

Jim Maguire Jim Maguire
26 июл. 2017 г. 04:54:54

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

jave.web jave.web
18 мар. 2018 г. 21:59:49

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

jave.web jave.web
18 мар. 2018 г. 22:14:35
Показать остальные 1 комментариев
0

Это решение работает у меня:

function force_relative_url ($url)
{
    return preg_replace ('/^(http)?s?:?\/\/[^\/]*(\/?.*)$/i', '$2', '' . $url);
}

Для использования на постоянной ссылке:

$relative_permalink = force_relative_url (get_permalink ($post->ID));
22 апр. 2016 г. 18:05:07