Кто то из вас, сразу же может возразить и вспомнить про функцию get_permalink(), ведь она как раз и выводит ссылку на текущую запись. Да вы правы, но в том и дело что она выводит только ссылку на запись, то бишь статью. Данная функция работает только внутри цикла записи, а значить страницы рубрики, главная, теги, архивы и тд отпадают. Нам же надо универсальная функция. Недавно я вновь столкнулся с этим вопросом, конечно же у меня были наработки, но хотелось проверить, есть ли новое решение этой задачи. Ниже я опишу все способы что я нашел, хороши ли они и каким пользуюсь я.
Проведя несколько часов в поисках и изучив данный вопрос повторно, оказалось что ничего так и не поменялось. Общего, наилучшего решения так и не было. Поэтому представляю вам то, что я нашел и мне понравилось. Начнем и с самого распространенного и довольно простого способа.
Способ №1 $_SERVER
В то место где должна появится ссылка в виде текста, просто добавьте такой код:
<?php echo bloginfo( 'url' ); echo $_SERVER['REQUEST_URI']; ?>
Он рассчитан на добавление в среду HTML, если же у вас PHP, то удалите теги PHP <?php ... ?>. Суть данного метода очень проста. Сначала мы вызываем функцию bloginfo, с параметром url - она выведет домен вашего сайта. Далее мы просто выводим массив $_SERVER, который и выводит остальной путь но без домена. В сумме эти два элемента и образовывают ссылку на текущую страницу.
Данный метод довольно прост, но используя его я обнаружил один момент, который заставил отказаться от этого способа. Если вы примените его на обычном сайте, то есть его домен будет http://site.com/ то все хорошо, но если, например у вас будет какой-то сайт, который будет расположен в папке расположенной на этом домене, то бишь путь будет, например http://site.com/sub/ то данный метод начнет ломать путь, потому как массиву $_SERVER все равно и он выводит путь исключая только домен, но не остальной путь. В итоге если ваш настоящий путь будет таким - http://site.com/sub/page.html, то данный способ выведет ссылку так - http://site.com/sub/sub/page.html. Думаю, вы поняли что в пути присутствует дублирование папки. В итоге если вы расположите какой-то тестовый сайт или еще что и попытаетесь воспользоваться данным методом, он вас подведет. Если это вам не помеха, то данный способ отлично подойдет.
Способ №2 функция
Второй способ, который мне понравился и я не нашел в нем явных проблем, это использование одной небольшой функции. Его суть проста, вам надо добавить код в файл пользовательских функций - function.php. Если не знакомы с этим файлом и не разбираетесь в его коде, то добавляете в самый конец перед закрывающим тегом PHP ?>. Если его нет, то просто в самый конец.
Перед изменением function.php, обязательно сохраните его копию, чтобы в дальнейшем, в случаи ошибки, вернуть все как было.
function page_current_url() { $current_url = 'http'; $server_https = $_SERVER["HTTPS"]; $server_name = $_SERVER["SERVER_NAME"]; $server_port = $_SERVER["SERVER_PORT"]; $request_uri = $_SERVER["REQUEST_URI"]; if ($server_https == "on") $current_url .= "s"; $current_url .= "://"; if ($server_port != "80") $current_url .= $server_name . ":" . $server_port . $request_uri; else $current_url .= $server_name . $request_uri; return $current_url; }
Далее в том месте где хотите увидеть ссылку в виде текста, просто вызовите функцию page_current_url(). Делается это так:
<?php echo page_current_url(); ?>
Способ рабочий, по своему интересный. Требует немного больше движений, но вполне заслуживает право на жизнь. Использовать ли его - решать вам.
Способ №3 add_query_arg
Данный способ очень часто встречается на просторах интернета, но я так и не понял почему его используют, потому как у меня он выводил совсем не то что мне нужно. Это не странно ибо он работает именно так, как он задуман, возможно его создателю нужно было так.
Его суть проста, добавляется в нужное для вас место небольшой код:
<?php global $wp; $current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) ); echo $current_url; ?>
Сначала вызывается глобальная переменная, после создается новая переменная и выводится. Новая переменная задается функцией add_query_arg(). Данная функция добавляет заданные параметры GET запроса в текущий или указанный URL. В нашем случаи в текущий. Как вы понимаете тут есть текущая ссылка но к ней добавляется новый параметр запроса.
Предположим, ваша текущая страница имеет ссылку http://site.com/page_name.html, то данный метод выведет ссылку с запросом - http://site.com/page_name.html?name=page_name. Это не странно, потому как задан параметр - $wp->query_string. Его конечно же можно удалить, но тогда отпадает смысл в использовании add_query_arg(). Это меня и привело к тому, чтобы переделать данный метод и получить 4 способ.
Способ №4 home_url
Данный способ вытекает из предыдущего, будет он использовать функцию home_url() с указанием параметра. По умолчанию данная функция выводит ссылку на главную страницу. С доработками она выглядит так:
<?php global $wp; $current_url = home_url( $wp->request ); echo $current_url; ?>
Данная функция выведет ссылку на любую текущую страницу сайта на WordPress. Данную функцию часто использую и я. Проблем с ней не возникало ни разу, поэтому могу рекомендовать к использованию и ее.
Вот такими получились мои поиски ответа на важный вопрос. Надеюсь в будущем появится какой-то один способ, а вернее одна функция, которая одним вызовом будет выводить текущую ссылку и не заставлять вебмастеров танцевать с бубном.
На этом все, спасибо за внимание. 🙂