Как получить URL любого PHP-файла в WordPress

Получение 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

Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.