چند نکته مفید برای استفاده از هوک ها – قسمت دوم

تاریخ : ۲۸ دی ۱۳۹۴ | دسته بندی : مقالات,وردپرس | برچسب ها : ,,,,,,

در ادامه :

THE_CONTENT

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

همان طور که در the_content() می توانید ببینید ، یک فراخوانی به get_the_content() وجود دارد . من در چندین تم دیده ام که دومی به جای اولی به کار رفته است .به هر حال ، این ، هوک را نادیده می گیرد و چندین ویژگی از جمله فرمت بندی پیش فرض پست کار نخواهند کرد .

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

پارامترهای یک هوک روتین

متداول ترین پارامترهایی که در زمان ساخت یا شکال زدایی یک هوک روتین باید بشناسید ، نام هوک ، نام تابع ، اولویت و آرگومان هایی هستند که به تابع می دهید .

نیازی به گفتن نیست ، جزئیات سردرگم کننده اند .

یک فراخوانی مقدماتی به add_filter() ، مانند این به نظر می رسد که تمامی پارامترها را در بر می گیرد :

نام گذاری یک هوک ($TAG)

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

یک محاسبه سرانگشتی که خودم هم از آن پیروی می کنم آن است که action ها باید محتوی لحظه فراخوانی شان باشند و فیلتر ها باید محتوی لحظه و مقداری باشند که قرار است تغییر کند .

wp_head و wp_footer نمونه های خوبی از action  هایی هستند که براساس یک موقعیت فراخوانی می شوند . علاوه براین ، استفاده از یک پسوند یا پیسوند مانند before ، pre ، begin ، after و end هم رایج است .

تابع wp_delete_post() که مسئول حذف یک پست است ، شامل هوک های زیر می شود :

  • before_delete_post
  • delete_post
  • deleted_post
  • after_delete_post

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

 

پیشوند نام هوک

به جز موقعیت و مقدار ، باید برای هوک خود یک پیشوند هم انتخاب کنید که آن را به عنوان هوک اختصاصی تان معرفی کند . در اینجا چند مثال آورده ام :

  • wpseo_ از Yoast SEO
  • genesis_ از چارچوب Genesis
  • advanced_ads_ از افزونه my Advanced Ads

این کار دو هدف دارد.

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

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

نام های هوک پویا

تصور کنید در افزونه خود گزینه های فراوانی دارید و می خواهید سایر افراد بتوانند در هریک از آن ها یک فیلتر به کار ببرند . شما می توانید یا برای هر گزینه apply_filters() را فراخوانی کنید یا از ایده یک نام هوک دینامیک استفاده کنید ، مانند آنچه هسته وردپرس در تابع get_options() انجام می دهد .

آن محتوی هوکهای زیر است :

  • pre_option_’ . $option
  • ‘default_option_’ . $option
  • ‘option_’ . $option

با دانستن این می توانید برای تغییر نام یا توصیف پویای بلاگ به داخل option_blogname یا option_blogdescriptionهوک بزنید

شاید دلیل این که نمی توانید هوکی را که درباره اش خوانده اید بدون خلاصه کردن قسمت پویای آن در سورس کد بیابید ، همین باشد .

 

“ALL” جادویی

تگ ویژه all را می توانید در زمان فراخوانی add_action() و add_filter() به عنوان نام یک هوک استفاده کنید . این باعث می شود که تاع هوک خورده برای هر هوک (هم actionها و هم فیلترها ) استفاده شود .

تنها زمانی که من به این نیاز داشته ام ، اشکال زدایی محیط کامل هوک بوده است .

نام های تابع

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

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

هوک زدن یک تابع استاتیک در یک کلاس هم شدنی است :

فراخوانی آن در نمونه ای از این کلاس به صورت زیر خواهد بود :

در مثال همان کلاس می توانید یک روش را هم فراخوانی کنید . به این شکل :

مطمئن شوید که این تابع ها عمومی هستند .

 

از تابع های PHP پیش فرض هم استفاده کنید

گاهی اوقات نیازی به ایجاد تابع های خودتان نیست .

این هوک روتین اولین حرف هر کلمه در عنوان پست را به حرف بزرگ تبدیل می کند :

از آنجایی که ucwords()  یک تابع PHP عادی است که یک مقدار را مانند هر فیلتر تابع دیگر دریافت و بازگردانی می کند ، می توانید این چهار خط را به این شکل هم خلاصه کنید :

 

اولویت

سومین پارامتر در add_action() و add_filter() اولویت است . آن ترتیبی را که چندین تابع هوک خورده در آن فراخوانی می شوند ، تنظیم می کند .

این پارامتر اختیاری است ، و در صورتی که تعریف نشده باشد به طور پیش فرض معادل ۱۰ تنظیم می شود . چندین تابع با اولویت یکسان در ترتیبی که در هوک ثبت شده اند فراخوانی خواهند شد .

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

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

اطمینان از این که یک action تا کنون اتفاق افتاده است

برای بررسی اینکه یک antion خاص تاکنون اجرا شده است یا خیر ، می توانید از did_action() استفاده کنید . شاید به یاد داشته باشید که _wp_render_title_tag به wp_head هوک خورده بود . این مثالی است که هسته چگونه مطمئن می شود تگ title فقط در آنجا ایجاد شده است .

 

 

 

did_action( $hook ) تعداد زمان هایی که یک action راه اندازی شده است از جمله فراخوانی فعلی را بازگردانی می کند . درصورتی که _wp_render_title_tag() اکنون در wp_head در حال راه اندازی باشد ، مقدار ۱ را بازگردانی می کند . doing_action( ‘wp_head’ )  اطمینان می دهد که ما درست همین لحظه در دستور wp_head هستیم . کد بالا عملا یک double-check است ، که شاید همین دلیل حذف شدنش از وردپرس۰-۴-۴ باشد .

doing_action() فقط بررسی می کند که آیا یک action در حال رخ دادن است یا خیر ، اما منطق در پس آن موضوعی برای کل مقاله های دیگر است .

 

بررسی در حال استفاده بودن یک فیلتر

did_action() و doing_action() برای فیلترها هیچ نام مستعاری نداردند . در عوض لازم می شود که از has_filter( $hook, $function ) استفاده کنید . اگر فقط $hook تعیین شده باشد ، درصورتی که تابعی رای هوک ثبت شده باشد true را بازگردانی می کند و در غیر این صورت false .

اگر $function داده شده باشد ، اولویت این تابع را بازگردانی می کند و اگر تابع در هوک ، هوک نخورده باشد false را بازگردانی می کند .

هنگام تزریق آگهی پس از یک پاراگراف خاص ، افزونه my Advanced Ads باید مطمئن شود که wpautop() قبل از به کارگیری تابع my own filter فراخوانی می شود .

در این اسنیپت ، من بررسی می کنم که آیا اولویت wpautop() از اولویت تزریق آگهی بالاتر است یا خیر . یعنی این کع پاراگراف ها هنوز تنظیم نشده اند ، و آن افزونه را وادار می کند که ابتدا آن ها را ایجاد کند .

 

آرگومان ها

 

در حالی که هوک های فیلتر حداقل به یک آرگومان نیاز دارند ( مقداری که فیلتر می شود) ، actionها به آن نیازی ندارند . به هرحال منظورم این نیست که هر دو نمی توانند بیشتر از این داشته باشند .

حال بیایید به هوک delete_term نگاهی بیندازیم که پس از حذف یک اصطلاح از پایگاه داده ها راه اندازی می شود .

هنگام استفاده از تابع add_action() یا add_filter() ، چهارمین پارامتر تعداد آرگومان هایی است که action یا فیلترتان انتظارشان را دارد .

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

 

این action فقط به سه آرگومان اول علاقمند است ، و نه به $deleted_term

 

 

تعداد دام آرگومان ها

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

من همواره با آرگومان ها این مشکل را دارم ، زیرا کاملا اختیاری نیست . اگر تابع تان به آرگومان های بیشتری نیاز دارد ، باید آن ها را تنظیم کنید ، در غیر این صورت پیام خطایی برایتان ارسال می شود . اگر آن ها را تنظیم کنید ، باید اولویت شان را هم تنظیم کنید که این در بسیاری از موارد اختیاری است .

شروع کردن با بازگردانی

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

اکنون من فیلترهایم را با عبارت return $value در انتها شروع کرده ام که مشکلاتی مانند این را به حداقل رسانده است .

حذف action ها و فیلترها

حذف یک action یا فیلتر از هوک کار غیرمعمولی نیست . یک مثال معمول حذف emojis از وردپرس ۲/۴ است .

کل افزونه Disable Emojis را می توان در کد زیر خلاصه کرد :

 

و افزونه هایی هم وجود دارند که تابع wpautop() را غیرفعال می کنند ، که در فایل functions.php تم فقط می توانند یک خط باشند :

همان طور که ممکن است از این مثال ها حدس زده باشید ، remove_action() و remove_filter() سه آرگومان می گیرند :

  • هوک
  • تابع
  • اولویت

همه آن ها باید با مقدارهای مربوط به add_action() و add_filter() مطابقت داشته باشند . مشکل این بخش اینجاست که ارتباط در صورتی حذف خواهد شد که اضافه شده باشد .

چگونه هوک ها را بیابیم ؟

فکر کردن درباره ۱۹۵۷ هوک فعلی وردپرس (براساس پایگاه داده های آدام براون) کمی ترسناک است ، اما نیازی نیست که آن ها را یاد بگیرید . تنها چیزی که باید بدانید آن است که برای تغییر یا اضافه کردن هرچیز به طور احتمال یک هوک وجود دارد .

برای شروع کار ، می توانید در میان تابع هایی که در حال حاضر در کد فعلی خود استفاده می کنید جستجو کنید ، مانند آن چه من در بالا با wp_head() و the_content() انجام دادم .

منبع دیگر ، صفحه مربوط به افزونه API است که تابع های مهم و جزئیات آن ها را فهرست بندی می کند .

اشکال زدایی هوک ها

برای رفع اشکال گسترده هوک ها می توانید فهرستی از تمامی action ها و فیلترهای هوک شده را ایجاد کنید ، مانند آن چه Jean Baptise Jung انجام داده است .

استفاده از  ERROR_LOG()

برای اشکال زدایی فیلترها به ویژه در محیط های زنده ، من دوست دارم از error_log() به همراه DEBUG_LOG فعال شده استفاده کنم . این خروجی من را در یک فایل debug.log می نویسد ، اما آن را در صفحه اول نشان نمی دهد .

من در سناریوی بالا رشته HAHA را از ابتدا به محتوا افزوده ام ، اما فقط درصورتی که گزینه من true را بازگردانی کند . اگر این به هر دلیلی کار نکند ، می توانم از error_log( $option ); برای اشکال زدایی مقدار گزینه ، نوشتن آن در تاریخچه برای بررسی در آینده ، بدون قطع محتوا که برای بازدیدکنندگان در صفحه اول قابل رویت باشد ، استفاده کنم .

استفاده از هوک API

روش دیگری برای اشکال زدایی هوک ها ، استفاده از تابع هایی مانند doing_action() یا did_action() است که در بالا ذکر کردم .

از این فهرست یکی جامانده است ، current_filter() ( یا current_action() ) . شما می توانید از آن برای نمایش نام هوک فعلی استفاده کنید ، مانند مثالی که از Codex گرفته شده است :

 

اگر می خواهید جایی را ببینید که هسته از این ها استفاده کرده است ، capital_P_dangit() را چک کنید . حاضرم شرط ببندم که اکثر شما از وجود چنین فیلتری اطلاع ندارید .

استفاده از یک افزونه

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

شروع کار

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

حسن موحد

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

ارسال نظر

نظرات مطلب