دوره مجازی قالب وردپرس (جلسه 26): زمینه های دلخواه در وردپرس



visibility  
mode_comment   ۷۴

به نام خدا و سلام.با بیست و ششمین جلسه از دوره مجازی طزاحی قالب حرفه ای وردپرس در خدمت شما هستیم. در جلسه قبل ما بخش حلقه های وردپرس رو پیاده سازی کردیم و حالا قصد داریم با استفاده از زمینه های دلخواه امکانات بیشتری رو برای قالبمون پیاده سازی کنیم. زمینه های دلخواه برگرفته از مفهومی پایه ای تر به نام meta data هستند که در واقع خود داده هایی هستند که داده ها را توصیف می کنند. در این مطلب مفهوم meta data رو بررسی می کنیم و سپس به سراغ پیاده سازی ان به عنوان زمینه های دلخواه در ورد پرس خواهیم رفت.

در این جلسه خواهیم دید:

  • مفهوم زمینه های دلخواه و meta data
  • پیاده سازی meta data در وردپرس و معرفی جدول post meta
  • پیاده سازی نمایش و دخیره تعداد بازدید مطلب
  • معرفی متاباکس ها و کاربرد آنها
  • پیاده سازی متاباکس برای ذخیره اسلایدر تصاویر
info توجه

این مطلب یک جلسه از آموزش طراحی قالب وردپرس می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

ثبت نام در آموزش طراحی قالب وردپرس

comment دیدگاه کاربران
مصطفی فدائی replyپاسخ

سلام اقای علی محمدی یک چیزی مثل آمار سایت سون لرن رو هم آموزش بدید ممنون

کیوان علی محمدی

سلام اگه وقت کردیم حتما در انتهای دوره قرار میدیم.

reza_yki replyپاسخ

سلام ببخشید که این همه سوال می کنم چه طوری میشه مثل همین صفحه برای دسته ای خاص مطالب قبلی و بعدی رو درست کرد
من برای همه دسته ها می تونم این کار رو بکنم ولی می خوام فقط برای بعضی دسته ها این امکان باشه
ممنون

کیوان علی محمدی

سلام چیزی که دنبالش میگردین دو تا تابع وردپرس به نام های previous post link و next post link هسا مه با توجه با آرگومان های اون میشه تنطیم کرد از دسته بندی بخونه. اما برای اینکه فقط برای دسته بندی های خاصی نمایش داده بشه باید با تابع in_category قبلش چک کنید اون پست شما به اون دسته بندی تعلق داره یا نه.

shaniya ahmadi replyپاسخ

سلام ، خستە نباشید استاد

کیوان علی محمدی

ممنونم. شما هم خسته نباشید.

AliMV replyپاسخ

سلام استاد یک سوال برام پیش اومد
اینکه تفاوت include و get_template_part در چی هست چون هر دو یک کار رو انجام میدن !
و شما در بعضی جاها get_template_part و در بعضی دیگر include کردین.

همچنین یک پیشنهاد دارم که ممکنه برای همه بکار بیاد

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

تشکر فراوان

کیوان علی محمدی

سلام معمولا برای اضافه کردن فایل هایی که کدهای html دارن و جز قالب هستن از get_template_part استفاده میشه ولی برای کدهای php و ماژول های دیگه از include یا require استفاده میشه. علاوه بر این get_temaplte_part برای اضافه کردن فایل های نمایشی قالب (sidebar-single-loop) خیلی مناسب تره و انعطاف پذیری بیشتری داره (مثل اضافه کردن post-format ها)

زمان الله ابراهیمی replyپاسخ

سلام خدمت استاد عزیز خسته نباشید استاد فقط یک سوال
توی قالب ورد پرس من هر کاری مکنم $post->ID هر چی ریفرش میکنم نمیش ماره
حطا فایل تمرین را هم امتحان کردم نشد مشکل از کجا است به نظر شما تشکر

کیوان علی محمدی

سلام. داخل حلقه استفاده کردی یا به صورت global ؟

زمان الله ابراهیمی

همین فایل که توی این جلسه است را دانلود کردم اما بازدید نمیزه همهش صفره

کیوان علی محمدی

تابع set_post_view رو در فایل single.php اجرا کردین؟ باید مرحله به مرحله خروجی بگیرین تا ریشه مشکل مشخص بشه.

sajadprm replyپاسخ

سلام استاد
من زمانی که از تابع get_post_view در قالب استفاده کردم برای نمایش تعداد بازدید ها
در پست نوع دانلود نمایش داده نمی شود ولی بقیه نمایش داده می شوند
مشکل از کجاست ؟

کیوان علی محمدی

سلام مشکل در پیاده سازی صفحات نمایش single برای مطالب دانلود هست که در جلسه 34 ام بررسی شده.

علی اصغر جهانی replyپاسخ

سلام استاد . من دقیقا مثل شما عمل کردم . ولی نمی دونم چرا فایل single.php را نمی شناسه . حتی یه دستور echo را هم امتحان کردم ولی چیزی چاپ نکرد کلا single.php را نمی شناسه . حتی فایل این جلسه رو هم کپی کردم داخل وردپرسم اما باز هم single را نمی شناسه .هر قالبی که امتحان کردم single رو نشناخت . مثل sahife مشکل از کجاست ؟

کیوان علی محمدی

سلام وقتی در همه قالب ها فایل single رو نمیتونه بشناسه احتمالا یا نصب وردپرس مشکلی داشته یا ایکه وب سرور تنظیم نیست. از چه نرم افزاری برای سرور استفاده می کنید؟

علی اصغر جهانی

ممنون بابت پاسخ سریع . wamp server

علی اصغر جهانی

با سلام مجدد . نمی دونم چرا ولی وقتی وردپرس رو روی xampp نصب کردم درست شد . 🙂

کیوان علی محمدی

کلا بهتره از xampp استفاده کنید.

علی اصغر جهانی replyپاسخ

سلام استاد ببخشید اینقد حرف می زنم . برای custom post type ها نمیشه رفت داخل فایل single هم از the_permalink استفاده کردم هم از get_permalink و هم از get_the_permalink دیگه نمی دونم چه کار کنم . از فایل single-download.php هم استفاده کردم . اما نتیجه ای نداد . مشکل از کجاست ؟

کیوان علی محمدی

سلام بهتره بعد از اضافه کردن فایل single-download.php بری و تنظیمات پیوندهای یکتا رو تغییر و دوباره ذخیره کنی.

علی اصغر جهانی

مرسی حل شد باید روی حالت ساختار دلخواه گذاشت .

علی اصغر جهانی

سلام مجدد . من کدی را که درباره wp_Query اسلایدر واسه اینکه مقادیر مخالف خالی را در اسلایدر نمایش بده امتحان کردم ولی اسلایدر هایی را هم که خالی بود نمایش داد .ولی این کد که امتحانش کردم درست شد

[php\]$main_slider_query_args = array(
‘meta_key’ => ‘slider_image_url’,
‘meta_value’ => array(”),
‘meta_compare’ => ‘NOT IN’,
‘post_type’ => array(‘post’,’download’),
‘posts_per_page’ => 4
);
$main_slider_query = new WP_Query( $main_slider_query_args );
حالا سوالم اینکه ما که در تابع get_post_meta آرگومان آخر را true زدیم . چرا اینجا باید بگیم که مقدار آرایه خالی نباشه !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 😆

کیوان علی محمدی

شما اینجا meta_compare رو برابر NOT IN قرار دادین یعنی مقدار meta_value باید برابر آرایه باشه.یعنی مقادیری رو انتخاب کن که در اون آرایه وجود نداشته باشه.

majid zare replyپاسخ

سلام
با هر بار باز شدن یک پست در فایل single دقیقا بازدید پست قبلی هم افزایش پیدا میکنه.
مثلا پست id=10 در single باز میشه یکی به متای تعداد بازدید پست با id=9 هم اضافه میشه .
همه کدها را کنترل کردم. به نظر شما علت ممکنه چی باشه؟
نمیشه که در هر بار اجرای single دو تا id ارسال بشه
در ضمن تابع wp_head را که حذف می کنم درست میشه!

کیوان علی محمدی

بهتره در تابع افزایش تعداد بازدید یک مقداری رو چاپ کنید و بررسی کنید که واقعا تابع دوبار داره اجرا میشه یا نه و بعدشم آیدی پستی که به عنوان پارامتر میاد تابع رو در خروجی چاپ کنیدو این رو هم بررسی کنید.

majid zare replyپاسخ

بله کنترل کردم توابع مشکلی نداشت وبه راحتی در فایل single هم id و هم تعداد نمایش داده میشه
ممکن هست اشکال از wamp باشه
من از wamp استفاده می کنم و جستجویی که کردم بعضی دوستان wamp را علت این جریان بیان کردند. چطور کنترل کنم؟

عجیب اینکه با حذف wp_head() کاملا درست میشه. فکر می کنم چیزی تداخل داره

majid zare replyپاسخ

فکر میکنم مشکل حل شد.
در جستجویی که داشتم متوجه شدم تابع wp_head در افزایش غیر اصولی بازدید پستها دخیل هست بنابر این این خاصیت غیر اصولی با کدremove_action زیر غیر فعال و شمارش به صورت صحیح انجام می شود.


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

کیوان علی محمدی

سلام تا اونجایی که میدونم این اکشن برای نمایش لینک مطالب مرتبط با پست فعلی در بخش head استفاده میشه.این فقط نمایش لینک هستش در بخش head هستش و خیلی بعیده که به این قضییه مرتبط باشه. چون ما وقتی افزایش بازدید داریم که بک درخواست get به صفحه مربوطه ارسال بشه در غیر این صورت نباید بازدیدی ثبت بشه.

majid zare

این مشکل فقط در فایر فاکس ایجاد می شود و اما علت آن:
wp_head کدهایی را به ابتدای فایل header اضافه میکند از جمله موارد زیر :

مرورگر فایرفاکس این احتمال را می دهد که شما به پست بعدی نیز مراجعه می کنیدپس یک پیش بازدید از لینک پست بعدی که توسط rel=’next’ مشخص شده انجام می دهد تا بازدید شما سریع تر انجام شود و همین باعث فعال شدن تابع set و شمارش اضافی می شود.
ما با این اکشن دو لینک مورد اشاره را حذف می کنیم.
ممنون

کیوان علی محمدی

خوب پس همون طوری که گفتم مروگر داره درخواست get ارسال میکنه که باعث افزایش بازدید شده. موفق باشید.

majid zare

بله
لطفا لینک ها را در پاسخ من فعال کنید
تشکر

majid1400 replyپاسخ

سلام
نظرتون راجع به پلاگین Meta Box که در سایت وردپرس ارائه می شود چی هست، می تونیم از این پلاگین استفاده کنیم و کد نویسی نکنیم؟

کیوان علی محمدی

سلام بله این پلاگین هم مناسبه

amir baragy replyپاسخ

سلام
آیا $post برای وردپرس یک متغییر تعریف شده است ؟ یعنی خود وردپرس متوجه میشه که منظور ما پست جاری هست ؟ یا خیر؟

2) چرا ما برای meta_key نام قرار دادیم (views) مگر نباید از نامی که داخل دیتابس هست استفاده کنیم ؟ منظورم اینه که meta_key ی که وجود داره برای پست ، باید با post_idی آن تطبیق داشته باشه تا بتونیم از مقدار آن پس استفاده کنیم.

کیوان علی محمدی

سلام بله وقتی متغییر post به صورت global تعریف بشه تمام اطلاعات مطلب جاری رو داخل خودش داره.
ما برای یک مطلب می تونیم meta_key های زیادی ایجاد کنیم به همین خاطر هم به خود meta_key نیاز داریم و هم post_id

amir baragy replyپاسخ

استاد بی زحمت پاسخ سوالاتم رو بدهید ممنون میشم. توی قسمت های قبلی هم چند تا سوال پرسیدم .
تشکر

کیوان علی محمدی

سلام حتما.

ndr053 replyپاسخ

سلام جناب علی محمدی
من یک مشکلی پیدا کردم
من متا دیتاها و متا باکس خودمو ساختم و بدرستی هنگام نمایش پست اطلاعات من کار میکنه
اما زمانیکه پست زمان بندی شده منتشر میکنم زمانی که منتشر میشه تمامی اطلاعات متا باکس و دیتا پاک شده
بخاطر کد زیر نیستش

کیوان علی محمدی

سلام دوست عزیز. این اکشن در تمامی حالات ذخیره مطلب در وردپرس اجرا میشه پس باید حواستون باشه که حالات مختلف مطلب رو بررسی کنید.

ndr053

بله درسته
من الان بررسی کردم دیدم این شرط موقعی که از پست های زمان بندی شده یا timestamp استفاده میشه true نمیشه و else شرط if اجرا میشه:

بنظر شما راه حل چیه؟

کیوان علی محمدی

اگه بلاک else خیلی مهم نیست پس بهتره برش دارین. می تونید از post status transition هم استفاده کنید که اکشن هایی رو مشخص می کنه در تغییر وضعیت مطالب اجرا میشه مثلا اگر مطلب از زمان بندی شده به منتشر شده بره اکشن future_to_publish اجرا میشه.

ndr053

جناب علی محمدی مشکل حل شد و ممنونم از دوره بی نظیرتون

فرهاد replyپاسخ

با سلام
استاد علی محمدی شما در صفحه single برای دریافت id پست از کد زیراستفاده کردید:

اما من این کد رو که استفاده می کنم آی دی رو فقط برای post type های post و page میده. متاسفانه من نمی تونم آی دی custom post type هارو به این روش دریافت کنم. می تونید راهنمایی کنید مشکل از کجاست؟

کیوان علی محمدی

متغییر post رو با تابع var_dump اجرا کنید بررسی کنید چه خروجی بهتون میده.

فرهاد

ممنون استاد. من جواب این مشکل رو پیدا کردم. سوالم رو توی stackoverflow پرسیده بودم. اینجا لینکش رو می ذارم تا بقیه دوستان هم استفاده کنن:
http://stackoverflow.com/questions/39301836/get-the-id-of-custom-post-type-in-single-page

کیوان علی محمدی

خواهش میکنم. شما هر وقت post type ایجاد می کنید باید اون تابع رو فراخوانی کنید تا وردپرس اطلاعات مورد نظر رو به query vars منتقل کنه و به اطلاعات مطلب دسترسی داشته باشه.

محمد نيك عيش replyپاسخ

سلام استاد شما برای اینکه با هر بار بازدید پست بیاد نشون دهد چند بار مشاهده شده اومدید تابع ساختید که مقدار متا رو بگیره سوالم اینه که چرا پارامتر تابع را پست آیدی گذاشتید میشه توضیح بدید
خوب آموزش میدید ولی بعضی جاها رو توضیح نمیدید مثله همین پارامترها که چرا پست آیدی باشه
مثلا برای داینامیک کردن اسلایدر نگفتید چرا از get_the_title به جای the_title استفاده میکنید ممنون میشم راهنماییم کنید

کیوان علی محمدی

سلام محمد عزیز. خوب برای سوال اول باید بگم وقتی تابعی رو می نویسیم باید بتونیم در جاهای مختلف ازش استفاده کنیم. من پست آیدی رو بهش پاس میددم تا هر جایی از قالب یا افزونه بتونم تعداد بازدید های یک مطلب رو دریافت کنم. برای مطلب دوم باید بگم مه the_title مقدار رو مستقیم در خروجی چاپ میکنه و get_the_title مقدار رو return میکنه و برای جاهایی که تابع می نویسیم استفاده از get_the_title بهتر هستش.

محمد نيك عيش replyپاسخ

میشه به جای پست آیدی که پارامتر تابع قرار دادید بیایم پارامتر را veiw یا همون meta_key قرار بدیم و بیاد تو دیتابیس بررسی کند متاکی هایی که veiw هستند طبق پست آیدی مقدارشون رو افزایش دهد

کیوان علی محمدی

سلام اینطوری فقط میزان محاسباتت زیاد تر میشه چون مثلا اگه meta_key و ارسال کنی اولا که جاهای دیگه از تابعت نمیتونی استفاده کنی مگر اینکه post id رو همراهش ارسال کنی. حالا اگه فرض کنیم هم post id و هم meta_key رو ارسال کنی مطمئنا اسم تابعت باید عوض بشه چون فقط قرار نیست میزان بازدید ها رو تغییر بده یا دریافت کنه و اون موقع باید کدهای بیشتری برای هندل کردن موارد دیگه ای بنویسی اما بازم اگر فرض کنیم که post id و meta_key رو ارسال کنی و فقط هم ازش برای تعداد بازدید ها استفاده کنی که این کار بیهوده هستش و لزومی به ارسال آرگومان meta_key نیستش.

mohfp replyپاسخ

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

کیوان علی محمدی

سلام. post_id یک متغییر php هستش ولی post->ID یعنی خاصیت ID از شی post

سحر بشری replyپاسخ

سلام وقتتون بخیرو من جدبدا هر وقت مشکلمو اینجا مطرح میکنم کسی جوابمو نمیده خواهش میکنم ایندفعه جواب بدید.
من رو هر کدوم از post type ها کلیک میکنم بجای اینکه تعداد بازدید کننده ها داخل بانک تغییر کنه و صفحه ای که به فایل single متصل هست رو نمایش بده هیچ تغییری نشون داده نمیشه. و این خطا در صفحه جدید نشون داده میشه. مثلا در ادرس/دانلود-اولین-مطلب/ http://7learn.dev/download این خطا رو میده:
Object not found!

The requested URL was not found on this server. The link on the referring page seems to be wrong or outdated. Please inform the author of that page about the error.

If you think this is a server error, please contact the webmaster.
Error 404
7learn.dev
Apache/2.4.23 (Win32) OpenSSL/1.0.2h PHP/5.6.24

کیوان علی محمدی

سلام. این مشکل به خاطر وردپرس نیست. بلکه وب سرور شما مشکل داره و به درستی نمیتونه آدرس ها رو بخونه یا اینکه ساختار آدرس ها در وردپرس مشکل پیدا کرده. بهتره برای راه حل اول قسمت پیوند های یکتا رو به روز رسانی کنید.

سحر بشری

سلام ممنون از پاسخگوییتون.خیلی کمکم کرد . درست شد

کیوان علی محمدی

خواهش میکنم. موفق باشید.

زارعی هوشیار replyپاسخ

سلام…خسته نباشید اقای علی محمدی
شما در کد هاتون اول تگ پی اچ پی رو بستین بعد باز کردی!!!!!این دقیقا چیکار میکنه …تو دوره پی اچ پی همچین چیزی نبود…..یه اشاره ای میکنید دقیقا چرا ودر چه مواقعی همچین کاری میکنیم؟ ممنون

کیوان علی محمدی

سلام برای نمایش html در کدهای php این کارو انجام میدیم.

زارعی هوشیار

سلام ..اقای علی محمدی….من تو مبحث این جلسه…میخوام تعداد بازدید ها رو درست کنم در فایل single.php کد های مربوطه قرار دادم….ولی برای هر پست فقط یکبار یه مقدار بهش اضافه میکنه….و فقط یک بار هم مقدارشو از دیتا بیس…میخونه…..یعنی الان مقدار موجود در ۲ هستش…ولی هرکاری میکنم فقط در بازدید ها ۱ رو نشون میده…مقدار شو دستی در دیتا بیس ۱۰ کردم ولی باز ۱ نشون میده….میشه راهنماییم کنید….؟

کیوان علی محمدی

سلام. یک تابع برای افزایش بازدید ها و یک تابع برای خوندن تعداد بازدید ها. هر دو تا تابع باید در فایل single.php فرخوانی بشن.حتما روند رو دوباره چک کنید.

زارعی هوشیار

استاد طبق گفته های شما عمل کردم..ولی فعلا درگیرم …..ممنون از پاسختون

زارعی هوشیار

ولی طبق آموزش هاتون تو این جلسه تابع افزودن تو single.php بود و خواندن داخل loop….باز دقت بیشتری میکنم ….ممنون از پاسختون

کیوان علی محمدی

خوب ما loop رو چندین جا می تونیم استفاده کنیم. در صفحه single.php هم از loop استفاده می کنیم.

زارعی هوشیار

اقای علی محمدی حل شد…..مشکل از پارامتر سوم get_post_meta بود که به صورت false بود و آرایه بر میگردوند …..که با true کردن درست شد….مشکلی که تو هیچ یک از کامنتهای این جلسه نبووود…‌.ببخشید بی دقتی از ما بووود………تشکر از پاسخ هاتون….

کیوان علی محمدی

خواهش میکنم و موفق باشید.

boyit replyپاسخ

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

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

img src=”uundefined” height

ایراداز کجا میتونه باشه

کیوان علی محمدی

سلام بهتره مرحله به مرحله اطلاعات رو log کنید تا ببینید مشکل کار کجاست.مثلا اون مقدار undefined از کجا میاد و متغییرش چی بوده.

اشکان باقری replyپاسخ

سلام استاد خسته نباشین. ی سوالی داشتم. در توابع زیر که در فایل functions نوشتیم ما هیچ کجا آیدی post رو به توابع پاس ندادیم پس وردپرس چگونه تشخیص میده که این متغییر post_id آیدی post مورد نظر ما هست؟

function get_post_view($post_id){

    if(intval($post_id)){

        $post_view = get_post_meta($post_id,’views’,true);
        return intval($post_view);

    }

    return 0;

}
function set_post_view($post_id){

    if( intval( $post_id ) ){

        $views = get_post_view($post_id);
        $views++;
        update_post_meta($post_id,’views’,$views);
    }

}
اشکان باقری

نبود؟؟؟؟؟؟؟؟؟؟

اشکان باقری

ممنون خودم فهمیدم اشتباهم از کجا بود….

کیوان علی محمدی

این توابع در فایل single فرخوانی میشن و اونجا باید آیدی رو بهشون پاس بدیم. همون طور که می بینید این توابع آیدی مطلب رو به صورت پارامتر دریافت می کنن.

y-sharif replyپاسخ

سلام استاد . خسته نباشید .
اگه بخوایم یه ادیتور مثل ادیتور اصلی وردپرس یا با امکانات کمتری درست کنیم توی متاباکس ها باید چیکار کنیم ؟

کیوان علی محمدی

سلام ساده ترین راه استفاده از تابع wp_editor هستش.

ارسال نظرات

کاربر گرامی، امکان ارسال نظر و پشتیبانی برای دوره های مجازی فقط برای دانشجویان این دوره امکان پذیر می باشد.