با سلام
دو روز پیش وردپرس ۴.۴ با عنوان clifford منتشر شد. که ویژگی های جالبی رو داشت مثلا ویژگی embed که شما اگه خواستین از مطلب دیگه سایتتون تو مطلب دیگه رفرنس بدین و خواستین خلاصه ای از اونم هم نشون بدین کافیه آدرس URL مطل دیگه رو تو ویرایشگرتون paste کنین و اون رو بصورت خلاصه پست ببینین. مثلا برای قسمت زیر من فقط آدرس پست رو گذاشتم:
و ویژگی مهم و عالی دیگه Rest api هست که از نظر من فوق العاده س. البته این ویژگی مربوط میشه به افزونه WP REST API که وردپرس اومده این افزونه رو با هسته خودش تلفیق کرده و به توسعه دهنده ها اجازه میده تا هر مدل api که میخوان برا افزونه شون بنویسن و دیگه نیازه به نصب افزونه WP REST API نباشه. مثلا برا سایتشون یک اپلیکیشن اندروید با حتی دسکتاپ بنویسن.
استفاده از ویژگی جدید وردپرس ۴.۴ به نام rest api
افزونه WP REST API بطور پیشفرض یه سری api ها داشت مثل گرفتن پست ها، پست، دیدگاه ها و … ولی در وردپرس ۴.۴ فقط یه مسیر یا route براش مشخص شده که میتونین با تابع get_rest_url آدرس رو در بیارین و ببینین که بطور پیشفرض مقدارش برابره با http://yoursite.com/wp-json/
هست. ولی خب این میتونه با فیلتر rest_url تغییر کنه. نتیجه میشه تصویر زیر یا اینکه از اینجا ببینین:

این فرمت زیبا برای json هم توسط افزونه گوگل کروم تحت عنوان json viwer awesomeتولید شده ها!!!
نکته اینجاست که این تنها مسیر rest برای سایت شماست و توسعه میتونه برا هر چیزی که بخواد یه API ایجاد کنه. که ما یه نمونه شو میگیم:
ایجاد api از طریق rest api وردپرس ۴.۴
اول از همه باید این routeرو جایی ایجاد کنیم که جاش باشه ن بی جاش!!! پس میایم از اکشن هوک rest_api_init
استفاده میکنیم:
add_action('rest_api_init', function(){
register_rest_route('ircodex_api', 'users', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_users_callback'
));
});
function ircodex_users_callback(){
$response = new WP_REST_Response(get_users());
return $response;
}
حالا وقتی شما به آدرس http://yoursite.com/wp-json/ircodex_api/users/
برید تمام مشخصات کاربرای خودتون رو میبینین که بصورت json در اومده. تا اینجاش میتونین کد یا اپلیکیشنی بنویسین که کاربراتون رو نشون بده! حواستون باشه این کد تمام اطلاعات کاربرا رو میریزه رو دایره حتی پسوردشون رو (البته هش شده)
ولی تا اینجا فقط داده گرفتیم ولی نتونستین اونا رو فیلتر کنین یا مشخص کنید چه اطلاعاتی از کاربرا یا کاربر با کدوم شناسه یعنی فعلا شما هیچ اطلاعاتی نمیتونین ارسال کنین.
تو کد بالا با اکشن rest_api_init در زمان ایجاد مسیر ها ما هم با تابع register_rest_route یه مسیر ایجاد کردیم. آرگومان اول فضای نامی ما یعنی namespace که براید یکتا باشه و معمولا هم بهتره از عنوان افزونه استفاده کنیم که url رو از سایر api های افزونه های دیگه جدا کنه.هر اسمی خواستین بذارین حتی اگه ادامه دار باشه مثل ircodex_api/v2
. آرگومان دوم مسیر ما هست که ما اینجا گفتیم این مسیر برا گرفتن کاربرا استفاده میشه. و آرگومان سوم هم تنظیمات مسیر ماست که میتونین هم نذارین یعنی اختیاریه. ولی خب بذارین قدرت کارتون بالاتره.
محتویات آرایه: اول متدهای دسترسی به این api رو مشخص کردیم که میتونین از ثابت کلاس WP_REST_Server
استفاده کنین یا به صورت رشته بنویسین. محتویات مربوط به ثابت ها:
/**
* Alias for GET transport method.
*
* @since 4.4.0
* @var string
*/
const READABLE = 'GET';
/**
* Alias for POST transport method.
*
* @since 4.4.0
* @var string
*/
const CREATABLE = 'POST';
/**
* Alias for POST, PUT, PATCH transport methods together.
*
* @since 4.4.0
* @var string
*/
const EDITABLE = 'POST, PUT, PATCH';
/**
* Alias for DELETE transport method.
*
* @since 4.4.0
* @var string
*/
const DELETABLE = 'DELETE';
/**
* Alias for GET, POST, PUT, PATCH & DELETE transport methods together.
*
* @since 4.4.0
* @var string
*/
const ALLMETHODS = 'GET, POST, PUT, PATCH, DELETE';
و callback هم مشخص میکنه وقتی به این مسیر هداست شد چه اتفاقی بیفته که خب یه تابع براش تعریف کردیم. خیلی ساده تو این تابع گفتیم که تمام کاربران ما رو بگیر و با استفاده از کلاس WP_REST_Response
یه پاسخ یا response استاندارد ساختیم و اون رو return کردیم. خودتون انجام بدین نتیجه ش جالبه.
ارسال اطلاعات از طریق rest api
اولین نکته تو ارسال اطلاعات متد ارسال اطلاعات هست. پس اگه ما بخوایم یه user_id ازطریق متد GET بفرستیم.
add_action('rest_api_init', function(){
register_rest_route('ircodex_api', 'users', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_users_callback'
));
register_rest_route('ircodex_api', 'user', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_callback',
'args' => array(
'user_id' => array(
'required' => true,
'sanitize_callback' => 'absint'
)
)
));
});
function ircodex_users_callback(){
$response = new WP_REST_Response(get_users());
return $response;
}
function ircodex_user_callback($request){
$response = new WP_REST_Response(get_users(array(
'include' => array($request['user_id'])
)));
return $response;
}
حالا اگه آدرس http://youtsite.com/wp-json/ircodex_api/user?user_id=1
رو بزنین میبینین که فقط اطلاعات کاربر با شناسه ۱ براتون میاد. و خب با تغییر post_id میتونین تصمیم بگیرین که کدوم کاربر رو نشون بده.
خط ۱۰ – مشخص کردیم که میخوایم آرگومانهایی هم ارسال کنیم برا تغییر نتیجه.
خط ۱۱ – عنوان اولین آرگومان ما user_id رو مشخص کردیم یعنی با $_GET[‘user_id’]
دسترسیه.
خط ۱۲ – گفتیم که این داده برای این مسیر الزامیه اگه شما پسوند user_id=1
رو نزنین خطوط زیر لراتون نشون داده میشه:
{
"code":"rest_missing_callback_param",
"message":"Missing parameter(s): user_id",
"data":{
"status":400,
"params":[
"user_id"
]
}
}
خط ۱۳ – میگیم مقدار ورودی با این تابع فیلتر یا تصحیح بشه که خب چون شناسه کاربر فقط عدد صحیحه از تابع absint استفاده کردیم.
خط ۲۷ – دیگه ما با متغیر GET کاری نداریم چون خوش درون آرگومان ورودی تابع فیلتر شده و تحویل ما داده میشه و ما هم با توجه به شناسه کاربر مورد نظر رو نشون دایدم.
حالا اگه خواستی اطلاعات رو از طریق متد پست بفرستین میتونین دو کار انجام بدین اول کاری کنین که اطلاعات فقط از طریق POST قابل دریافت باشه و یا اینکه علاوه بر GET بشه از طریق POST هم ارسال اطلاعات انجام داد. ولی من ترجیح میدم فقط با POST ارسال بشه.
add_action('rest_api_init', function(){
register_rest_route('ircodex_api', 'users', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_users_callback'
));
register_rest_route('ircodex_api', 'user', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_callback',
'args' => array(
'user_id' => array(
'required' => true,
'sanitize_callback' => 'absint'
)
)
));
register_rest_route('ircodex_api', 'post', array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'ircodexpost_callback',
'args' => array(
'user_id' => array(
'default' => 347,
'sanitize_callback' => 'absint'
)
)
));
});
function ircodex_users_callback(){
$response = new WP_REST_Response(get_users());
return $response;
}
function ircodex_user_callback($request){
$response = new WP_REST_Response(get_users(array(
'include' => array($request['post_id'])
)));
return $response;
}
function ircodexpost_callback($request){
$response = new WP_REST_Response(get_post($request['user_id']));
return $response;
}
اومدیم یه مسیر که فقط از طریق POST در دسترسه ایجاد کردیم. خط ۱۹ اومدیم از WP_REST_Server::CREATABLE
استفاده کردیم تا متد POST رو مشخص کرده باشیم.(البته معمولا برای ایجاد پست و این چیزا از این متد استفاده میکنن برا همین CREATABLE هست ولی خب ما اینجا برا آموزش برا گرفتم پست ازش استفاده میکنیم) خط ۲۳ اجباری بودن پارامتر رو برداشتیم و گفتیم اگه فرستاده نشه مقدار ۳۴۷ رو به عنوان پیشفرض قرار بده. محتوای تابع هم که کاملا واضحه.
استفاده از عبارات با قاعده در rest api
حالا اگه بخواین به صورت wild card استفاده کنین از این چطور میشه. مثلا شما میخواین با این ساختار url ارتباط بر قرار کنین:
http://yoursite.com/wp-json/ircodex_api/author/{author_id}
add_action('rest_api_init', function(){
register_rest_route('ircodex_api', 'users', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_users_callback'
));
register_rest_route('ircodex_api', 'user', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_callback',
'args' => array(
'user_id' => array(
'required' => true,
'sanitize_callback' => 'absint'
)
)
));
register_rest_route('ircodex_api', 'post', array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'ircodexpost_callback',
'args' => array(
'user_id' => array(
'default' => 347,
'sanitize_callback' => 'absint'
)
)
));
register_rest_route('ircodex_api', '/author/(?P<id>\d+)', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_wild_callback',
));
});
function ircodex_users_callback(){
$response = new WP_REST_Response(get_users());
return $response;
}
function ircodex_user_callback($request){
$response = new WP_REST_Response(get_users(array(
'include' => array($request['post_id'])
)));
return $response;
}
function ircodexpost_callback($request){
$response = new WP_REST_Response(get_post($request['user_id']));
return $response;
}
function ircodex_user_wild_callback($data){
return $data['id'];
}
نکته مهم تو خطوط ۲۹ و ۵۴ نهفته س. نیازی به توضیح نداره یعنی باید بدونین با این wildcard ها چطور باید کار کرد.
حالا یه کم پیشرفته تر:
add_action('rest_api_init', function(){
register_rest_route('ircodex_api', 'users', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_users_callback'
));
register_rest_route('ircodex_api', 'user', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_callback',
'args' => array(
'user_id' => array(
'required' => true,
'sanitize_callback' => 'absint'
)
)
));
register_rest_route('ircodex_api', 'post', array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'ircodexpost_callback',
'args' => array(
'user_id' => array(
'default' => 347,
'sanitize_callback' => 'absint'
)
)
));
register_rest_route('ircodex_api', '/author/(?P<id>\d+)', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_wild_callback',
));
register_rest_route('ircodex_api', '/(?P<type>[a-z]+)/(?P<id>\d+)', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'ircodex_user_new_wild_callback',
));
});
function ircodex_users_callback(){
$response = new WP_REST_Response(get_users());
return $response;
}
function ircodex_user_callback($request){
$response = new WP_REST_Response(get_users(array(
'include' => array($request['post_id'])
)));
return $response;
}
function ircodexpost_callback($request){
$response = new WP_REST_Response(get_post($request['user_id']));
return $response;
}
function ircodex_user_wild_callback($data){
return $data['id'];
}
function ircodex_user_new_wild_callback($data){
return $data['type'] . ' => ' . $data['id'];
}
خطوط ۳۴ تا ۳۷ و ۶۲ تا ۶۴ جدیدن و با آزمایش همه چی دستتون میاد.
یعنی ساختار شما شده این:http://yoursite.com/wp-json/ircodex_api/{type}/{author_id}
البته به همراه این ساختار میشه از متد های POST و GET و حتی سایر متد ها هم استفاده کرد.
یه آموزش کوچیک و نقشه راه بود.
موفق باشد.
نظر بدین
خدانگهدار