Вопрос или проблема
Когда вы добавляете скрипты или стили в очередь следующим образом:
function themeslug_enqueue_style() {
wp_enqueue_style( 'core', '/style.css', false );
}
add_action( 'wp_enqueue_scripts', 'themeslug_enqueue_style' );
Вы получаете следующее:
<link rel="stylesheet" id='core-css' href="http://localhost:8080/wordpress/style.css?ver=4.9.4" type="text/css" media="all" />
Обратите внимание, что начало ссылки содержит URL сайта, в данном случае http://localhost:8080
. Я пытаюсь удалить это, чтобы оно относилось к файлу, выполняющему это. Обычно это делается с помощью plugins_url
или get_stylesheet_uri()
. Однако, я НЕ хочу использовать их, так как это может быть использовано в плагине или в теме – и я хочу сохранить код одинаковым для обоих случаев.
Есть ли способ сделать это?
Не при помощи WordPress API, но вы можете сделать это с помощью чистого PHP довольно легко.
<?php
//Сначала получите полный путь к локальному каталогу.
$fullpath = __DIR__;
//проверьте, находитесь ли вы в каталоге темы или плагина
if (strpos( $fullpath, 'themes' ) !== false )
{
//Это тема, используйте get_stylesheet_uri
} elseif ( strpos( $fullpath, 'plugins' )
{
//Это плагин, используйте plugins_url
} else {
//Это вообще где-то еще.
}
Я оказался в той же ситуации, я разрабатываю библиотеку, которая может быть подключена другими пользователями, поэтому я не могу предоставить абсолютный путь.
Что мы можем использовать для достижения цели?
-
Мы можем получить путь к корневому каталогу WordPress, используя константу
ABSPATH
. -
Мы можем получить путь к каталогу текущего файла, используя
__DIR__
. -
PHP-функцию
str_replace()
для удаления одной строки из другой.
С помощью этого мы можем удалить ABSPATH
из __DIR__
, получив относительный путь к каталогу текущего файла от корня WordPress, чтобы он работал, когда он будет добавлен к URL сайта.
Пример кода
Предположим, что у нас следующая структура файлов:
-> /inc
-> current-file.php
-> /assets
-> your-file.js
-> your-file.css
Следующий код будет работать:
// Получаем путь от корня WordPress до каталога текущего файла
$current_path = str_replace( ABSPATH, "https://wordpress.stackexchange.com/", __DIR__ );
// Относительный путь от каталога текущего файла до вашего ресурса.
$relative_path="/assets/your-file.js"
// Добавление скрипта
wp_enqueue_script( 'your-handle', $current_path . $relative_path );
// Добавление стиля
wp_enqueue_style( 'your-handle', $current_path . $relative_path );
Или мы можем написать это короче, если нам не важна читаемость (мне в данном случае не важна):
// Скрипты
wp_enqueue_script( 'your-handle', str_replace( ABSPATH, "https://wordpress.stackexchange.com/", __DIR__ ) . '/assets/your-file.js' );
// Стили
wp_enqueue_style( 'your-handle', str_replace( ABSPATH, "https://wordpress.stackexchange.com/", __DIR__ ) . '/assets/your-file.css' );
Обратите внимание, что в случае, если ваш ресурс находится в каталоге выше файла, в котором вы его добавляете, относительный путь должен быть таким: '/../assets/your-file.js'
.
Вот еще один пример:
-> /inc
-> current-file.php
-> /assets
-> your-file.js
-> your-file.css
И затем
// Скрипты
wp_enqueue_script( 'your-handle', str_replace( ABSPATH, "https://wordpress.stackexchange.com/", __DIR__ ) . '/../assets/your-file.js' );
// Стили
wp_enqueue_style( 'your-handle', str_replace( ABSPATH, "https://wordpress.stackexchange.com/", __DIR__ ) . '/../assets/your-file.css' );
Надеюсь, это поможет, если кто-то еще задастся вопросом, как добавить скрипт в очередь, не зная заранее окончательного пути к файлу.
Используйте фильтр style_loader_src. Этот фильтр передает вам полный src (например, http://localhost:8080/wordpress/style.css?ver=4.9.4
), который вы затем можете изменить, чтобы удалить домен по вашему усмотрению. Например:
function style_loader_src_make_relative ( $src, $handle ) {
// Удаляем часть с доменом.
// site_url() = http://localhost:8080
$src = str_replace(site_url(), "", $src);
return $src;
}
add_filter('style_loader_src', 'style_loader_src_make_relative', 10, 2 );
Ответ или решение
Вопрос о том, как использовать относительный путь вместо абсолютного при загрузке скриптов в WordPress, требует особого внимания и грамотного подхода к решению. Ваша задача — обеспечить гибкость кода, чтобы он мог использоваться внутри плагина или темы без изменений. Рассмотрим, как это можно сделать с помощью WordPress и PHP.
Задача
Когда вы подключаете стили или скрипты следующим образом:
function themeslug_enqueue_style() {
wp_enqueue_style('core', '/style.css', false);
}
add_action('wp_enqueue_scripts', 'themeslug_enqueue_style');
Полученный результат включает доменное имя сайта перед вашим путем, например http://localhost:8080/wordpress/style.css?ver=4.9.4
. Цель заключается в использовании относительного пути, чтобы избежать добавления URL сайта.
Решение с использованием PHP
Важно отметить, что WordPress API изначально не поддерживает использование относительных путей напрямую. Однако, можно обойти это ограничение с использованием PHP:
-
Получите путь от корневой директории WordPress:
Можно использовать константуABSPATH
для этой цели. -
Используйте
__DIR__
:
Благодаря этой функции вы можете получить директорию текущего файла. -
Примените
str_replace()
:
С его помощью вы можете удалить абсолютный путь от WordPress и оставить только относительный путь.
Пример кода:
$current_path = str_replace(ABSPATH, '', __DIR__);
$relative_path = '/assets/your-file.js';
wp_enqueue_script('your-handle', $current_path . $relative_path);
wp_enqueue_style('your-handle', $current_path . '/assets/your-file.css');
Использование фильтров WordPress
Помимо PHP, вы можете применять фильтры WordPress для модификации ссылок:
- Фильтр
style_loader_src
:
Позволяет корректировать полный URL и удалять доменное имя:
function style_loader_src_make_relative($src, $handle) {
$src = str_replace(site_url(), '', $src);
return $src;
}
add_filter('style_loader_src', 'style_loader_src_make_relative', 10, 2);
Заключение
Решение задачи использования относительных путей в WordPress возможно и требует грамотного подхода с использованием PHP и встроенных фильтров системы. Это позволяет обеспечить более гибкую и универсальную реализацию, которая будет работать как в темах, так и в плагинах, без необходимости изменения кода. Такой подход минимизирует потенциальные ошибки и обеспечивает стабильность вашего приложения.