ردود الفعل هي حجر الزاوية في أي عملية تطوير منتج ناجحة. بالنسبة لمطوري المكونات الإضافية لـ WordPress، فإن فهم سبب قيام المستخدمين بإلغاء تنشيط المكونات الإضافية يمكن أن يقدم رؤى لا تقدر بثمن.

أثناء قيامي بتطوير مكون إضافي رائع آخر لـ WordPress باستخدام Cloudflare، كنت أرغب في الحصول على نظام ملاحظات إذا قام المستخدم بإلغاء تنشيط المكون الإضافي الخاص بي. لقد بدأت البحث عبر الإنترنت ولم تكن الحلول التي وجدتها مجدية بالنسبة لي.

يعتمد العديد من منشئي مكونات WordPress الإضافية على استطلاعات إلغاء التنشيط المضمنة أو خدمات الطرف الثالث لجمع التعليقات. ومع ذلك، فإن هذه الأساليب تأتي مع القيود والمشاكل:

  • التكاليف: قد يكون تشغيل الخوادم وإدارة البنية التحتية لجمع الملاحظات مكلفًا. وبالتالي، يتقاضى مقدمو الطرف الثالث مبلغًا كبيرًا.
  • الكمون: يمكن لآليات ردود الفعل البطيئة أن تمنع المستخدمين من المشاركة. عندما يقوم المستخدم بإلغاء تنشيط مكون إضافي، فإنه لا يتوقع تحميل الصفحة لمدة 10 ثوانٍ.
  • متاعب التكامل: تتطلب العديد من أنظمة ردود الفعل منحنى تعليمي حاد أو عمليات تكامل معقدة، مثل حزم SDK، وما إلى ذلك.
  • مشكلات الخصوصية: يقوم معظم مقدمي خدمات الطرف الثالث بجمع بيانات حساسة مثل عناوين البريد الإلكتروني والمزيد. تخزين بيانات المستخدمين الحساسة على منصة قد تبيع أو لا تبيع هذه البيانات، أو تتعرض للاختراق أو ما هو أسوأ من ذلك؛ ليس ممكنا.

فكيف يمكنك جمع هذه التعليقات بكفاءة وأمان وفعالية من حيث التكلفة؟ أدخل واجهة برمجة التطبيقات الخاصة بي استنادًا إلى Cloudflare Workers وKV وD1 .

قررت إنشاء واجهة برمجة تطبيقات REST الخاصة بي استنادًا إلى منصة Cloudflare Workers المذهلة، مما يؤدي إلى ربط منطقة أعضائي المنتشرة باستخدام الصفحات بشكل فعال مع واجهة برمجة التطبيقات. يمكنك قراءة المزيد حول كيفية إنشاء منطقة الأعضاء الخاصة بي هنا .

وهذا يعني أنه يمكنني تقييد استخدام واجهة برمجة التطبيقات (API) للأعضاء الكرام فقط، مع توفير الخصوصية والأمان للبيانات المخزنة. تنطلق واجهة برمجة التطبيقات (API) بسرعة كبيرة في جميع أنحاء العالم دون أي توقف عن العمل، مع الحفاظ على التكلفة المنخفضة والأمان المعزز. أكثر ما يمكن أن يريد شخص ما؟ 😃

وهذه مجرد البداية، حيث قمت بالفعل بإعداد العديد من نقاط النهاية للخدمات المستقبلية المجانية والمدفوعة للعملاء والمطورين والشركاء.

ابدء

إن البدء باستخدام واجهة برمجة التطبيقات (API) الخاصة بي أمر بسيط. قم بالتسجيل في منطقة الأعضاء . بعد التسجيل، ما عليك سوى زيارة ملفك الشخصي . إذا كان لديك حساب بالفعل، فسيتم إنشاء مجموعة من الرموز المميزة لواجهة برمجة التطبيقات (API Tokens) بشكل فوري.

ستجد في هذه الصفحة: معرف الحساب، الرمز العام، والرمز المميز:

  • يتم استخدام معرف الحساب لتحديد حسابك وتخزين المعلومات وفقًا لذلك.
  • يقتصر الرمز العام على عمليات معينة، يرجى الاطلاع على النطاقات.
  • الرمز الخاص ليس محدودًا مثل الرمز العام، ويمكنك استخدامه لقراءة التعليقات وكتابتها وحذفها على حسابك. مرة أخرى، يرجى الاطلاع على النطاقات.

ملاحظة: هناك قيود كبيرة على معدل واجهة برمجة التطبيقات (API) الخاصة بي لمنع إساءة الاستخدام. إذا كنت تلعب كثيرًا، فقد يتم تقييدك لمدة ساعة واحدة على الأقل أو أكثر.

لا توجد أي رسوم لاستخدام نقطة نهاية واجهة برمجة تطبيقات تعليقات WordPress، فهي مجانية تمامًا، لذا يرجى عدم محاولة إساءة استخدامها وإلا سأضطر إلى حظر حسابك.

دمج واجهة برمجة التطبيقات (API) مع مكونك الإضافي

التكامل سهل للغاية، ما عليك سوى اتباع الخطوات التالية:

  1. قم بالربط بـ “admin_footer” وأدخل نموذج/نموذج تعليقاتك.
  2. قم بتحميل CSS وJS باستخدام “admin_enqueue_scripts”؛ تأكد من تحميلها فقط على صفحة المكونات الإضافية. نصيحة: قم بإنشاء الأنماط المخصصة الخاصة بك، وإلا فسوف تكسر نمط صفحة المكونات الإضافية أو حتى تتعارض مع نموذج آخر لتعليقات المكونات الإضافية.
  3. قم بإنشاء وظيفة AJAX إدارية واحدة لمعالجة التعليقات؛ على سبيل المثال wp_ajax_your_plugin_deactivation_feedback. ملاحظة: لا تستخدم دائمًا أي شيء لتأمين وظائف AJAX الخاصة بك.

عند جمع التعليقات، تحتاج إلى جمع بعض المعلومات وإرسالها إلى واجهة برمجة التطبيقات (API) وفقًا لذلك. نظرًا لأنني مهتم جدًا بالخصوصية، فإن واجهة برمجة التطبيقات لن تقوم بتخزين عناوين البريد الإلكتروني أو أي شيء آخر يعتبر سريًا.

علاوة على ذلك، وللامتثال للائحة العامة لحماية البيانات بأفضل ما نستطيع، أقدم جميع المواقع الخمسة التي تقدمها D1 لتخزين البيانات المجمعة:

  • غرب أمريكا الشمالية
  • شرق أمريكا الشمالية
  • أوروبا الغربية
  • أوروبا الشرقية
  • منطقة آسيا والمحيط الهادئ

مع أخذ ذلك في الاعتبار، أقدم أيضًا وظيفة مساعد GEO التي تقوم بإرجاع المنطقة لاستضافتك. هذا يعني أنه يمكنك تخزين البيانات تلقائيًا في المنطقة المغلقة حيث يتم استضافة WordPress الخاص بك.

دالة مثال للحصول على المنطقة:

 1private function get_region($account, $token)
 2{
 3	$api_url = "https://api.mecanik.dev/v1/developer/$account/geo-info";
 4
 5	$response = wp_remote_post($api_url, [
 6		'headers' => [
 7			'Authorization' => 'Bearer '.$token,
 8			'Content-Type' => 'application/json; charset=utf-8',
 9		],
10		'method' => 'GET',
11	]);
12
13	$response_body = wp_remote_retrieve_body($response);
14	$response_data = json_decode($response_body, true);
15	
16	return $response_data;
17}

سيعيد هذا استجابة JSON مثل:

 1{
 2    "longitude": "8.68370",
 3    "latitude": "50.11690",
 4    "continent": "EU",
 5    "asn": 14061,
 6    "asOrganization": "Digital Ocean",
 7    "country": "DE",
 8    "isEUCountry": "1",
 9    "city": "Frankfurt am Main",
10    "region": "Hesse",
11    "timezone": "Europe/Berlin",
12    "postalCode": "60341",
13    "recommended-storage-region": "weur"
14}

كما ترون في هذا المثال، يوجد الخادم في منطقة “Hesse”، وبالتالي توصي واجهة برمجة التطبيقات (API) بتخزين البيانات في منطقة “weur”. أغتنم هذه مع حبة الملح؛ لا يمكن لواجهة برمجة التطبيقات (API) ضمان أنها ستعيد دائمًا “التوصية” الصحيحة.

يمكنك الآن المتابعة لإنشاء كائن التعليقات وإرسال ما يلي إلى واجهة برمجة التطبيقات: reason، comments، wp_plugin_name، wp_plugin_version، wp_site_url، wp_version، wp_locale، wp_multisite، php_version، db_type، db_version، server_type، server_version، date_created.

وظيفة مثال لإرسال التعليقات:

 1public function wp_ajax_your_plugin_deactivation_feedback()
 2{
 3	if (!wp_verify_nonce($_POST['nonce'], 'wp_ajax_your_plugin_deactivation_feedback_nonce')) {
 4		wp_send_json_error(esc_html__('Request is invalid. Please refresh the page and try again.', 'your-plugin-name'), 400, 0);
 5		exit();
 6	}
 7	
 8	$account = "....";
 9	$token = "....";
10	$api_url = "https://api.mecanik.dev/v1/developer/$account/wp-feedback";
11
12	$region = $this->get_region($account, $token);
13
14	$response = wp_remote_post($api_url, [
15		'headers' => [
16			'Authorization' => 'Bearer '.$token,
17			'Content-Type' => 'application/json; charset=utf-8',
18		],
19		'body' => json_encode([
20			'reason'             => sanitize_text_field($_POST['reason']),
21			'comments'           => sanitize_textarea_field($_POST['comments']),
22			'wp_plugin_name'     => $this->plugin_name,
23			'wp_plugin_version'  => $this->version,
24			'wp_site_url'        => get_bloginfo('url'),
25			'wp_version'         => $this->get_wp_version(),
26			'wp_locale'          => get_locale(),
27			'wp_multisite'       => is_multisite(),
28			'php_version'        => $this->get_php_version(),
29			'db_type'            => $this->get_db_type(),
30			'db_version'         => $this->get_db_version(),
31			'server_type'        => $this->get_server_type(),
32			'server_version'     => $this->get_server_version(),
33			'date_created'       => current_time('mysql'),
34			'region'             => $region['recommended-storage-region'],
35		]),
36		'method' => 'PUT',
37		'data_format' => 'body'
38	]);
39
40	$response_body = wp_remote_retrieve_body($response);
41	$response_data = json_decode($response_body);
42
43	if ($response_data && isset($response_data->success) && $response_data->success === false) {
44		$error_message = isset($response_data->errors[0]->message) ? esc_html($response_data->errors[0]->message) : 'Unknown error';
45		wp_send_json_error($error_message, 400);
46		exit();
47	}
48	else if ($response_data && isset($response_data->success) && $response_data->success === true && isset($response_data->error)) {
49		wp_send_json_error($response_data->error, 400);
50		exit();
51	}
52	
53	wp_send_json_success($response_data, 200, 0);
54}

سيتم إرجاع استجابة الملاحظات المحفوظة بنجاح مثل: التعليقات المحفوظة في منطقة <region_name>..

في مثال الوظيفة أعلاه، يمكنك أن ترى أننا قمنا بجمع php_version، وdb_type، وdb_version، وما إلى ذلك. ومن أجل راحتك، سأقدم بعض الأمثلة على الوظائف لهذه:

 1private function get_wp_version() {
 2	global $wp_version;
 3	return $wp_version;
 4}
 5
 6private function get_php_version() {
 7	return PHP_VERSION;
 8}
 9
10private function get_db_type() {
11	global $wpdb;
12
13	$query = "SELECT TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_NAME = 'wp_options'";
14	$result = $wpdb->get_row($query);
15
16	if ($result && isset($result->TABLE_SCHEMA)) {
17		$table_schema = $result->TABLE_SCHEMA;
18
19		if (strpos($table_schema, 'mysql') !== false) {
20			return 'MySQL';
21		} elseif (strpos($table_schema, 'pgsql') !== false) {
22			return 'PostgreSQL';
23		} elseif (strpos($table_schema, 'sqlite') !== false) {
24			return 'SQLite';
25		}
26	}
27
28	return 'Unknown';
29}
30
31private function get_db_version() {
32	global $wpdb;
33	return $wpdb->db_version();
34}
35
36private function get_server_type() {
37	if (isset($_SERVER['SERVER_SOFTWARE'])) {
38		return explode(' ', $_SERVER['SERVER_SOFTWARE'])[0];
39	}
40	return 'Unknown';
41}
42
43private function get_server_version() {
44	$uname = php_uname('s');
45
46	$serverTypes = [
47		'Apache' => 'Apache',
48		'Nginx' => 'Nginx',
49		'LiteSpeed' => 'LiteSpeed'
50	];
51
52	if (isset($serverTypes[$uname])) {
53		return $serverTypes[$uname];
54	}
55
56	return '0.0.0';
57}

الآن يجب أن يكون لديك كل ما تحتاجه لجمع تعليقات إلغاء تنشيط مكون WordPress الإضافي. قم بالتعديل حسب الضرورة لتناسب احتياجاتك.

ابدأ في جمع تعليقات التعطيل

إذا اتبعت الخطوات المذكورة أعلاه، عندما يحاول المستخدم إلغاء تنشيط المكون الإضافي الخاص بك، فيجب أن يظهر نموذج التعليقات:

تعليقات حول إلغاء تنشيط مكون WordPress الإضافي

يمكن للاستخدام إدخال أسباب إلغاء تنشيط البرنامج المساعد الخاص بك. يمكنك استرداد جميع تعليقاتك المجمعة من واجهة برمجة التطبيقات في أي وقت.

وثائق واجهة برمجة التطبيقات

نقطة النهاية الأساسية:

https://api.mecanik.dev/v1/developer

نقطة نهاية تعليقات ووردبريس:

https://api.mecanik.dev/v1/developer/{account_id}/wp-feedback

جلب التعليقات

  • الطريقة: GET
  • الرابط: https://api.mecanik.dev/v1/developer/{account_id}/wp-feedback?region=[region]
  • معلمات الرابط:
    • region (إلزامي): كود المنطقة حيث يتم تخزين التعليق. يمكن أن يكون `wnam`, `enam`, `weur`, `eeur` أو `apac`.
  • النطاق: read:wp_feedback
  • الرؤوس:
    • Authorization: رمز التحقق للوصول.
  • الرد:
    • 200 OK مع بيانات التعليق إذا نجح الطلب.
    • 400 طلب خاطئ إذا كانت المنطقة غير صالحة.
    • 403 ممنوع إذا لم يكن الرمز مصرحًا به.
    • 404 غير موجود إذا لم يكن الرمز موجودًا.
    • 406 غير مقبول إذا تم تقديم منطقة غير صالحة.

حفظ التعليق

  • الطريقة: PUT
  • الرابط: https://api.mecanik.dev/v1/developer/{account_id}/wp-feedback
  • النطاق: write:wp_feedback
  • الرؤوس:
    • Authorization: رمز التحقق للوصول.
    • نوع المحتوى: application/json
  • المحتوى:
    • كائن JSON يحتوي على:
      • reason (إلزامي): سبب تعطيل المستخدم. الصيغة المقبولة: `string`.
      • comments (إلزامي): تعليقات تعطيل المستخدم. الصيغة المقبولة: `string`.
      • wp_plugin_name (إلزامي): الاسم الحالي لوحدة الإضافة في ووردبريس. الصيغة المقبولة: `string`.
      • wp_plugin_version (إلزامي): الإصدار الحالي لوحدة الإضافة في ووردبريس. الصيغة المقبولة: `0.0.0.0`.
      • wp_site_url (إلزامي): الرابط الحالي لووردبريس. الصيغة المقبولة: `string`.
      • wp_version (إلزامي): الإصدار الحالي لووردبريس. الصيغة المقبولة: `0.0.0.0`.
      • wp_locale (إلزامي): الإعدادات المحلية الحالية لووردبريس. الصيغة المقبولة: `string`.
      • wp_multisite (إلزامي): إذا كان التثبيت الحالي لووردبريس متعدد المواقع. الصيغة المقبولة: `boolean`.
      • php_version (إلزامي): الإصدار الحالي لـ PHP. الصيغة المقبولة: `0.0.0.0`.
      • db_type (إلزامي): النوع الحالي لخادم قاعدة البيانات. الصيغة المقبولة: `string`.
      • db_version (إلزامي): الإصدار الحالي لخادم قاعدة البيانات. الصيغة المقبولة: `0.0.0.0`.
      • server_type (إلزامي): النوع الحالي للخادم الويب. الصيغة المقبولة: `string`.
      • server_version (إلزامي): الإصدار الحالي للخادم الويب. الصيغة المقبولة: `0.0.0.0`.
      • date_created (إلزامي): التاريخ الذي تم فيه إنشاء التعليق. الصيغة المقبولة: `YYYY-MM-DD HH:MM:SS`.
      • region (مطلوب): رمز المنطقة حيث يتم تخزين الملاحظات. يمكن أن تكون `wnam`، أو `enam`، أو `weur`، أو `eeur`، أو `apac`.
  • الرد:
    • 200 OK إذا تم حفظ التعليق بنجاح.
    • 400 طلب خاطئ إذا كان هناك خطأ في البيانات المقدمة.
    • 403 ممنوع إذا لم يكن الرمز مصرحًا به.
    • 404 غير موجود إذا لم يكن الرمز موجودًا.
    • 500 خطأ في الخادم الداخلي إذا حدث خطأ أثناء حفظ التعليق.

حذف التعليق

  • الطريقة: DELETE
  • الرابط: https://api.mecanik.dev/v1/developer/{account_id}/wp-feedback
  • النطاق: write:wp_feedback
  • الرؤوس:
    • Authorization: رمز التحقق للوصول.
  • المحتوى:
    • كائن JSON يحتوي على:
      • feedback_ids (مطلوب): مجموعة من الأعداد الصحيحة. مثال: `[1، 2، 3]`
      • region (إلزامي): كود المنطقة حيث يتم تخزين التعليق. يمكن أن يكون `wnam`, `enam`, `weur`, `eeur` أو `apac`.
  • الرد:
    • 200 OK إذا تم حذف التعليق بنجاح.
    • 400 طلب خاطئ إذا كان معرّف التعليق المقدم غير صالح.
    • 403 ممنوع إذا لم يكن الرمز مصرحًا به أو تم إلغاؤه/تم حظره.
    • 404 غير موجود إذا لم يكن الرمز موجودًا.
    • 500 خطأ في الخادم الداخلي إذا حدث خطأ أثناء حذف التعليق.

خاتمة

سيؤدي وجود نظام التعليقات هذا إلى إحداث فرق كبير في تطوير البرنامج الإضافي الخاص بك. آمل أن يكون هذا المنشور مفيدًا ويمكنك تحسين مكون WordPress الإضافي الخاص بك باستخدام واجهة برمجة التطبيقات الخاصة بي.

قد أقوم بتقديم تعليقات التنشيط في المستقبل، لكنني متشكك جدًا بشأنها لأنه لا يمكن للمستخدمين “الاشتراك” أو “إلغاء الاشتراك” فيها. لذا، في الوقت الحالي، سيكون لدينا فقط تعليقات حول التعطيل.

إذا كان لديك أي ملاحظات أو اقتراحات، فلا تتردد في استخدام نظام التعليقات أدناه.