Относительный путь вместо абсолютного для wp_enqueue_script

Вопрос или проблема

Когда вы добавляете скрипты или стили в очередь следующим образом:

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 {
    //Это вообще где-то еще.
}

Я оказался в той же ситуации, я разрабатываю библиотеку, которая может быть подключена другими пользователями, поэтому я не могу предоставить абсолютный путь.

Что мы можем использовать для достижения цели?

С помощью этого мы можем удалить 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:

  1. Получите путь от корневой директории WordPress:
    Можно использовать константу ABSPATH для этой цели.

  2. Используйте __DIR__:
    Благодаря этой функции вы можете получить директорию текущего файла.

  3. Примените 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 для модификации ссылок:

  1. Фильтр 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 и встроенных фильтров системы. Это позволяет обеспечить более гибкую и универсальную реализацию, которая будет работать как в темах, так и в плагинах, без необходимости изменения кода. Такой подход минимизирует потенциальные ошибки и обеспечивает стабильность вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...