ضمیمه کردن فایل به نوشته از طریق Meta Box ها در وردپرس ( قسمت سوم )

در طول دوره ی دو پست آینده، به چگونگی اهرم کردنAPI وردپرس برای تعریف متا باکس های سفارشی متعلق به خودمان برای پیوست کردن یک سند (مانند یک PDF) به صفحات وردپرسمان، نگاهی خواهیم انداخت. همچنین این امر را که چگونه باید یک فایل را انتخاب کنیم تا بتوانیم به درستی آن را حذف کنیم، بررسی خواهیم کرد.
چند ماه پیش، ندا گرجی ازده نشان داد که چگونه متا باکس سفارشی وردپرس ایجاد کنیم.( برای دیدن آن به لینک زیر مراجعه کنید:
(http://wpurl.ir/creatmetabox) همانطور که در مقاله ی او اشاره شده است، متا باکس های سفارشی از ویژگی های فوق العاده قدرتمند است که به ما اجازه می دهد تکه های مختلف اطلاعات را به پست ها و صفحات وردپرس اضافه کنیم.

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

تعریف متا باکس سفارشی
در ابتدا بیایید که متا باکس پست ایجاد کنیم. به طور خاص، متا باکس باید:
• هم در پست و هم در صفحه در دسترس باشد
• در کنار ویرایشگر پست ظاهر شود
• یک فایل ورودی را قبول کند
در اینجا، functions.php را در ریشه فهرست تم دوهزار و یازده قرار دهید. ما همه ی تغییراتمان را در انتهای فایل ایجاد خواهیم کرد. با تعریف یک تابع به نامadd_custom_meta_boxes شروع می کنیم و این تابع با هوک add_meta_boxes ثبت خواهد شد.

PHP

در مرحله ی بعد، متا باکس سفارشی را تعریف خواهیم کرد. اول، کد را می نویسیم و بعد من شرح خواهم داد که این کد چه کارهایی انجام می دهد:

PHP

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

تنظیم فرا خوانی

figure1
تا این جا، متا باکس سفارشی هیچ کاری انجام نمی دهد. در واقع حتی چیزی را هم نمایش نمی دهد:
این به این دلیل است که ما هنوزتوابع فرا خوانی را که به منظور تولید نشانه گذاری ها استفاده می شود تعریف نکرده ایم. به منظور انجام این کار، نیاز به تعریف یک تابع با نامی که در بالا ذکر کرده ایم داریم. به طور خاص: wp_custom_attachment.
ورودی باید قالب PDF را قبول کند، بنابراین یک توصیف کوتاه و عنصر ورودی مناسب برای پذیرش فایل ها، ارائه می دهیم:

PHP

اولین خط از کد، nonce value را به منظور اینکه به اطلاعات ما به درستی اعتبار و امنیت ببخشد، تعریف می کند.
بعد، به سادگی یک نشانه برای نمایش بخش ورودی تنظیم میکنیم.

figure2
در اینجا، یک متا باکس سفارشی به نصیبمان شده است که مناسب و معقول به نظر می رسد اما در واقع کار نمی کند.
ذخیره کردن فایل ها
آلان ما آماده ی ذخیره کردن فایل ها هستیم. اول، نیاز به ایجاد یک تابع داریم که به هوک save_post هوک شود. بیایید آن را همین حالا تعریف کنیم:

PHP

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

PHP

بلوک های جدید کد می کند چندین کار انجام می دهد. نظرات به منظور وضوح بیشتر ارائه شده است، اما اتفاقی که می افتد این است:
• اول، ما مطمئن می شویم که آرایه ی فایل خالی نیست
• بعد، یک آرایه برای پشتیبانی از انواع فایل ها تنظیم می کنیم و تایید می کنیم که فایل بارگذاری شده از همین نوع می باشد
• بعد، برای کپی کردن فایل در سرور ازwp_upload_bits استفاده می کنیم
• در نهایت، اگر هر گونه خطا یی وجود دارد، ما اجرا را متوقف می کنیم و آنها را برای کاربر نمایش می دهیم.
یک تبصره بر روی wp_upload_bits
(http://codex.wordpress.org/Function_Reference/wp_upload_bits). این تابع، یک جایگزین برای wp_handle_upload (http://codex.wordpress.org/Function_Reference/wp_handle_upload) است. تجربه من نشان می دهد کهwp_handle_upload با بعضی تنظیمات خاص سرور، مشکلاتی داشته است به همین دلیل منفی کاذب می دهد. منظورمن از آنچه گفتم این است که ادعا می کند در هنگام بارگذاری فایل مشکلاتی وجود دارد، در حالی که در واقع، فایل بارگذاری شده است.
لینک کردن فایل
در اینجا باید برای ارائه دادن یک لینک به فایل بر روی نوشته هایمان و صفحاتمان آماده باشیم. باشد. در فهرست تم دوهزار و یازده ، دو فایل فایل single.php وpage.php را قرار دهید. هر فایل شامل یک خط کد است که شبیه به این به نظر می رسد:

PHP

درست زیر آن خط، نیاز داریم که اطلاعات متای پست سفارشی را با انجام این کار درخواست دهیم:

PHP

به طور خاص، این تابع اطلاعات متای پستی را درخواست می دهد که توسطwp_custom_attachment و مرتبط با ID این پست مشخص شده است. واضح است، نه؟ آخرین پارامتر این است که به وردپرس بگوییم که ما نتایج را در فرمت یک رشته می خواهیم (جایگزین در قالب یک آرایه است که فراتر از محدوده ی این آموزش می باشد).
بلوک نهایی کد باید شبیه به این باشد:

PHP

PHP

حالا تلاش می کنیم که یک فایل برای یک صفحه یا پست بارگذاری کنیم. پست و صفحه را در مرورگر خود بارگذاری کنید. مجوز همه چیز به درستی انجام شده است، متوجه خواهید شد که … اوه … در واقع مسیری در یک فایل ندارید.
به روز رسانی فرم پست
به طور پیش فرض، مشکل این است که عنصر فرم مورد استفاده برای ذخیره همه ی اطلاعات پست ها و داده های مرتبط با آن، نوع فایل را قبول نمی کند. این را می توان با اضافه کردن یک تابع دیگر که به چرخه ی حیات صفحه ی وردپرس هوک می شود حل کرد:

PHP

این کار صفت enctype را به عنصر فرم ویرایشگر پست الحاق می کند، بنابراین بارگذاری فایل ها پشتیبانی نخواهد شد.
حالا بیایید سعی کنیم که دوباره یک فایل را بارگذاری کنیم. پست یا صفحه ی خود را با متا باکس پست سفارشی قرار دهید و برای بارگذاری یک PDF تلاش کنید. اگر همه چیز به خوبی پیش رود، شما باید قادر باشید که به سمت پست و یا صفحه حرکت کنید و URL فایل را مشاهده کنید.
لینک کردن آن
آخرین مرحله آسان ترین مرحله است. در این مرحله، دوباره فایل های single.php وpage.php را ملاقات کنید و فرا خوانده شده را در درخواست اطلاعات متای سفارشی در لنگر، بپوشانید به این کار، آن به این شکل به نظر خواهد رسید:

PHP

PHP

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

آیا این مقاله برای شما مفید بود؟
تقریبا
خیر

دیدگاهتان را بنویسید

ارسال دیدگاه به معنی این است که شما ابتدا قوانین ارسال دیدگاه را مطالعه کرده‌اید و با آن موافق هستید.

دیدگاه‌های این نوشته جدید ترین ها شاخص

  1. سلام
    چرا آموزش کامل واسه پست تایپ هایی با تایپ مختلف نذاشتید

  2. با سلام
    یعنی نمیشه به جای فایل های pdf فایل هایی با پسوند png یا jpg رو ذخیره کنه
    لطفا راهنمایی فرمایید
    با تشکر

  3. سلام اگه فایل تصویر باشه چکارباید کرد مثلا قرار است ۶ تا اسکرین شات باشه ؟

    • 12 سال عضو همیار وردپرس

      سلام
      فعلا که برای تصویر نیست! فرمت قابل تعریف خودش رو میپذیره

  4. عالی بود

  5. سلام. خیلی ممنون. فقط یه خواهشی داشتم. اگه ممکنه آموزش ایجاد متاباکس همراه با ادیتور هم اضافه کنیم
    که برای مثال در زیر ادیتور اصلی، یک ادیتور دیگه هم اضافه بشه و مقدار آن در single ظاهر شه.
    چون دنبال این آموزش خیلی گشتم و خوشحال میشم این آموزش را هم اضافه کنید.
    ممنون!

  6. سلام ممنون
    من یه مشکل دارم برای دریافت عکس ضمیمه شده وقتی این رو می نویسم
    $im = get_post_meta($item->ID, ‘wproto_attached_images’);
    ای دی یک متای دیگر از جدول wp_postmeta را نشان میدهد که با مراجعه به جدول متوجه شدم این ای دی هم به یک متای دیگر reference دارد من هنگام ضمیمه کردن عکس به متا باکس از عکس های قبلی attache شده استفاده کردم این که ای دی عکس قبلی رو زخیره کنه شاید منطقی باشه اما چطور میشه از این سیکل در ورد پرس به url عکس رسید ؟
    با تشکر

  7. خیلی مفید بود
    تشکر

  8. سلام
    ممنون خیلی خوب بود
    به سایت ما سر بزنید
    شاد باشید

  9. به درد بخور بود. خیلی ممنون همیار همیشگی 🙂