استفاده از وردپرس به عنوان یک سایت ورودی داده برای تقویت یک API مرکزی
انتشار: آذر 27، 1403
بروزرسانی: 28 خرداد 1404

استفاده از وردپرس به عنوان یک سایت ورودی داده برای تقویت یک API مرکزی


یکی از زمینه هایی که وردپرس در آن می درخشد مدیریت محتوا است. این همچنین با این واقعیت تأیید می شود که این سیستم مدیریت محتوا یا CMS پیشرو در جهان است.

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

در این مقاله، چگونگی استفاده از وردپرس را برای تقویت یک API مرکزی برای پروژه هایی مانند برنامه های تلفن، برنامه های افزودنی مرورگر یا قسمت های جلویی دیگر سایت های وردپرس بررسی خواهیم کرد!

دنبال کردن

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

وب API چیست؟

API مخفف رابط برنامه نویسی کاربردی و این راهی است برای برنامه های کاربردی نرم افزاری برای ارتباط با یکدیگر به شیوه ای استاندارد. یک وب API به سادگی از طریق "اینترنت" قابل دسترسی است - برای مثال، با وارد کردن یک URL خاص در مرورگر وب خود.

انواع مختلفی از وب API وجود دارد، و یک راه رایج برای گروه بندی آنها، پروتکلی است که استفاده می کنند. در این مقاله، ما دو API را پیاده سازی خواهیم کرد، یکی بر اساس پروتکل REST و دیگری بر اساس پروتکل GraphQL. پروتکل های دیگری که ممکن است نام آنها را شنیده باشید عبارتند از SOAP، RPC یا gRPC.

وردپرس در واقع شامل یک REST API داخلی است که ویرایشگر بلاک گوتنبرگ را تقویت می کند. از اکتبر 2024، پلاگین محبوب WPGraphQL به یک افزونه متعارف تبدیل شده است که راه را برای API رسمی GraphQL نیز هموار می کند.

چه داده هایی را مدل سازی خواهیم کرد

تا پایان این مقاله، ما یک سایت وردپرسی ایجاد خواهیم کرد که به کاربران اجازه می دهد برای افزودن/به روزرسانی/حذف ورودی های داده وارد شوند که هم از طریق مسیرهای REST و هم از طریق نقطه پایانی GraphQL قابل استعلام هستند.

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

اختیاری: کوتاه کردن قسمت جلویی

در حالی که یک مرحله اختیاری است، انجام این کار بسیار منطقی است اگر سایت شما محتوایی را از طریق صفحات ارائه نمی دهد، بلکه منحصراً از طریق API ها ارائه می شود.

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

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

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

اگر ترجیح می دهید صفحه اصلی را کاملاً قفل کنید و حتی صفحه اصلی توضیح داده شده در بالا را ندارید، می توانید قطعه کد زیر را به افزونه ای مانند Code Snippets یا به فایل functions.php تم فرزند خود اضافه کنید:

/** * Disables the frontend for non-logged-in users. */add_action(\'template_redirect\',static function (): void {$authorization_required_code = \\WP_Http::UNAUTHORIZED; // 401if ( ! is_user_logged_in() ) {\\status_header( $authorization_required_code );die( \\get_status_header_desc( $authorization_required_code ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped}}

انواع پست سفارشی و طبقه بندی

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

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

  • یک employee نوع پست سفارشی
  • الف team طبقه بندی سفارشی
  • یک office نوع پست سفارشی

برای ایجاد این نوع داده های سفارشی، می توانید کد سفارشی را به سایت خود اضافه کنید یا از یک افزونه (مانند این ویدیو) استفاده کنید. یک افزونه بسیار محبوب برای ایجاد انواع پست سفارشی و طبقه بندی با استفاده از رابط مدیریت، Custom Post Type UI است – و این همان چیزی است که ما در این آموزش از آن استفاده خواهیم کرد.

در اینجا پیکربندی JSON برای وارد کردن داده ها به نصب شما آمده است:

{"employee":{"name":"employee","label":"Employees","singular_label":"Employee","description":"","public":"false","publicly_queryable":"false","show_ui":"true","show_in_nav_menus":"false","delete_with_user":"false","show_in_rest":"false","rest_base":"","rest_controller_class":"","rest_namespace":"","has_archive":"false","has_archive_string":"","exclude_from_search":"true","capability_type":"post","hierarchical":"false","can_export":"true","rewrite":"false","rewrite_slug":"","rewrite_withfront":"true","query_var":"false","query_var_slug":"","menu_position":"","show_in_menu":"true","show_in_menu_string":"","menu_icon":"dashicons-id","register_meta_box_cb":null,"supports":("title","thumbnail","excerpt","revisions"),"taxonomies":(),"labels":{"menu_name":"Employees","all_items":"All Employees","add_new":"Add new","add_new_item":"Add new Employee","edit_item":"Edit Employee","new_item":"New Employee","view_item":"View Employee","view_items":"View Employees","search_items":"Search Employees","not_found":"No Employees found","not_found_in_trash":"No Employees found in trash","parent":"Parent Employee:","featured_image":"Profile image for this Employee","set_featured_image":"Set profile image for this Employee","remove_featured_image":"Remove profile image for this Employee","use_featured_image":"Use as profile image for this Employee","archives":"Employee archives","insert_into_item":"Insert into Employee","uploaded_to_this_item":"Upload to this Employee","filter_items_list":"Filter Employees list","items_list_navigation":"Employees list navigation","items_list":"Employees list","attributes":"Employees attributes","name_admin_bar":"Employee","item_published":"Employee published","item_published_privately":"Employee published privately.","item_reverted_to_draft":"Employee reverted to draft.","item_trashed":"Employee trashed.","item_scheduled":"Employee scheduled","item_updated":"Employee updated.","parent_item_colon":"Parent Employee:"},"custom_supports":"","enter_title_here":"First and Last Names","show_in_graphql":"1","graphql_single_name":"Employee","graphql_plural_name":"Employees"},"office":{"name":"office","label":"Offices","singular_label":"Office","description":"","public":"false","publicly_queryable":"false","show_ui":"true","show_in_nav_menus":"false","delete_with_user":"false","show_in_rest":"false","rest_base":"","rest_controller_class":"","rest_namespace":"","has_archive":"false","has_archive_string":"","exclude_from_search":"true","capability_type":"post","hierarchical":"false","can_export":"false","rewrite":"false","rewrite_slug":"","rewrite_withfront":"true","query_var":"true","query_var_slug":"","menu_position":"","show_in_menu":"true","show_in_menu_string":"","menu_icon":"dashicons-admin-home","register_meta_box_cb":null,"supports":("title","thumbnail","revisions"),"taxonomies":(),"labels":{"menu_name":"Offices","all_items":"All Offices","add_new":"Add new","add_new_item":"Add new Office","edit_item":"Edit Office","new_item":"New Office","view_item":"View Office","view_items":"View Offices","search_items":"Search Offices","not_found":"No Offices found","not_found_in_trash":"No Offices found in trash","parent":"Parent Office:","featured_image":"Featured image for this Office","set_featured_image":"Set featured image for this Office","remove_featured_image":"Remove featured image for this Office","use_featured_image":"Use as featured image for this Office","archives":"Office archives","insert_into_item":"Insert into Office","uploaded_to_this_item":"Upload to this Office","filter_items_list":"Filter Offices list","items_list_navigation":"Offices list navigation","items_list":"Offices list","attributes":"Offices attributes","name_admin_bar":"Office","item_published":"Office published","item_published_privately":"Office published privately.","item_reverted_to_draft":"Office reverted to draft.","item_trashed":"Office trashed.","item_scheduled":"Office scheduled","item_updated":"Office updated.","parent_item_colon":"Parent Office:"},"custom_supports":"","enter_title_here":"Add Office","show_in_graphql":"1","graphql_single_name":"Office","graphql_plural_name":"Offices"}}
{"team":{"name":"team","label":"Teams","singular_label":"Team","description":"","public":"false","publicly_queryable":"false","hierarchical":"false","show_ui":"true","show_in_menu":"true","show_in_nav_menus":"false","query_var":"false","query_var_slug":"","rewrite":"false","rewrite_slug":"","rewrite_withfront":"0","rewrite_hierarchical":"0","show_admin_column":"true","show_in_rest":"false","show_tagcloud":"false","sort":"false","show_in_quick_edit":"","rest_base":"","rest_controller_class":"","rest_namespace":"","labels":{"menu_name":"Teams","all_items":"All Teams","edit_item":"Edit Team","view_item":"View Team","update_item":"Update Team name","add_new_item":"Add new Team","new_item_name":"New Team name","parent_item":"Parent Team","parent_item_colon":"Parent Team:","search_items":"Search Teams","popular_items":"Popular Teams","separate_items_with_commas":"Separate Teams with commas","add_or_remove_items":"Add or remove Teams","choose_from_most_used":"Choose from the most used Teams","not_found":"No Teams found","no_terms":"No Teams","items_list_navigation":"Teams list navigation","items_list":"Teams list","back_to_items":"Back to Teams","name_field_description":"The name is how it appears on your site.","parent_field_description":"Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.","slug_field_description":"The slug is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.","desc_field_description":"The description is not prominent by default; however, some themes may show it."},"meta_box_cb":"","default_term":"","object_types":("employee"),"show_in_graphql":"1","graphql_single_name":"Team","graphql_plural_name":"Teams"}}

در این مرحله، رابط مدیریت وردپرس شما ممکن است چیزی شبیه به این باشد:

به گوتنبرگ یا نه به گوتنبرگ

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

اگر مطمئن هستید که تمام اطلاعات مورد نیاز شما مبتنی بر HTML نیست، پس ممکن است منطقی باشد که گوتنبرگ را برای این CPT ها غیرفعال کنید و به طور پیش فرض به ویرایشگر پست کلاسیک که استاندارد قبل از وردپرس 5.0 بود برگردید.

ساده ترین راه برای غیرفعال کردن پشتیبانی گوتنبرگ برای CPT، تنظیم آن است show_in_rest استدلال به false هنگام ثبت آن (همانطور که در بالا انجام دادیم).

از طرف دیگر، اگر می خواهید مسیرهای REST داخلی را که وردپرس برای هر CPT ارائه می کند حفظ کنید، می توانید این کد را به تم فرزند خود اضافه کنید:

/** * Disables the block editor for certain CPTs. */add_filter(    \'use_block_editor_for_post_type\',    static function( bool $use_block_editor, string $post_type ): bool {if ( in_array( $post_type, array( \'employee\', \'office\' ), true ) ) {$use_block_editor = false;       }  return $use_block_editor;    },    10,    2);

فیلدهای سفارشی

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

ساده ترین راه برای افزودن فیلدهای سفارشی به انواع پست سفارشی، ثبت آنهاست custom-fields پشتیبانی کنید. هنگامی که یک پست را ویرایش می کنید، شامل یک متاباکس مانند زیر می شود:

در حالی که این نوع رابط «کلید-مقدار» می تواند کافی باشد، ممکن است بخواهید یک رابط کاربرپسندتر با فیلدهایی مانند چک باکس، کرکره، انتخابگر رسانه و غیره بسازید.

یک راه محبوب برای افزودن آن نوع فیلدهای سفارشی، افزونه Meta Box است که همانطور که در بالا ذکر شد، همان چیزی است که در این آموزش از آن استفاده خواهیم کرد. با استفاده از تولیدکننده فیلدهای سفارشی آنلاین آنها، کد PHP مورد نیاز برای ثبت فیلدهای مورد نظر خود را دریافت کردیم و سپس آنها را به کد قطعه اضافه کردیم.

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

سایر سفارشی سازی های رابط کاربری

در حالی که در این آموزش هیچ گزینه دیگری برای سفارشی سازی UI بررسی نمی کنیم، می خواهیم توجه داشته باشیم که می توان از فیلترهای مختلف وردپرس برای تغییر مواردی مانند:

  • پیش فرض Add title جای جای پست های جدید (مثلاً به First and Last Names)
  • ستون ها به طور پیش فرض در نمای جدول لیست CPT پنهان یا قابل مشاهده هستند
  • برچسب ها و پیام های مختلف دیگر در سرتاسر رابط مدیر

کنترل دسترسی

قبل از شروع بررسی در دسترس قرار دادن داده ها از طریق API، وقت آن است که به این فکر کنیم که چه کسی باید به آن دسترسی داشته باشد.

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

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

در حالی که کنترل کامل این امر با کد سفارشی امکان پذیر است، راهی برای حفظ یک نمای کلی ساده تر از مدیریت دسترسی توسط Access Policies که توسط افزونه Advanced Access Manager پیاده سازی شده است، ارائه شده است.

به عنوان مثال، می توانید برای هر CPT که ایجاد می کنید، یک خط مشی دسترسی جداگانه ایجاد کنید. سپس می توانید این خط مشی را به یک نقش یا به تک تک کاربران اختصاص دهید تا کنترل کامل روی افرادی که می توانند ورودی های کارمند جدید اضافه کنند یا حتی فقط موارد موجود را ویرایش کنند، حفظ کنید. حذف ورودی ها می تواند فقط برای مدیران محفوظ باشد.

در اینجا مثالی از نحوه نامگذاری یک خط مشی آورده شده است Employees CPT – Full Control و فقط به Administrator کاربران می توانند به شکل زیر ظاهر شوند:

{    "Version": "1.0.0",    "Dependency": {        "wordpress": ">=6.6.2",        "advanced-access-manager": ">=6.9.42"    },    "Statement": (        {  "Effect": "allow",  "Resource": (      "Capability:edit_employees",      "Capability:edit_others_employees",      "Capability:edit_private_employees",      "Capability:edit_published_employees",      "Capability:read_private_employees",      "Capability:publish_employees",      "Capability:delete_employees",      "Capability:delete_private_employees",      "Capability:delete_published_employees",      "Capability:delete_others_employees"  )        }    )}

در اینجا مثالی از این است که رابط مدیر برای یک ساختگی چگونه می تواند باشد operator کاربری که دارای Data Entry Operator نقش های کاربر (کلون شده از Subscriber نقش) با دو خط مشی دسترسی AAM پیوست - یکی برای هر CPT سفارشی:

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

مسیرهای REST سفارشی

در حالی که وردپرس به طور خودکار مسیرهای REST را برای هر CPT ایجاد می کند تا زمانی که در آن ثبت شده باشد show_in_rest آرگومان تنظیم شده است true، همچنین می توانید مسیرهای استراحت سفارشی خود را ایجاد کنید که برای ارائه محتوای CPT مناسب تر هستند، به گونه ای که برای استفاده شما منطقی تر باشد.

ساده ترین و استانداردترین راه برای رسیدن به این هدف، گسترش یکی از کلاس های کنترلر REST API است. برای حداکثر کنترل بر روی خروجی، ممکن است بخواهید خود کلاس پایه WP_REST_Controller را گسترش دهید.

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

روش توصیه شده برای قفل کردن دسترسی، پشت بررسی قابلیت است، یعنی تماس با current_user_can. می توانید از سیاست های دسترسی AAM که در بالا ذکر شد برای اعطا یا لغو مجوز از نقش ها یا کاربران فردی استفاده کنید و می توانید از رمزهای عبور برنامه وردپرس برای احراز هویت درخواست های API استفاده کنید.

اشاره: حتی اگر تصمیم بگیرید GET (خواندن) درخواست ها باید/می توانند به صورت عمومی در دسترس باشند، ما همچنان توصیه می کنیم که هر کدام POST // PUT // DELETE (ایجاد، به روز رسانی، حذف) درخواست ها همیشه توسط الف محافظت می شوند current_user_can بررسی کنید.

در اینجا یک کنترلر REST است که ما به کد قطعه اضافه کردیم تا بتوانیم کارمندان را در سایت لیست کنیم و آنها را با ID واکشی کنیم:

add_action(\'rest_api_init\',function() {if ( ! class_exists( \'WP_REST_Controller\' ) ) { return;}class Employees_Controller extends WP_REST_Controller {protected $namespace = \'custom/v1\';protected $rest_base = \'employees\';public function register_routes(): void {register_rest_route($this->namespace,"/$this->rest_base",array(array(\'methods\'   => WP_REST_Server::READABLE,\'permission_callback\' => array( $this, \'get_items_permissions_check\' ),\'callback\'  => array( $this, \'get_items\' ),\'args\'      => $this->get_collection_params(),),\'schema\' => array( $this, \'get_public_item_schema\' ),));register_rest_route($this->namespace,"/$this->rest_base/(?P(\\d)+)",array(\'args\'        => array(\'employee_id\' => array(\'description\' => __( \'Unique identifier for the employee.\', \'psapi-features\' ),\'type\'        => \'integer\',),),array(\'methods\'   => WP_REST_Server::READABLE,\'permission_callback\' => array( $this, \'get_item_permissions_check\' ),\'callback\'  => array( $this, \'get_item\' ),),\'schema\'      => array( $this, \'get_public_item_schema\' ),));}public function get_items_permissions_check( $request ): WP_Error|bool {return true; // This information is public. You probably want to do a `current_user_can` check.}public function get_item_permissions_check( $request ): WP_Error|bool {return $this->get_items_permissions_check( $request ); // Same as for listing all. Can be different.}public function get_items( $request ): WP_Error|WP_REST_Response {$response = array();$employees = new WP_Query( $this->prepare_posts_query_args( $request ) );foreach ( $employees->posts as $employee ) {$data       = $this->prepare_item_for_response( $employee, $request );$response() = $this->prepare_response_for_collection( $data );}$response = rest_ensure_response( $response );$response->header( \'X-WP-Total\', $employees->found_posts );$response->header( \'X-WP-TotalPages\', $employees->max_num_pages );foreach ( $this->prepare_link_headers( $request, $employees->max_num_pages ) as $key => $value ) {$response->link_header( $key, $value );}return $response;}public function get_item( $request ): WP_Error|WP_REST_Response {$employee = get_post( $request(\'employee_id\') );if ( ! $employee ) {return new WP_Error( \'rest_not_found\', __( \'No employee found for the given identifier.\', \'wpcom-demo\' ), array( \'status\' => 404 ) );}$response = $this->prepare_item_for_response( $employee, $request );return rest_ensure_response( $response );}public function prepare_item_for_response( $item, $request ): WP_Error|WP_REST_Response {$fields = $this->get_fields_for_response( $request );$data   = array();if ( rest_is_field_included( \'id\', $fields ) ) {$data(\'id\') = $item->ID;}if ( rest_is_field_included( \'name\', $fields ) ) {$data(\'name\') = $item->post_title;}if ( rest_is_field_included( \'picture\', $fields ) ) {$picture = get_the_post_thumbnail_url( $item, \'full\' );$data(\'picture\') = empty( $picture ) ? null : $picture;}$data     = rest_sanitize_value_from_schema( $data, $this->get_item_schema() );$response = rest_ensure_response( $data );if ( rest_is_field_included( \'_links\', $fields ) ) {$response->add_links( $this->prepare_links( $item, $request ) );}return $response;}public function get_item_schema(): array {if ( $this->schema ) {return $this->add_additional_fields_schema( $this->schema );}$this->schema = array(\'$schema\'    => \'http://json-schema.org/draft-04/schema#\',\'title\'      => \'employee\',\'type\'       => \'object\',\'properties\' => array(\'id\' => array(\'description\' => __( \'Unique identifier for the employee.\', \'wpcom-demo\' ),\'type\'        => \'integer\',\'readonly\'    => true,),\'name\'         => array(\'description\' => __( \'The name of the employee.\', \'wpcom-demo\' ),\'type\'        => \'string\',\'required\'    => true,),\'picture\'      => array(\'description\' => __( \'URL to the employee profile picture.\', \'wpcom-demo\' ),\'type\'        => array( \'string\', \'null\' ),\'format\'      => \'uri\',\'required\'    => true,),));return $this->add_additional_fields_schema( $this->schema );}protected function prepare_posts_query_args( WP_REST_Request $request ): array {return array(\'post_type\'      => \'employee\',\'post_status\'    => \'publish\',\'order\'=> $request(\'order\'),\'orderby\'        => $request(\'orderby\'),\'posts_per_page\' => $request(\'per_page\'),\'paged\'=> $request(\'page\'),\'s\'    => $request(\'search\') ?? \'\',\'tax_query\'      => $this->prepare_posts_taxonomy_query_args( $request ), // phpcs:ignore WordPress.DB.SlowDBQuery);}protected function prepare_posts_taxonomy_query_args( WP_REST_Request $request ): array {$tax_query = array();if ( $request(\'team\') ?? false ) {$tax_query() = array(\'taxonomy\' => \'team\',\'field\'    => \'slug\',\'terms\'    => array( $request(\'team\') ),);}return $tax_query;}protected function prepare_link_headers( WP_REST_Request $request, int $max_pages ): array {$link_headers = array();$base = add_query_arg(urlencode_deep( $request->get_query_params() ),rest_url( $request->get_route() ));$next_page = $request(\'page\') < $max_pages ? ( $request(\'page\') + 1 ) : null;if ( $next_page ) {$link_headers(\'next\') = add_query_arg( \'page\', $next_page, $base );}$prev_page = $request(\'page\') > 1 ? ( $request(\'page\') - 1 ) : null;if ( $prev_page ) {$link_headers(\'prev\') = add_query_arg( \'page\', $prev_page, $base );}return $link_headers;}protected function prepare_links( WP_Post $employee, WP_REST_Request $request ): array {$links = array();if ( ! isset( $request(\'employee_id\') ) ) {$links(\'self\') = array(array(\'href\' => rest_url( "$this->namespace/$this->rest_base/{$employee->ID}" ),),);} else {$links(\'collection\') = array(array(\'href\' => rest_url( "$this->namespace/$this->rest_base" ),),);}return $links;}}( new Employees_Controller() )->register_routes();});

تست مسیرهای REST شما

مسیرهای REST سفارشی شما در زیر در دسترس خواهند بود /wp-json//. به عنوان مثال، مسیر بازیابی لیست کارمندان می تواند به صورت زیر باشد:

/wp-json/custom/v1/employees?team=marketing

اشاره: را team پرس و جو اضافه شده در آنجا توسط وردپرس تجزیه می شود و در کنترلر در دسترس قرار می گیرد. سپس می توانید انتخاب کنید که آن را نادیده بگیرید یا نتایج را با آن فیلتر کنید - هر چیزی که می خواهید!

ساده ترین راه برای آزمایش نقاط پایانی خود، به خصوص اگر برای دسترسی به رمز عبور برنامه نیاز دارند، استفاده از ابزاری مانند Postman است که به شما امکان می دهد API ها را به روشی بسیار کاربرپسند آزمایش کنید. در دسترس عموم است GET درخواست ها را نیز می توان با مراجعه به نقطه پایانی URL در مرورگر خود آزمایش کرد!

پرس و جو از طریق GraphQL

اکنون که می توانیم داده ها را از طریق مسیرهای REST واکشی کنیم، بیایید بررسی کنیم که چگونه می توانیم آن ها را با استفاده از GraphQL نیز واکشی کنیم.

اگر با GraphQL آشنا نیستید، چیزی که باید بدانید این است که در واقع یک زبان پرس و جو است درست مانند SQL اما برای APIها. می توانید اطلاعات بیشتری در مورد آن در وب سایت رسمی در https://graphql.org/ بخوانید.

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

اگر به پیکربندی JSON انواع پست سفارشی به اشتراک گذاشته شده در بالا توجه کرده اید، ممکن است قبلاً متوجه کلیدی به نام شده باشید. show_in_graphql تنظیم کنید 1 (درست/فعال). این تمام چیزی است که ما نیاز داریم تا بتوانیم انواع پست های سفارشی را که اضافه کرده ایم پرس و جو با استفاده از GraphQL باشند.

در اینجا نمونه ای از یک پرس و جو GraphQL است که می تواند برای لیست استفاده شود Employees که می توانید در داخل آن تست کنید GraphQL IDE همراه با افزونه:

query GetEmployeesEdges {  employees {    edges {      node {        id        name: title        image: featuredImage {node {  sourceUrl}        }      }    }  }}

ساختن خودت

اگر به نظر می رسد چیزی است که می خواهید برای کسب و کار خود بسازید، می توانید با استفاده از Studio by WordPress.com روی آن بر روی رایانه شخصی خود کار کنید. حتی می توانید با استفاده از یک سایت آزمایشی، کار خود را با همکاران (به صورت رایگان!) به اشتراک بگذارید، و وقتی آماده شدید، هر طرح تجاری WordPress.com یا بالاتر می تواند سایت شما را میزبانی و مدیریت کند.