ویژگی تصویر

آموزش تابع wp_upload_dir() در وردپرس و کاربرد آن

  /  وردپرس   /  تابع wp_upload_dir در وردپرس
بنر تبلیغاتی الف
wp - wordpress - وردپرس

تابع wp_upload_dir() یکی از توابع پایه‌ای وردپرس برای کار با پوشه و آدرس آپلودها است. این تابع اطلاعات مرتبط با مسیر فایل‌ها و URL آنها را بازمی‌گرداند که در توسعه قالب‌ها، پلاگین‌ها و پردازش فایل‌ها بسیار کاربردی است. در این مقاله به‌صورت عملی و دقیق ساختار خروجی، مثال‌های مرسوم و نکات پیشرفته را بررسی می‌کنیم.

خروجی تابع و کلیدهای مهم

این تابع یک آرایه انجمنی با کلیدهای مشخص برمی‌گرداند. مهم‌ترین کلیدها عبارت‌اند از:

  • path: مسیر کامل دایرکتوری آپلود فعلی روی سرور (بدون اسلش انتهایی).
  • url: آدرس قابل دسترسی از طریق وب برای همان دایرکتوری.
  • subdir: زیردایرکتوری مربوط به سال/ماه یا تنظیم دلخواه (مثلاً “/2025/10”).
  • basedir: مسیر پایه پوشه uploads (بدون زیردایرکتوری).
  • baseurl: URL پایه پوشه uploads.
  • error: در صورتی‌که مشکلی وجود داشته باشد، پیام خطا را نشان می‌دهد.
کلیدتوضیح
pathمسیر کامل پوشه جاری روی دیسک
urlآدرس وب پوشه جاری
subdirزیردایرکتوری (معمولاً سال/ماه)
basedir / baseurlمسیر و URL پایه پوشه uploads
errorپیام خطا در صورت وجود مشکل

نمونه پایه‌ای استفاده از wp_upload_dir()

// Get upload directory info
$upload = wp_upload_dir();

if ( ! empty( $upload['error'] ) ) {
    // handle error
    error_log( 'Upload dir error: ' . $upload['error'] );
} else {
    $path = $upload['path'];    // e.g. /var/www/html/wp-content/uploads/2025/10
    $url  = $upload['url'];     // e.g. https://example.com/wp-content/uploads/2025/10
}

توضیح: این قطعه‌کد اطلاعات دایرکتوری آپلود را در متغیر $upload قرار می‌دهد و در صورت وجود خطا آن را در لاگ ثبت می‌کند. سپس مسیر و URL جاری را استخراج می‌کند تا برای ذخیره یا نمایش فایل‌ها استفاده شود.

ذخیره دستی فایل در پوشه آپلود — مثال عملی

// Save raw content to uploads with a custom filename
$upload = wp_upload_dir();
$filename = 'my-file.txt';
$fullpath = trailingslashit( $upload['path'] ) . $filename;

$content = "Hello from WordPress!";
if ( wp_mkdir_p( dirname( $fullpath ) ) || file_exists( dirname( $fullpath ) ) ) {
    $saved = file_put_contents( $fullpath, $content );
    if ( $saved ) {
        $fileurl = trailingslashit( $upload['url'] ) . $filename;
        // $fileurl can be used publicly
    }
}

توضیح: در این مثال ابتدا مسیر آپلود گرفته شده، سپس با wp_mkdir_p اطمینان حاصل می‌شود که دایرکتوری وجود دارد. سپس فایل متنی با file_put_contents ذخیره شده و URL عمومی آن ساخته می‌شود.

استفاده در آپلود فایل‌های ورودی (wp_handle_upload)

برای پردازش فرم‌های آپلود و ذخیره امن می‌توان از ترکیب wp_handle_upload() و wp_upload_dir() استفاده کرد:

// Handle uploaded file from $_FILES['myfile']
if ( isset( $_FILES['myfile'] ) && ! empty( $_FILES['myfile']['tmp_name'] ) ) {
    require_once ABSPATH . 'wp-admin/includes/file.php';
    $overrides = array( 'test_form' => false );
    $result = wp_handle_upload( $_FILES['myfile'], $overrides );

    if ( isset( $result['error'] ) ) {
        // handle error
    } else {
        // $result['file'] => full path
        // $result['url']  => public URL
    }
}

توضیح: wp_handle_upload از تنظیمات وردپرس برای تعیین مسیر استفاده می‌کند که مبتنی بر خروجی wp_upload_dir() است. این روش نکات امنیتی مانند بررسی MIME را رعایت می‌کند.

موارد پیشرفته و نکات مهم

  • مولتی‌سایت: در حالت شبکه (multisite)، مسیرها ممکن است متفاوت باشند (هر سایت زیرپوشه یا زیردامنه). تابع براساس سایت جاری خروجی می‌دهد.
  • سفارشی‌سازی محل آپلود: با تعریف ثابت UPLOADS یا فیلتر upload_dir می‌توانید محل ذخیره را تغییر دهید؛ اما مراقب لینک‌شکن‌ها و مجوزها باشید.
  • مجوز فایل سیستم: خطاهای رایج هنگام ذخیره معمولاً به خاطر مجوزهای پوشه‌هاست؛ در صورت خطا پیام در $upload['error'] ظاهر می‌شود.
  • ذخیره ابری: اگر از سرویس‌هایی مانند S3 استفاده می‌کنید، پلاگین‌های مربوط مسیرها را فیلتر می‌کنند؛ گاهی لازم است به‌جای مسیر محلی از URL بازگشتی استفاده کنید.
  • امنیت: قبل از ذخیره هر فایل، نوع MIME و اندازه را بررسی کنید؛ همچنین از نام‌گذاری امن برای فایل‌ها استفاده نمایید تا از اجرای کدهای ناخواسته جلوگیری شود.

مثال فیلتر upload_dir برای اضافه کردن زیردایرکتوری دلخواه

// Append a custom subdirectory to uploads
add_filter( 'upload_dir', 'my_custom_upload_dir' );
function my_custom_upload_dir( $dirs ) {
    $sub = '/myplugin';
    $dirs['path'] = $dirs['basedir'] . $sub . $dirs['subdir'];
    $dirs['url']  = $dirs['baseurl'] . $sub . $dirs['subdir'];
    $dirs['basedir'] = $dirs['basedir'] . $sub;
    $dirs['baseurl'] = $dirs['baseurl'] . $sub;
    return $dirs;
}

توضیح: این فیلتر مسیر و URL آپلود را به‌صورت جهانی برای افزونه یا تم تغییر می‌دهد و یک زیردایرکتوری به نام myplugin اضافه می‌کند. توجه کنید که قبل از اعمال باید دایرکتوری موردنظر ایجاد و مجوزها بررسی شوند.

خطاها و رفع آن‌ها

  • خطای permission denied: بررسی کنید پوشه wp-content/uploads دسترسی نوشتن (CHMOD) داشته باشد.
  • خطای فضای دیسک: فضای سرور را بررسی کنید و در صورت لزوم آرشیو یا پاکسازی انجام دهید.
  • خطاهای مرتبط با URL غیرمنتظره: ممکن است سایت در http/https یا proxy باشد؛ baseurl را بررسی کنید.

نکته نهایی

تابع wp_upload_dir() نقطه‌ی شروع هر عملیاتی است که با فایل‌ها و مسیرهای آپلود سروکار دارد. آگاهی از ساختار خروجی و استفاده درست از توابع کمکی مانند wp_mkdir_p و wp_handle_upload باعث می‌شود توسعه‌دهندگان بتوانند به‌صورت امن و انعطاف‌پذیر فایل‌ها را مدیریت کنند.

با رعایت نکات امنیتی، بررسی خطا و در نظر گرفتن حالت‌های خاص مثل چندسایته یا ذخیره بیرونی، می‌توانید از این تابع در سناریوهای متنوع اعم از ذخیره فایل‌های کاربری تا نگهداری فایل‌های لاگ یا خروجی‌های پردازشی استفاده کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: