وردپرس می تواند کارهای متعددی را به واسطه برخورداری از قابلیت ارزشمندی به نام هوک(Hook یا قلاب) انجام دهد، هوک ویژگی است که به یک رویداد گوش می دهد و به محض اتفاق افتادن آن رویداد کدهایی که به آن قلاب شده است را فراخوانی و اجرا می کند.
وردپرس بیش از ۱۰۰ هوک مختلف دارد که در بخش های مختلف وردپرس استفاده می شوند:
- یک هوک برای فراخوانی های Ajax
- یک هوک هنگام ذخیره یک نوشته یا Post
- یکی هنگام تایید دیدگاه یا Comment
- یکی هنگام حذف نوشته از زباله دان
- و …
هوک ها به دو دسته کلی اکشن(Action Hooks) و فیلتر(Filter Hooks) تقسیم بندی می شوند، اکشن و فیلتر توابعی هستند که اجازه می دهند کدهای سفارشی خود را در بخش های مختلف وردپرس به کمک توابع add_filter و add_action اجرا نمائید.
به عنوان مثال برای افزودن فایل های JS و CSS به یک قالب وردپرس حتما باید از اکشن هوک wp_enqueue_scripts به صورت زیر استفاده کنید.
function modiredev_enqueue_scripts(){
$uri = get_theme_file_uri();
wp_register_style( 'custom-css', $uri . '/assets/css/custom.css' );
wp_register_script( 'custom-js',
$uri . '/assets/js/custom.js',
array('jquery'), false, true);
wp_enqueue_style( 'custom-css' );
wp_enqueue_script( 'custom-js' );
}
add_action( 'wp_enqueue_scripts' , 'modiredev_enqueue_scripts' );
تابع add_action چهار پارامتر دارد که در کدهای بالا فقط از دو تای آن استفاده کردیم، تابع add_filter هم همین ساختار را دارد.
add_action( string $tag,
callable $function_to_add,
int $priority = 10,
int $accepted_args = 1
);
- اولین پارامتر نام هوکی است که می خواهیم به آن دسترسی داشته باشیم، مقدار این پارامتر رشته ای است و باید داخل کوتیشن باشد.
- پارامتر دوم تابعی است که می خواهیم در هنگام اتفاق افتادن هوک مدنظر(پارامتر اول) تریگر(Trigger)، اجرا یا فایر شود، اگر این تابع وجود نداشته باشد وردپرس خطا می دهد.
- سومین پارامتر الویت است که به صورت پیش فرض با ۱۰ مقداردهی می شود، یعنی اگر مقدار این پارامتر برای تابع add_action مشخص نشده باشد برای آن الویت اجرای ۱۰ در نظر گرفته خواهد شد، هر چه این عدد کوچکتر باشد الویت اجرای تابع بالاتر خواهد بود و بالعکس.
- چهارمین پارامتر تعداد آرگومان هایی است که یک تابع دریافت می کند، مقدار پیش فرض این پارامتر ۱ است.
برای اینکه بدانید هر هوک چه تعداد آرگومان می پذیرد حتما از مستندات وردپرس کمک بگیرد، مثلا اکشن هوک save_post بدین صورت تعریف شده است.
do_action( 'save_post', int $post_ID, WP_Post $post, bool $update )
اگر بخواهیم از این سه پارامتر استفاده کنیم لازم است تابع سفارشی را بدین صورت تعریف کنیم.
function modiredev_save_post( $post_ID, $post, $update ) {
// do stuff here
}
add_action( 'save_post', 'modiredev_save_post', 3 );
اگر فقط به پارامتر post_id$ نیاز دارید تابع سفارشی و add_action را اینگونه فراخوانی کنید.
function modiredev_save_post( $post_ID ) {
// do stuff here
}
add_action( 'save_post', 'modiredev_save_post', 1 );
همانطور که ملاحظه کردید هوک ها(نه همه آنها) تعدادی پارامتر از پیش تعریف شده دارند که وردپرس مقادیرشان را در هنگام اجرای یک رویداد ارسال می کند.
آیا می توانم برای یک اکشن یا فیلتر پارامتر سفارشی تعریف کنم؟
بعد از کلی مقدمه چینی وارد بحث اصلی می شویم، احتمالا تا به حال به این موضوع فکر کرده اید که چگونه می توانم برای هوکی که ساختار آن از قبل تعریف شده است یک پارامتر دلخواه تعریف کنم؟
برای بررسی این موضوع از فیلتر هوک the_content استفاده کردیم، می خواهیم برای آن یک پارامتر دیگر به نام my_param$ تعریف کنیم.
function modiredev_the_content ( $content ) {
return $content . '<br>Author: Saeed Yavarnia';
}
add_filter( 'the_content', 'modiredev_the_content');
احتمالا اولین راه حلی که به آن فکر می کنید تعریف یک پارامتر اضافی برای تابع modiredev_the_content است. متاسفانه این روش به هیچ عنوان کار نمی کند.
function modiredev_the_content( $content, $my_param ) {
return $content;
}
برای حل این مشکل از توابع بی نام یا ناشناس( Closures – Anonymous Functions ) که از PHP نسخه ۵٫۳ به بعد پیاده سازی و معرفی شده اند استفاده می کنیم.
حالا تابع modiredev_the_content را اینگونه و به صورت بی نام پیاده سازی می کنیم.
$my_param = 'Author: Saeed Yavarnia';
add_filter( 'the_content', function ( $content ) use ( $my_param ) {
return $content . '<br>' . $my_param;
});
در نهایت این آموزش را با یک مثال دیگر از توابع بی نام به اتمام می رسانیم.
function modiredev_set_page_title( $page_title = '' ){
add_filter( 'document_title_parts',
function ( $title_parts ) use ( $page_title ) {
$title_parts['title'] = $page_title;
$title_parts['site'] = get_bloginfo( 'name', 'display' );
return $title_parts;
});
}
modiredev_set_page_title( 'عنوان تستی' );
با اکشن فیلتر document_title_parts می توانید اجزای یک صفحه وب(عنوان صفحه(Title Tag)، شماره صفحه در هنگام صفحه بندی(Pagination)، عنوان سایت(Site Title) و توضیحات مختصری از وب سایت(Tagline)) را به صورت داینامیک تغییر دهید.
سلام و عرض ادب خدمت مهندس یاورنیا عزیز
ببخشید مدت هاست دارم دنبال یه افزونه ای که کارایی مثل ژاکت داشته باشه را پیدا کنم ولی به هیچ کد یا افزونه ای نرسیدم
یک سیستمی که بشه سیستم به روز رسانی خودکار برای افزونه ها و قالب های فروخته شده راه انداخت
درود بر شما امین عزیز
ژاکت یک مارکت کاملا سفارشی و اختصاصی است و از هیچ افزونه ای استفاده نکرده، اما شما میتونی نمونه ساده اینکار رو با افزونه های EDD و EDD Software License پیاده سازی کنی.
مهندس یاورنیا من با ووکامروس کار میکنم ایا برای وکامروس هم چنین افزونه ای هست
میتونی این افزونه رو بررسی کنی
Software License Manager for WooCommerce
سلام مهندس یاورنیا چطور میتونیم ادرس ابدیت افزونه ها را تغییر بدیم یعنی از مخزن وردپرس ابدیت نکنه از ادرسی که خودمون بهش میدیم ابدیت کنه
ممنون میم اگه راهنمایی کنید
درود بر امین عزیز
پیشنهاد می کنم مقاله Create a License Controlled Update System: The License Manager API رو مطالعه و پیاده سازی کنی.
سلام استاد یاورنیا عزیز در رابطه با مطلب پایین اگه امکان داره بنده را راهنمایی کنید خیلی کارم گیره خیلی هم سرچ کردم چیزی پیدا نکردم بسیار ممنونم به چه صورت میشود مسیر ی که محصولات دانلودی ووکامرس داخلش اپلود میشه را به مسیر دلخواه تغییر داد🙏
درود بر امین عزیز، پاسخ سوالت دقیقا اینجاست How to change woocommerce product image upload path
سلام استاد یاور نیا شما برای نمایش کد ها از چه افزونه ای استفاده میکنید🙏
درود بر امین عزیز
از افزونه Code Syntax Block استفاده می کنم