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 ответа

Решение

Я решил это!

Для всех с той же проблемой решение простое:

  1. Когда вы находитесь на мультисайте, зарегистрируйте фильтр для "upload_dir"
  2. определить функцию, где вы временно измените пути и URL
  3. Это оно!

    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/ .

Другие вопросы по тегам