Получение URL текущей страницы или текущего PHP-файла является довольно частой задачей. Нередко с ней сталкиваются и при работе с WordPress. К примеру, она может возникнуть, когда вы подключаете плагин к теме или используете PHP-компилятор LESS. Существует некоторые простые способы решения этой задачи, однако я обнаружил, что подходят они далеко не всегда. В этой статье я постараюсь предложить вам лучший, на мой взгляд, подход.
Давайте взглянем на существующие методы прежде, чем приступать к окончательному решению:
1. Получаем URL текущего файла по методу Константина Ковшенина.
Метод получения URL подробно раскрыт в блоге автора. Он использует $wp->request и $wp->query_string для получения текущего URL страницы во фронт-энде:
global $wp; $current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) );
Этого метода вполне достаточно, если вам нужен только URL текущей страницы и только во фронт-энде. Он не поможет вам, если вы хотите получить URL файла плагина.
2. Получаем URL текущего файла – стандартный подход.
Техника, представленная ниже, описана на многочисленных сайтах в сети:
$pageURL = @$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://'; if ( $_SERVER['SERVER_PORT'] != '80' ) $pageURL .= $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI']; else $pageURL .= $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; return $pageURL;
Она прекрасно работает. Логика здесь подобна первому методу: техника основана на REQUEST_URI и имени сервера.
Однако у данной техники имеется одно неудобство: метод работает только с текущим запрашиваемым PHP-файлом. Он перестает работать, если вы хотите получить URL плагина WordPress (возможно, что вы никогда не будете обращаться к PHP-файлу плагина напрямую, верно?)
3. Заменяем WP_CONTENT_DIR на WP_CONTENT_URL
Логика проста: все наши PHP-файлы находятся в папке wp-content, потому замена WP_CONTENT_DIR на WP_CONTENT_URL может помочь нам получить корректный URL:
$file = __FILE__; // Current PHP file, but can be anyone $link = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $file );
Конечно, это очень простое решение, и работает оно в большинстве случаев. Две переменные WP_CONTENT_DIR и WP_CONTENT_URL инициализируются при загрузке WordPress. Нам не нужно заботиться о пути к серверу, запросах к серверу, списках запросов в первом и втором методе. Это простой и безопасный метод.
Однако данный метод имеет две проблемы.
В среде Windows в результате непоследовательного использования обратного слэша и левого слэша в путях WordPress функция возвращает неверный URL.
Тестовый код:
add_action( 'init', '_test_url' ); function _test_url() { $file = __FILE__; $url = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $file ); echo '<pre>', '__FILE__ : ' . $file . '<br>', 'WP_CONTENT_DIR: ' . WP_CONTENT_DIR . '<br>', 'WP_CONTENT_URL: ' . WP_CONTENT_URL . '<br>', 'URL : ' . $url . '<br>', '</pre>' ; die; }
Результат:
__FILE__ : D:\Dropbox\UniServer\www\wp\wp-content\mu-plugins\test.php WP_CONTENT_DIR: D:\Dropbox\UniServer\www\wp/wp-content WP_CONTENT_URL: http://localhost:8080/wp/wp-content URL : D:\Dropbox\UniServer\www\wp\wp-content\mu-plugins\test.php
Вторая проблема касается среды мультисайтов с установленным плагином Domain Mapping. Поскольку константа WP_CONTENT_URL определена через функцию get_option( ‘siteurl’ ), вы получите некорректный URL-адрес к папке wp-content для подсайта.
Предположим, что у нас имеется мультисайт с основным доменом test.com и подсайт с доменом exam.com. Если мы запустим тот же самый тестовый код, что и выше, то увидим следующие результаты:
Для основного сайта (корректный URL):
__FILE__ : /var/var/www/testuser/www/test.com/wp-content/mu-plugins/test.php WP_CONTENT_DIR: /var/var/www/testuser/www/test.com/wp-content WP_CONTENT_URL: http://test.com/wp-content URL : http://test.com/wp-content/mu-plugins/test.php
Для подсайта (некорректный URL):
__FILE__ : /var/var/www/testuser/www/test.com/wp-content/mu-plugins/test.php WP_CONTENT_DIR: /var/var/www/testuser/www/test.com/wp-content WP_CONTENT_URL: http://test.com/exam/wp-content URL : http://test.com/exam/wp-content/mu-plugins/test.php
4. Заключительное работающее решение.
Если вы запускаете свой сайт в среде Linux и не используете мультисайты, вы можете использовать третий метод. Он короткий, и прекрасно работает.
Однако если вам требуется универсальное решение, которое будет работать во всех ситуациях, то давайте посмотрим на четвертый метод.
$file = __FILE__; // Get correct URL and path to wp-content $content_url = untrailingslashit( dirname( dirname( get_stylesheet_uri() ) ) ); $content_dir = untrailingslashit( dirname( dirname( get_stylesheet_directory() ) ) ); // Fix path on Windows $file = str_replace( '\\', '/', $file ); $content_dir = str_replace( '\\', '/', $content_dir ); $url = str_replace( $content_dir, $content_url, $file );
Он представляет собой усовершенствованный третий метод – в нем учтены два упомянутых выше фикса.
Источник: www.deluxeblogtips.com