Как загружать изображения в папки, отдельные для каждого поста – код и плагин Custom Upload Dir

Как загружать изображения в папки, отдельные для каждого поста - код и плагин Custom Upload Dir | n-wp.ru
Код функции, создающей для изображений каждого поста в папке uploads отдельную папку с названием, соответствующим ID поста, а так же плагин, с помощью которого можно настроить произвольный путь для сохранения изображений.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

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

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

function media_upload_dir($upload) {
        if(!isset($_REQUEST['post_id']))
        return $upload;
        $id = $_REQUEST['post_id'];
        if (isset($_REQUEST['post_id'])) {
            $upload['path']    = "/www/blog/wp-content/uploads/" . $id;
            $upload['url']     = "http://site.com/blog/wp-content/uploads/" . $id;
            $upload['basedir'] = "/www/blog/wp-content/uploads/" . $id;
            $upload['baseurl'] = "http://site.com/blog/wp-content/uploads/" . $id;
            if (!file_exists("/www/blog/wp-content/uploads/" . $id)) {
                mkdir("/www/blog/wp-content/uploads/" . $id, 0777);
            }
        }
        return $upload;
    }
    add_filter('upload_dir', 'media_upload_dir');

Этот код создает для каждого поста с изображениями свою папку с названием, соответствующим ID поста. Все изображения из поста закачиваются в отдельную папку, и в дальнейшем легко понять, к какому посту относятся изображения.

www/blog/wp-content/uploads/ – это полный путь до папки с учетом того, как он формируется вашим хостингом.
site.com/blog/wp-content/uploads/ – это полный путь до папки uploads с учетом того, как он выглядит в браузере.

Код можно усовершенствовать, сделав более универсальным: функция будет сохранять изображения в папках, соответствующих, на ваш выбор, ID поста, автору поста, или типу файлов. Путь к файлам будет такой: /wp-content/uploads/выбранный_вами_шаблон/.

add_filter('wp_handle_upload_prefilter', 'tp_handle_upload_prefilter');
add_filter('wp_handle_upload', 'tp_handle_upload');

function tp_handle_upload_prefilter( $file )
{
    add_filter('upload_dir', 'tp_custom_upload_dir');
    return $file;
}

function tp_handle_upload( $fileinfo )
{
    remove_filter('upload_dir', 'tp_custom_upload_dir');
    return $fileinfo;
}

function tp_custom_upload_dir($path)
{   
    $use_default_dir = ( isset($_REQUEST['post_id'] ) && $_REQUEST['post_id'] == 0 ) ? true : false; 
    if( !empty( $path['error'] ) || $use_default_dir )
    return $path;
    $the_post = get_post($_REQUEST['post_id']);
    $customdir = '/' . $the_post->post_name;
    $path['path']    = str_replace($path['subdir'], '', $path['path']);
    $path['url']     = str_replace($path['subdir'], '', $path['url']);      
    $path['subdir']  = $customdir;
    $path['path']   .= $customdir; 
    $path['url']    .= $customdir;  
    return $path;
}

В этом случае изображения будут сохраняться в папку /wp-content/uploads/post_id/.

add_filter('wp_handle_upload_prefilter', 'tp_handle_upload_prefilter');
add_filter('wp_handle_upload', 'tp_handle_upload');

function tp_handle_upload_prefilter( $file )
{
    add_filter('upload_dir', 'tp_custom_upload_dir');
    return $file;
}

function tp_handle_upload( $fileinfo )
{
    remove_filter('upload_dir', 'tp_custom_upload_dir');
    return $fileinfo;
}

function tp_custom_upload_dir($path)
{   
    $use_default_dir = ( isset($_REQUEST['post_id'] ) && $_REQUEST['post_id'] == 0 ) ? true : false; 
    if( !empty( $path['error'] ) || $use_default_dir )
    return $path; 
    $the_post = get_post($_REQUEST['post_id']);
    $the_author = get_user_by('id', $the_post->post_author);
    $customdir = '/' . $the_author->data->display_name;
    $path['path']    = str_replace($path['subdir'], '', $path['path']);
    $path['url']     = str_replace($path['subdir'], '', $path['url']);      
    $path['subdir']  = $customdir;
    $path['path']   .= $customdir; 
    $path['url']    .= $customdir;  
    return $path;
}

В данном случае изображения будут сохраняться в папку /wp-content/uploads/post_author/.

add_filter('wp_handle_upload_prefilter', 'tp_handle_upload_prefilter');
add_filter('wp_handle_upload', 'tp_handle_upload');

function tp_handle_upload_prefilter( $file )
{
    add_filter('upload_dir', 'tp_custom_upload_dir');
    return $file;
}

function tp_handle_upload( $fileinfo )
{
    remove_filter('upload_dir', 'tp_custom_upload_dir');
    return $fileinfo;
}

function tp_custom_upload_dir($path)
{   
    $use_default_dir = ( isset($_REQUEST['post_id'] ) && $_REQUEST['post_id'] == 0 ) ? true : false; 
    if( !empty( $path['error'] ) || $use_default_dir )
    return $path; 
    $extension = substr( strrchr( $_POST['name'], '.' ), 1 );
    switch( $extension )
    {
        case 'jpg':
        case 'png':
        case 'gif':
            $customdir = '/images';
            break;

        case 'mp4':
        case 'm4v':
            $customdir = '/videos';
            break;

        case 'txt':
        case 'doc':
        case 'pdf':
            $customdir = '/documents';
            break;

        default:
            $customdir = '/others';
            break;
    }
    $path['path']    = str_replace($path['subdir'], '', $path['path']);
    $path['url']     = str_replace($path['subdir'], '', $path['url']);      
    $path['subdir']  = $customdir;
    $path['path']   .= $customdir; 
    $path['url']    .= $customdir;  
    return $path;
}

В данном случае изображения будут сохраняться в папку /wp-content/uploads/file_type/.

Любой из кодов нужно использовать в файле functions.php только один раз.

Если вы не хотите самостоятельно внедрять код в используемую тему, то есть более простой и универсальный для любой темы в блоге способ – плагин Custom Upload Dir. Этот плагин делает то же самое, что и вышеприведенный код, только вариантов шаблонов больше: вы можете сохранять изображения в папки по ID поста, автору, названию поста (slug), типу записи (пост, страница, страница вложения), году, месяцу, дню, текущему пользователю, категории, метке, и даже по произвольной структуре, которую вы сами придумаете.

Как загружать изображения в папки, отдельные для каждого поста - код и плагин Custom Upload Dir

Но что самое удобное, так это то, что все эти шаблоны можно комбинировать, используя один в другом. Например, можно сохранять изображения в папки с таким путем: /wp-content/uploads/YYYY/MM/DD/user/post_id/.

Custom Upload Dir
Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. Станислав

    Классный вариант когда изображения сохраняться в папку /wp-content/uploads/file_type/

    Подскажите пожалуйста как добавить в адрес год и месяц?
    Чтобы получилось:
    /wp-content/uploads/file_type/год/месяц/

    Заранее спасибо!!!

    Ответить
    1. tiaurus автор

      Воспользуйтесь плагином Custom Upload Dir.

      Ответить
  2. Алексей

    Дорогой tiaurus. Спасибо за эту статью!! Была проблема с организацией медиафайлов по папкам на сервере через библиотеку по постам (ключ для поисковиков кхе-кхе). Перечитал кучу сайтов и отчаялся. Думал уже начинать пользоваться виртуальными папками, а не физическим на сервере. Спасибо еще раз!!

    Ответить