سایر بخش های سری آموزشی " ایجاد افزونه وردپرس "

بررسی اجمالی

اکشن ها یک نوع از قلاب ها هستند .

اکشن ها یک روش هستند که به یک تابع امکان می دهند روی عملکرد تابعی دیگر تاثیر بگذارد . بنابراین کدهای تابع اضافه شده می تواند در یک نقطه خاص در زمان اجرای هسته وردپرس ، یک افزونه و یا یک پوسته ، اجرا شوند.
اکشن ها همتای فیلترها (Filters) هستند . آنها با فراخوانی تابع add_action() که ۲ پارامتر قبول می کند ، کار می کنند .
پارامتر اول تابع add_action() نام اکشنی است که شما می خواهید یک تابع را به آن متصل کنید و پارامتر دوم آن تابعی است که می خواهید در زمان رخ دادن اکشن (پارامتر اول) ، اجرا شود .

به عنوان مثال :

add_action( 'init', 'do_some_stuff' );

در دستورات بالا ، زمانی که اکشن init اجرا می شود ، تابع سفارشی شما یعنی do_some_stuff() فراخوانی می شود و دستورات آن اجرا می شود .
برای مشاهده اکشن ها و مثال هایی از هر کدام می توانید این لینک را مشاهده کنید .

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

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

اگر شما بخواهید یک پرس وجو (Query) از بانک اطلاعاتی MySQL را که نوشته های وردپرس را توسط یک حلقه (The Loop) نمایش می دهد را تغییر دهید ، می توانید از اکشن pre_get_posts استفاده کنید .
مثلاً یک کار که شما می توانید با این حلقه از نوشته ها انجام دهید ، این است که نوشته های سفارشی (Custom post ) خود را در نتایج پرس و جو اضافه کنید .

function search_filter( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) {
        if ( $query->is_search ) {
            $query->set( 'post_type', array( 'post', 'movie' ) );
        }
    }
}
add_action( 'pre_get_posts', 'search_filter' );

 

به عنوان مثالی دیگر اگر شما می خواهید یک یا چند تگ HTML را به قسمت head صفحه اضافه کنید می توانید از اکشن wp_head استفاده کنید :

function prevent_google_maps_resize() {
    echo '<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />';
}
add_action( 'wp_head', 'prevent_google_maps_resize' );

 

پارامترهای اضافه

هر دو تابع add_action() و add_filter()    می توانند ۲ پارامتر اضافه دیگر را که استفاده از آنها اختیاری است را ، داشته باشند .
پارامتر اختیاری اول برای اولویت دادن به تابع callback و پارامتر اختیاری دوم تعداد آرگومان هایی که تابع callback می تواند بپذیرد را مشخص می کند .

 

پارامتر اختیاری اول (اولویت یا Priority )

این پارامتر ، اولویت اجرای تابع متصل به قلاب اکشن را نسبت به سایر توابع متصل به این قلاب را مشخص می کند .
به عنوان نمونه یک تابع با اولویت ۱۱ بعد از یک تابع با اولویت ۱۰ اجرا می شود و یک تابع با اولویت ۹ زودتر از یک تابع با اولویت ۱۰ اجرا خواهد شد .

هر عدد صحیح و مثبتی قابل قبول است و عدد پیشفرض ۱۰ می باشد .

به عنوان مثال توابع فراخوانی (callback) زیر همگی به قلاب init متصل شده اند ، اما با اولویت های متفاوت .

add_action( 'init', 'run_me_early', 9 );
add_action( 'init', 'run_me_normal' );    // default value of 10 is used since a priority wasn't specified
add_action( 'init', 'run_me_late', 11 );

در کد بالا ابتدا تابع run_me_early() ، سپس تابع run_me_normal() و در آخر تابع run_me_late() اجرا می شوند .

 

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

 

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

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

به عنوان مثال ، زمانی که وردپرس یک نوشته را ذخیره می کند و اکشن save_post را اجرا می کند ، ۲ پارامتر را به تابع فراخوانش ارسال می کند : ID یا شناسه نوشته ذخیره شده و خود نوشته به عنوان یک شی (object) .

do_action( 'save_post', $post->ID, $post );

بنابراین ، زمانی که یک تابع فراخوان برای اکشن save_post ثبت شده است ، می تواند مشخص کند که این دو آرگومان را می خواهد :

add_action( 'save_post', 'my_save_post_callback', 10, 2 );

و سپس می تواند آرگومان را در تعریف تابع فراخوان ثبت کند :

function my_save_post_callback( $post_id, $post ) {
    // do stuff
}