فیلتر جدا گانه برای پست تایپ های سفارسی در وردپرس
دوشنبه, ۱۴ مرداد ۱۳۹۲، ۰۹:۰۵ ب.ظ
چند روز پیش ، توی یکی از پروژه ها نیاز داشتم که توی صفحه آرشیو پست تایپ ها ، که با استفاده از خود وردپرس ، یه فایل جدا بهش تعلق میگیره کاری کنم که توی کوری اصلی پارامتر
posts_per_pageرو تغییر بدم .ولی خب ، یه سری مشکلاتی وجود داره ، برای انجام این کار پیشنهاد میشه که موقعی که کاستوم کوری نوشته میشه ، توی آرگومان اصلی ، متغییر بالا رو دستی بهش عدد مورد نیاز رو وارد کنیم ، ولی توی صفحاتی مثل آرشیو مشکل پیش می یاد ، برای همین باید از فیلتر ها استفاده میکردم
که البته فیلتر زیر رو توی فانشن قالب اصلی قرار دادم :
function custom_get_posts( $query ) { if( is_post_type_archive('post_type_name') && !is_admin()) { $query->query_vars['posts_per_page'] = '1'; } return $query; }
add_filter( 'pre_get_posts', 'custom_get_posts' );
الان من یه فیلتر توی کوری اصلی سیستم فرار دادم ، اگه دقت کنید ، یه تابع هست به
نام custom_get_posts ، توی این تابع یه شرط گزاشتم ، که اگر نوع پست تایپ برابر بود با post_type_name و همینطور توی ادمین نبودیم ، این متغیر رو اعمال کنه ، اون دستور && یعنی هر دو شرط وجود داشته باشن .
یه سوال که پیش می یاد ، این هست که چرا دستور
!is_admin()رو قرار دادم ، خب ، برای این هست که این فیلتر که ما قرار دادیم توی کل سیستم اعمال میشه ، و اگه دستور بالا رو وارد نکنید ، موقعی که توی محیط مدیریت می خواید آخرین پست های ، پست تایپ مورد نظر رو چک کنید می بینید که فقط 1 پست نشون داده میشه ، پس ما شرط بالا رو گزاشتیم که دیگه این فیلتر توی محیط ادمین نباشه .
add_filter( 'pre_get_posts', 'custom_get_posts' );
بعد هم با دستور بالا ، این تابع رو به سیستم وارد کردم ، که قبل از ساخت کوری های اصلی ، در صورت موجود بود شرطها ، تابع رو اعمال کنه.
خب ، تا اینجا ما مشکلی نداشتیم .
ولی این دستوره یه مشکل عجیبی داشت ، برای مثال من توی صفحه آرشیو ، که قرار هست این فیلتر اعمال بشه ، چیزی حدود 5 تا ، کاستوم کوری داشتم ، که این شرط به همشون اعمال میشد :))
چاره چی بود ؟
اگه دقت کرده باشید ، گفتم که این شرط به سیستم می گه موقعی که می خوای این صفحه رو بساز ، اگه شرط ها بر قرار بود ، اونوقت این تغییر رو اعمال کن .
پس ما می تونیم یه کاری کنیم ، فقط کافی هست که این رو به سیستم بگیم ،که این شرط رو اعمال کنه ، ولی توی صفحه ای که نیاز داریم ، دیگه این فیلتر رو حذف میکنیم . امیدوارم متوجه منظورم شده باشید .
ببینید ، وردپرس توی صفحه هایی مثلا آرشیو ، خودش کوری میسازه ، یعنی متغییر هایی که پیشفرض خودش هست رو اعمال میکنه ، ما ابتدا می آیم ، اون متغییر پیش فرض رو دست کاری میکنم ، بعدش می تونیم متغییر هایی که نیاز داریم رو اعمال کنیم برای همین ،
بالای صفحه آرشیو دستور زیر رو اعمال میکنیم :
remove_filter( 'pre_get_posts', 'custom_get_posts' );الان با این کار ، 5 تا کوری که توی صفحه بود ، بدون مشکل کار میکنن و همینطور دیگه پارامتر های پیشفرض این کوری ها رو دستکاری نمیکنن.
سعی کردم ساده بگمش ، اگه مشکلی بود ، خوشحال میشم بپرسید :)
۹۲/۰۵/۱۴