WordPress мультисайт wp_upload_dir неправильно
В настоящее время я пытаюсь загрузить изображение в Wordpress-Multisite на стороне сервера. (Изображение уже находится на другом пути на том же сервере)
Я написал небольшой PHP-скрипт, который должен обрабатывать это:
$upload_dir = wp_upload_dir();
var_dump( $upload_dir);
$filename = basename($imagepath);
if (wp_mkdir_p($upload_dir['path'])) {
$file = $upload_dir['path'].'/'.$filename;
} else {
$file = $upload_dir['basedir'].'/'.$filename;
}
copy($imagepath, $file);
$wp_filetype = wp_check_filetype($filename, null);
$attachment = array(
'guid' => $upload_dir['url'].'/'.basename($filename),
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit', );
$attach_id = wp_insert_attachment($attachment, $file, $postid);
Все отлично работает, но изображение хранится не в той папке. wp_upload_dir();
возвращает общий путь /wp-content/uploads/2016/03
, а не путь для конкретного дочернего сайта, который будет /wp-content/uploads/sites/SITE_ID/2016/03
Позже, когда WP использует изображение, URL-адрес изображения устанавливается на http://example.com/wp-content/uploads/sites/SITE_ID/2016/03/IMAGE.JPG
(что не правильно...)
Загрузка файла с помощью встроенного медиа-инструмента загрузки из WordPress работает правильно (файлы хранятся в /wp-content/uploads/sites/SITE_ID/2016/03
)
Ты видишь, wp_upload_dir()
не работает правильно..
Спасибо..
2 ответа
Я решил это!
Для всех с той же проблемой решение простое:
- Когда вы находитесь на мультисайте, зарегистрируйте фильтр для "upload_dir"
- определить функцию, где вы временно измените пути и URL
Это оно!
if(is_multisite()){ add_filter('upload_dir', 'fix_upload_paths'); } function fix_upload_paths($data) { $data['basedir'] = $data['basedir'].'/sites/'.get_current_blog_id(); $data['path'] = $data['basedir'].$data['subdir']; $data['baseurl'] = $data['baseurl'].'/sites/'.get_current_blog_id(); $data['url'] = $data['baseurl'].$data['subdir']; return $data; }
Надеюсь, кто-то может использовать это. Часы часов для меня.
Более простой метод заключается в использовании
switch_to_blog()
функция
if( is_multisite() ) {
switch_to_blog( get_current_blog_id() );
$imgdir = wp_upload_dir();
// do more process related to current blog
// close the swicth
restore_current_blog();
}
Подробнее см. на странице https://developer.wordpress.org/reference/functions/switch_to_blog/ .