Изменение видимого пути к CSS и JS файлам в WordPress

10 сент. 2010 г., 00:40:19
Просмотры: 17.9K
Голосов: 4

Кто-нибудь знает, как автоматически преобразовать:

http://www.example.com/wp-content/themes/theme-name/css/stylesheeet.css

в

http://www.example.com/css/stylesheet.css

Конечно, можно просто создать соответствующую папку в корне сайта, разместить там файлы и ссылаться на них, но это не то, что мне нужно.

Я ищу способ, чтобы все CSS и JavaScript файлы оставались в папке темы, но при просмотре исходного кода страницы отображался указанный выше сокращенный путь.

В идеале мне нужен код, который автоматически сделает это для всех файлов, на которые ссылается моя тема, включая изображения.

0
Все ответы на вопрос 2
9

Навскидку, вам понадобится две вещи:

Во-первых, правило перезаписи в вашем .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');
10 сент. 2010 г. 01:58:58
Комментарии

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

NetConstructor.com NetConstructor.com
10 сент. 2010 г. 09:13:21

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

gabrielk gabrielk
10 сент. 2010 г. 20:37:29

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

NetConstructor.com NetConstructor.com
11 сент. 2010 г. 12:39:34

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

gabrielk gabrielk
13 сент. 2010 г. 21:40:57

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

NetConstructor.com NetConstructor.com
14 сент. 2010 г. 05:33:40

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

NetConstructor.com NetConstructor.com
15 сент. 2010 г. 06:28:46

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

gabrielk gabrielk
19 сент. 2010 г. 21:05:39

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

NetConstructor.com NetConstructor.com
10 окт. 2012 г. 14:19:34

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

NetConstructor.com NetConstructor.com
10 окт. 2012 г. 14:22:37
Показать остальные 4 комментариев
3

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

Я собираюсь предложить альтернативное решение, которое решит проблему.

Создайте символическую ссылку из 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:

http://example.com/css/

Для того чтобы это работало, необходимо разрешить директиву FollowSymLinks в вашем файле httpd.conf. Вы также можете добавить её в файл .htaccess, который переопределит настройки из httpd.conf.

В httpd.conf настройка будет выглядеть так:

<Directory />
Options Indexes FollowSymLinks
</Directory>

Перед тем как изменения вступят в силу, потребуется перезапустить Apache:

#/etc/init.d/apache2 restart

Вы можете узнать больше о SymLinks на Maxi-Pedia и в документации Apache.

10 сент. 2010 г. 02:32:00
Комментарии

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

Grant Palin Grant Palin
10 сент. 2010 г. 06:49:22

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

hannit cohen hannit cohen
10 сент. 2010 г. 07:54:15

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

NetConstructor.com NetConstructor.com
10 сент. 2010 г. 08:54:36