Изменение пути и URL для загрузки файлов в WordPress

3 апр. 2016 г., 19:31:26
Просмотры: 31.5K
Голосов: 6

При новой установке я хочу переместить папку загрузки на поддомен (предположительно для ускорения загрузки). Мой поддомен ссылается на папку static. Итак, у меня есть:

  • Home
    • wp
      • wp-admin
      • wp-content
      • wp-include
    • static

Теперь мне нужно указать WordPress, где находится папка загрузки и определить её URL. В документации говорится, что нужно отредактировать wp-config для определения UPLOADS относительно ABSPAHT. Но если я укажу define( 'UPLOADS', '../static' );, то URL на страницах будет выглядеть как //mydomain.tld/wp/../static/image.jpg

Я просмотрел множество различных ответов на этот вопрос (фильтры, редактирование БД,...), некоторые из них уже неактуальны (поскольку страница настроек медиафайлов больше не позволяет изменять папку загрузки), а некоторые явно неверные... Я хочу сделать это правильным способом.

Я перешел на страницу wp-admin/options.php и установил upload_path = ../static и upload_url_path = http://static.mydomain.tld, и это, похоже, работает.

Но правильный ли это способ? И если разработчики удалили эти опции со страницы настроек медиафайлов, нет ли риска, что эта функция будет полностью удалена позже?

2
Комментарии

То, что говорит кодекс, является правильным способом делать вещи. Если это не соответствует вашим потребностям, то любое найденное вами решение — это обходной путь, и нет правильных или неправильных обходных путей. Так что если это работает для вас сейчас, придерживайтесь этого и просто следите за изменениями/обновлениями.

ed-ta ed-ta
3 апр. 2016 г. 19:41:05

Конечно, но эта страница кодекса касается только upload_path, а не upload_URL. И эта страница только про редактирование wp-config, плюс весь раздел имеет оговорку "Следующие разделы могут содержать продвинутую/неподдерживаемую информацию", что заставляет меня задуматься.

Mat Mat
3 апр. 2016 г. 19:50:34
Все ответы на вопрос 3
8

Я зашёл на страницу wp-admin/options.php и изменил... Но разве так правильно делать?

Нет. Вы никогда не должны изменять файлы ядра WordPress, потому что все ваши изменения будут потеряны при следующем обновлении. Вместо этого следует использовать хуки (actions и filters):

add_filter( 'pre_option_upload_path', function( $upload_path ) {
    return '/путь/к/статике';
});

add_filter( 'pre_option_upload_url_path', function( $upload_url_path ) {
    return 'http://static.example.org';
});
3 апр. 2016 г. 19:59:27
Комментарии

Нет, нет, тут недопонимание. Конечно, я бы никогда не редактировал файл WordPress. Я имел в виду, что загрузил страницу wp-admin/options.php в браузере, изменил отображаемые настройки и нажал сохранить. Теперь, что касается ваших фильтров, я понимаю, как они работают, но откуда берутся значения без фильтра? Есть ли вероятность, что это те настройки, которые я изменил?

Mat Mat
3 апр. 2016 г. 20:08:45

Понял, извини за предположение, что ты редактировал системный файл. Это именно те значения, которые ты изменил, а фильтр pre_option_* просто фильтрует все вызовы get_option() для этих значений, так что твой подход тоже будет работать. Что касается будущей безопасности, сомневаюсь, что эти опции когда-либо будут удалены из ядра без обеспечения обратной совместимости.

kovshenin kovshenin
3 апр. 2016 г. 20:20:16

Хорошо, то есть по сути оба наших решения схожи в том, что мое определяет новые значения опций (предположительно в базе данных), а твое изменяет их на лету, верно? Значит, это вместе с твоим комментарием о будущих изменениях означает, что мое решение правильное. Спасибо за помощь.

Mat Mat
3 апр. 2016 г. 20:31:46

Пожалуйста! Верно, но для уточнения: оба значения уже определены в базе данных, вы просто изменяете их через интерфейс options.php. Я также не рекомендую использовать относительные пути, потому что иногда они ведут себя непредсказуемо.

kovshenin kovshenin
3 апр. 2016 г. 20:38:16

Только что проверил в двух других установках WordPress. И upload_path, и upload_url_path существуют в базе данных, но пустые, так что я предполагаю, что значения по умолчанию определены где-то ещё. Что касается относительного пути, это было из-за подсказки в кодексе, которую я упомянул в своём первом сообщении. Установлю абсолютный путь, надеюсь, это не сломает мой сайт :-)

Mat Mat
3 апр. 2016 г. 20:46:43

Вы правы, при пустых значениях значения по умолчанию генерируются в wp_upload_dir: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/functions.php#L1816

kovshenin kovshenin
3 апр. 2016 г. 20:49:34

Не работает на WP 4.7.2

Jeremy Jeremy
8 мар. 2017 г. 19:50:07

Я поддержал комментарий @kovshenin об относительном пути. Проверил значения с помощью add_filter('upload_dir', function( $args ){ var_dump($args); });, в результатах было что-то странное вроде /home/foo/bar/wordpress/../uploads/. Поэтому я использовал абсолютный путь для поля upload_path на странице option.php.

norixxx norixxx
26 окт. 2018 г. 12:16:55
Показать остальные 3 комментариев
0

У меня была похожая проблема с настройкой поддомена для медиафайлов. Вопрос и ответ здесь.
Коротко говоря, добавьте в functions.php следующее:

update_option('upload_url_path', '/wp-content/uploads');
20 дек. 2018 г. 10:06:57
0

Если по какой-либо причине вы не хотите устанавливать параметры пути загрузки в базе данных или в файле functions.php, вы всё равно можете установить фильтры опций в вашем wp-config.php следующим образом (перед вызовом любого файла ядра WordPress):

$GLOBALS['wp_filter']['pre_option_upload_path'][10][] = array(
  'function' => function( $upload_path ){
    return '/путь/к/статике';
  },
  'accepted_args' => 1,
);

$GLOBALS['wp_filter']['pre_option_upload_url_path'][10][] = array(
  'function' => function( $upload_url_path ){
    return 'http://static.example.org';
  },
  'accepted_args' => 1,
);

WP_Hook::build_preinitialized_hooks правильно обновит эти элементы массива до фактически используемого внутреннего формата.

26 мар. 2020 г. 13:41:11