Изменение видимого пути к CSS и JS файлам в WordPress
Кто-нибудь знает, как автоматически преобразовать:
http://www.example.com/wp-content/themes/theme-name/css/stylesheeet.css
в
http://www.example.com/css/stylesheet.css
Конечно, можно просто создать соответствующую папку в корне сайта, разместить там файлы и ссылаться на них, но это не то, что мне нужно.
Я ищу способ, чтобы все CSS и JavaScript файлы оставались в папке темы, но при просмотре исходного кода страницы отображался указанный выше сокращенный путь.
В идеале мне нужен код, который автоматически сделает это для всех файлов, на которые ссылается моя тема, включая изображения.

Навскидку, вам понадобится две вещи:
Во-первых, правило перезаписи в вашем .htaccess файле, например:
RewriteEngine On
RewriteBase /
RewriteRule ^css/(.*) /wp-content/themes/theme-name/css/$1 [L]
RewriteRule ^js/(.*) /wp-content/themes/theme-name/js/$1 [L]
Во-вторых, добавьте фильтр в functions.php вашей темы, например:
function change_css_js_url($content) {
$current_path = '/wp-content/themes/theme-name/';
$new_path = '/'; // Не нужно добавлять /css или /js здесь, так как вы сопоставляете подкаталоги 1 к 1
$content = str_replace($current_path, $new_path, $content);
return $content;
}
add_filter('bloginfo_url', 'change_css_js_url');
add_filter('bloginfo', 'change_css_js_url');
Несколько предостережений: - если плагин или что-то ещё не использует bloginfo() или get_bloginfo(), фильтр не сработает. Вы можете обойти это, подключив вашу функцию к другим фильтрам по мере необходимости. - некоторые плагины/темы и т.д. используют жёстко прописанные пути. С этим мало что можно сделать, кроме как изменить код для использования одной из функций WP для получения пути.
Вот тот же пример с использованием темы twentyten (без подкаталогов css/js, но идея та же).
.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^twentyten/(.*) /wp-content/themes/twentyten/$1 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
functions.php
function change_css_js_url($content) {
$current_path = '/wp-content/themes/';
$new_path = '/'; // Не нужно добавлять /css или /js здесь, так как вы сопоставляете подкаталоги 1 к 1
$content = str_replace($current_path, $new_path, $content);
return $content;
}
add_filter('bloginfo_url', 'change_css_js_url');
add_filter('bloginfo', 'change_css_js_url');

@gabrielk Это выглядит как отличное решение, но по какой-то причине у меня это не работает. Я добавил соответствующие правила перезаписи, внес изменения в файл functions.php и убедился, что пути к оригинальным расположениям файлов указаны корректно в обоих местах. Затем я перезапустил Apache, но при обновлении страницы в браузере никаких изменений не вижу. Также стоит отметить, что все файлы моей темы ссылаются на директорию шаблона через <?php bloginfo('template_directory'); ?>. Не могли бы вы проверить этот код на своей системе, чтобы понять, что нужно изменить для корректной работы?

Хм, у меня работает. Я только что протестировал это на теме twentyten — слегка модифицированной, так как в этой теме нет поддиректорий css/js.

Не могли бы вы проверить ещё раз... Я не могу понять, почему это не работает у меня

Извините за поздний ответ, был занят на выходных. Два вопроса: 1) Работают ли постоянные ссылки записей на вашем сайте? 2) Если у вас есть чистая рабочая копия WP 3.0.1 с включенной темой Twentyten и включенными постоянными ссылками, работает ли второй фрагмент кода, который я опубликовал, у вас?

1) Да, включены и работают. 2) Я не использую тему Twentyten, я создал свою собственную тему, НО в файлах шаблонов для этой темы я всегда использовал <?php bloginfo('template_directory'); ?> при ссылке на изображение или файл. Разве добавление моей собственной темы и соответствующих файлов шаблонов — это неправильный способ? Если это правильно, то возможно, я что-то упускаю, что может помешать <?php bloginfo('template_directory'); ?> изменить путь URL для достижения желаемого результата?

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

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

заметка для других пользователей, которые читают это... решение Gabe, приведенное выше, действительно сработало. Проблема была на моей стороне

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

В идеальной ситуации я ищу фрагмент кода, который можно добавить, чтобы автоматически выполнялось это для всех файлов, на которые ссылаются в папке моей темы, включая любые изображения.
Я собираюсь предложить альтернативное решение, которое решит проблему.
Создайте символическую ссылку из wp-content/themes/ваша-тема в корневую директорию/css
Для создания символической ссылки в Linux используйте команду #ln -s
. Например:
#ln -s /home/user-name/public_html/wp-content/themes/your_theme_name /home/user-name/public_html/css
Теперь любой файл в http://example.com/wp-content/themes/your_theme_name/ может быть доступен по URL:
Для того чтобы это работало, необходимо разрешить директиву FollowSymLinks в вашем файле httpd.conf. Вы также можете добавить её в файл .htaccess, который переопределит настройки из httpd.conf.
В httpd.conf настройка будет выглядеть так:
<Directory />
Options Indexes FollowSymLinks
</Directory>
Перед тем как изменения вступят в силу, потребуется перезапустить Apache:
#/etc/init.d/apache2 restart
Вы можете узнать больше о SymLinks на Maxi-Pedia и в документации Apache.

+1 Единственная проблема, которую я вижу - это необходимость создания символьной ссылки для каждой темы, которая загружается и активируется. В остальном - отличное решение!

еще одна проблема - это означает, что вам фактически нужно вручную заменять вызовы заголовков

большое спасибо за этот ответ. Я тоже думал о таком решении, но надеялся, что может быть способ добавить код в файл functions.php, который автоматически укажет WordPress изменять местоположение всех запросов, идущих к реальному расположению, на эти новые "виртуальные" расположения... Кто-нибудь знает, как это можно сделать?
