کار با Repeater در ACF
تصور کنید در میانه بهینهسازی ساختار سایت یک کلاینت هستید. قرار است برای صفحه محصولات، یک بخش «سؤالات متداول» یا یک «اسلایدر اختصاصی از تصاویر» طراحی کنید؛ و از طرف دیگر، نیاز دارید نظرات واقعی مشتریان را دقیقاً به محصولی که خریدهاند متصل کنید. در حالت عادی، وردپرس امکانات محدودی برای ایجاد چنین ساختارهای داینامیک و منعطفی به شما میدهد. اینجا دقیقاً همان نقطهای است که افزونه ACF (Advanced Custom Fields) به عنوان یک ابزار قدرتمند، دست یک کارشناس سئو و طراح سایت را برای خلق هر ساختاری باز میگذارد.
برای مدیریت دادههای پیچیده در سایت، صرفاً ساختن چند فیلد متنی ساده کافی نیست. شما با چالشهایی روبهرو میشوید که نیازمند مدیریت دادههای تکرارشونده و برقراری ارتباط معنادار بین انواع محتوا (Post Types) در دیتابیس است. در این مسیر آموزشی، قرار است با دو بازوی قدرتمند ACF و نحوه نمایش آنها در ظاهر سایت آشنا شویم.
مدیریت دادههای بینهایت با فیلد تکرارکننده (Repeater)
گاهی اوقات ما با محتوایی روبهرو هستیم که تعداد مشخصی ندارد و مدام تکرار میشود. بهترین مثال برای این حالت، بخش سؤالات متداول (FAQ) است. شما نمیدانید یک محصول قرار است سه سؤال متداول داشته باشد یا ده تا.
اگر بخواهید برای هر سؤال یک فیلد مجزا (سؤال ۱، سؤال ۲، سؤال ۳ و…) بسازید، هم پنل مدیریت سایت را به شدت شلوغ و گیجکننده میکنید و هم ساختار استانداردی نخواهید داشت. راهحل هوشمندانه، استفاده از فیلد تکرارکننده یا Repeater است.
با این فیلد، شما یک بلوک شامل دو زیرفیلد (مثلاً یکی برای پرسش و یکی برای پاسخ) میسازید. حالا کاربر یا مدیر سایت میتواند با یک کلیک ساده، تا بینهایت از این بلوکها ایجاد کند و سؤالات جدیدی بنویسد. البته قابلیت کنترل نیز در دستان شماست؛ میتوانید تعیین کنید که مدیر سایت حداقل ۱ و حداکثر ۴ آیتم بتواند وارد کند تا طراحی سایت به هم نریزد.
یک نکته طلایی در نامگذاری فیلدها: هنگام ساخت زیرفیلدها، نام متغیرها (Variables) را معنادار انتخاب کنید. به جای استفاده از نامهای نامفهومی مثل t4 یا text_5، از کلماتی مثل question (برای پرسش) و answer (برای پاسخ) استفاده کنید. این کار باعث میشود بعدها هنگام فراخوانی اطلاعات یا زمانی که شخص دیگری روی کدها کار میکند، دچار سردرگمی نشوید.
کاربرد این فیلد فقط به سؤالات متداول ختم نمیشود. ساخت اسلایدرهای تصویر از دیگر کاربردهای جذاب آن است. شما میتوانید فیلدی بسازید که شامل یک تصویر و یک لینک باشد و مدیر سایت به راحتی دهها اسلاید را بدون نیاز به ساخت فیلدهای مجزا به سایت اضافه کند.
فیلد ارتباط (Relationship)؛ خلق شبکهای از محتوا
یکی از استراتژیهای مهم در معماری سایت، ایجاد ارتباط درست بین بخشهای مختلف است. فرض کنید در سایت خود بخشی به نام «تجربه مشتریان» دارید که در آن ویدیوها یا متنهای رضایت کاربران را قرار میدهید. چقدر عالی میشود اگر بتوانید هر نظر را دقیقاً به صفحه محصول مرتبط با آن متصل کنید؟
فیلد ارتباط دقیقاً برای همین کار ساخته شده است. این فیلد به شما اجازه میدهد تا بین پستتایپهای مختلف (مثلاً مقالات با محصولات، یا نظرات با محصولات) یک پل ارتباطی بزنید.
- شما میتوانید تعیین کنید که این فیلد فقط پستتایپ «محصولات» را به مدیر سایت نمایش دهد.
- حتی میتوانید نتایج را فیلتر کنید؛ مثلاً فقط محصولاتی که وضعیت آنها «منتشر شده» (Published) است در لیست انتخاب قرار بگیرند و پیشنویسها نمایش داده نشوند.
- وجود قابلیت جستجو در این فیلد به مدیر سایت کمک میکند تا از بین صدها محصول، با تایپ کردن چند حرف (مثلاً “سگ” یا “ابلغ”)، سریعاً محصول مرتبط را پیدا کرده و به نظر مشتری متصل کند.
عبور از بکاند به فرانتاند؛ اطلاعات چگونه نمایش داده میشوند؟
شما تمام این فیلدها را در پنل وردپرس ساختید و اطلاعات را هم وارد کردید. اما اگر الان صفحه سایت را باز کنید، هیچ چیزی نمیبینید! چرا؟ چون اطلاعات در دیتابیس ذخیره شدهاند، اما ما هنوز به قالب سایت نگفتهایم که آنها را بخواند و نمایش دهد.
برای نمایش اطلاعاتِ فیلدهای ساده، از یک تابع کلیدی به نام get_field استفاده میشود. این تابع، واسطی است که فرانتاند (ظاهر سایت) را به بکاند متصل میکند. با وارد کردن نام متغیری که قبلاً ساختهاید (مثلاً نام فیلد تجربه مشتری) در این تابع، میتوانید محتوای آن را روی صفحه چاپ (echo) کنید.
البته سیستم باید بداند که این فیلد را برای کدام پُست یا محصول باید فراخوانی کند. به همین دلیل، توابع ACF هوشمندانه عمل میکنند و در صورتی که ساختار درستی چیده باشید، با دریافت ID هر پست، دقیقاً فیلدهای پر شدهی مختص به همان پست (مثل نظر مربوط به کاربر الف یا کاربر ب) را نمایش میدهند. اگر فیلدی برای یک پست خالی رها شده باشد، طبیعتاً در ظاهر سایت هم چیزی نمایش داده نمیشود.
چالش خواندن فیلدهای تکرارکننده (Repeater)
وقتی میخواهید اطلاعات یک فیلد متنی ساده را نمایش دهید، کار با یک get_field ساده تمام میشود. اما در مورد فیلد تکرارکننده (مثل همان سؤالات متداول) ماجرا کمی متفاوت است.
محتوای تکرارشونده در زبانهای برنامهنویسی و ساختار داده، به شکل آرایه (Array) ذخیره میشود. یعنی شما با یک کلمه یا یک جمله روبهرو نیستید، بلکه با یک بسته از اطلاعات طرف هستید که درون خودش بخشهای مختلفی (آیتم صفر، آیتم یک، آیتم دو…) دارد. اگر بخواهید یک آرایه را به صورت مستقیم نمایش دهید، سایت به شما خطا میدهد یا صرفاً کلمه Array را چاپ میکند.
برای دسترسی به محتوای درون این بسته، باید از حلقهها (Loops) استفاده کنیم. بهترین و پرکاربردترین حلقه برای این کار foreach است.
- حلقه foreach چه کار میکند؟ این حلقه وارد بستهی اطلاعات (آرایه) شما میشود و دانهدانه آیتمها را بیرون میکشد. مثلاً به آرایه سؤالات متداول میرود، آیتم اول را میگیرد، پرسش (question) و پاسخ (answer) آن را روی سایت نمایش میدهد و سپس به سراغ آیتم دوم میرود. این چرخه تا زمانی که تمام سؤالات نمایش داده شوند ادامه پیدا میکند.
ترفند عیبیابی: وقتی در تاریکی قدم میزنید
گاهی اوقات در حال پیادهسازی فیلدها هستید و ناگهان خروجی سایت آن چیزی نیست که انتظار دارید. نمیدانید دادهای که دریافت کردهاید یک متن ساده است یا یک آرایه!
در این لحظات، یک تابع بسیار کارآمد در PHP وجود دارد به نام print_r (یا توابع مشابهی مثل var_dump). این تابع مانند یک دستگاه اشعه ایکس عمل میکند. وقتی فیلد خود را درون print_r قرار میدهید، ساختار استخوانبندی و ماهیت دقیق آن داده را روی صفحه سایت به شما نشان میدهد. شما به وضوح میبینید که آیا با یک آرایه روبهرو هستید که زیرمجموعههایی مثل question و answer دارد یا خیر. دیدن این ساختار به شما مسیر را نشان میدهد: «آها! این یک آرایه است، پس الان باید برای نمایش آن از حلقه foreach استفاده کنم.»
درک عمیق از نحوه کار فیلدهای تکرارکننده و ارتباطی، و همچنین تسلط بر شیوه فراخوانی آنها در کدهای قالب، مرز بین یک توسعهدهنده سایت معمولی و کسی است که میتواند پیچیدهترین ساختارهای محتوایی و سئو را با نهایت ظرافت در وردپرس پیادهسازی کند. با لمس این مفاهیم در محیط واقعی و نوشتن چند خط کد ساده، متوجه میشوید که مدیریت دادهها چقدر میتواند شیرین و منطقی باشد.