Изменение пути и URL для загрузки файлов в WordPress
При новой установке я хочу переместить папку загрузки на поддомен (предположительно для ускорения загрузки). Мой поддомен ссылается на папку static. Итак, у меня есть:
- Home
- wp
- wp-admin
- wp-content
- wp-include
- static
- wp
Теперь мне нужно указать 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
, и это, похоже, работает.
Но правильный ли это способ? И если разработчики удалили эти опции со страницы настроек медиафайлов, нет ли риска, что эта функция будет полностью удалена позже?

Я зашёл на страницу 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';
});

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

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

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

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

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

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

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

У меня была похожая проблема с настройкой поддомена для медиафайлов. Вопрос и ответ здесь.
Коротко говоря, добавьте в functions.php следующее:
update_option('upload_url_path', '/wp-content/uploads');

Если по какой-либо причине вы не хотите устанавливать параметры пути загрузки в базе данных или в файле 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
правильно обновит эти элементы массива до фактически используемого внутреннего формата.
