كيف تضبط نقطة نهاية JSON في ووردبريس للوصول إلى واجهة برمجية خارجية


عبد اللطيف ايمش

هنالك الكثير من الواجهات البرمجية المبنية على JSON التي توفر وصولًا عبر دوال من جهة الخادوم فقط، فلو أردنا استخدام عميل JavaScript مع تلك الواجهات البرمجية الخارجية، فسنحتاج إلى ضبط خادومنا للوصول إلى تلك الواجهات البرمجية الخارجية ثم تخديم تلك البيانات عبر Ajax أو عبر نقطة نهاية (endpoint) خاصة بك. ولحسن الحظ، فعل ذلك سهلٌ جدًا في ووردبريس.
سأريك في هذا الدرس كيفية الحصول على أجور الشحن عبر Easy Post API باستخدام نقطة نهاية في ووردبريس.
لتبسيط هذا الدرس (وجعله قصيرًا) فسنرسل ستة معاملات (وهو عدد كاف لواجهة Easy Post البرمجية لإعادة أجور الشحن):

  • عرض الطرد
  • ارتفاع الطرد
  • طول الطرد
  • وزن الطرد
  • كود Zip للمرسل
  • كود Zip للمستقبل

ضبط نقطة نهاية JSON

أوّل خطوة هي ضبط المسار الذي ستُخدَّم منه بيانات JSON، وفي هذه الحالة هو:

/wp-json/easy-post/v1/rates/

الشيفرة:

/**
 * Sets up a JSON endpoint at /wp-json/easy-post/v1/rates/
 */
function easy_post_api_init() {
    $namespace = 'easy-post/v1';
    register_rest_route( $namespace, '/rates/', array(
        'methods' => 'GET',
        'callback' => 'easy_post_return_rates',
    ) );
}
add_action( 'rest_api_init', 'easy_post_api_init' );

عرض البيانات

تتوقع نقطة النهاية إرسال ست قيم من البيانات كطلبية، وستستخدمها للحصول على البيانات من الواجهة البرمجية الخارجية، فلو لم تكن تلك القيم موجودةً فستستعمل القيم الافتراضية، وسنحرص أن تكون تلك القيم رقميةً فقط.
مثال عن رابط URL مع قيم لكل المعاملات:

/wp-json/easy-post/v1/rates/?zip=78701&width=10&length=10&height=10&weight=10&shipping_zip=78751

الشيفرة:

/**
 * عرض مخرجات Easy Post عبر النهاية الطرفية
 *
 * نستخدم القيم المبدئية في حال عدم ذكر بيانات في الطلب، إلا أن إعادة خطأ ربما تكون فكرة أفضل.
 * Valid URL: /wp-json/easy-post/v1/rates/?zip=78701&width=10&length=10&height=10&weight=10&shipping_zip=78751
 */
function easy_post_return_rates( WP_REST_Request $request ) {
    // الإعدادات المبدئية للشحن
    $defaults = array(
        'zip' => 78701,
        'width' => 10,
        'length' => 10,
        'height' => 10,
        'weight' => 16,
        'shipping_zip' => 94105
    );
    // الحصول على المعطيات من الطلب
    $params = $request->get_query_params();
    // التأكد من توفر جميع المعطيات
    $params = array_replace( $defaults, $params );
    // تنظيف المفاتيح
    $params = array_map( "absint", $params );
    // إنشاء قيم مفاتيح فريدة لتحديد قيم البيانات المؤقتة transient أو العثور عليها
    $key = 'easy_post_' . implode( "_", $params );
    /**
     * نحتفظ بالإجابة في قيمة مؤقتة transient ضمن قاعدة بيانات ووردبريس
     * لتجنب إرسال الكثير من الطلبات في وقت قصير
     * 
     * تنتهي صلاحية هذه البيانات بعد عشر دقائق
     */
     if ( false === ( $data = get_transient( $key ) ) ) {
        $data = easy_post_make_request( $params );
        $response = new WP_REST_Response( $data );
        // التخبئة لمدة عشر دقائق
        set_transient( $key, $response, 60 * 10 );
    } else {
        // إرجاع القيمة المخبّأة
        return get_transient( $key );
    }
    return $response;
}

الحصول على البيانات

الدالة easy_post_make_request()‎ هي الدالة التي تطلب البيانات من الواجهة البرمجية الخارجية، والغرض من أغلبية الشيفرات التي هنا هي تجهيز الطلبية ضمن مصفوفة يمكن لواجهة Easy Post البرمجية أن تعالجها:

/**
*العثور على البيانات من الواجهة البرمجية لـ Easy Post باستخدام الدالة wp_remote_post
*/
function easy_post_make_request( $params ) {
    $to_address = array(
        'zip' => $params['shipping_zip'],
        'country' => 'US'
    );
    $from_address = array(
        'zip' => $params['zip'],
        'country' => 'US'
    );
    $parcel = array(
        'length' => $params['length'],
        'width' => $params['width'],
        'height' => $params['height'],
        'weight' => $params['weight']
    );
    $request = array(
        'shipment' => array(
            'to_address' => $to_address,
            'from_address' => $from_address,
            'parcel' => $parcel
        )
    );
    $args = array(
        'method'    => 'POST',
        'blocking'  => true,
        'headers'   => array(
            'Content-Type' => 'application/json'
        ),
        'timeout'   => 15,
        'sslverify' => false,
        'body' => json_encode( $request )
    );
    // ضع مفتاح API الخاص بك مكان EASYPOST_TEST_API_KEY
    $api_url = 'https://' . EASYPOST_TEST_API_KEY . ':@api.easypost.com/v2/shipments';
    $response = wp_remote_post( $api_url, $args );

    if ( ! is_wp_error( $response ) ) {
    $response = json_decode( $response['body'] );
    }
    return $response;
}

استخدام البيانات

عندما نحاول الوصول إلى نقطة النهاية التي أنشأناها، فإن بيانات JSON التي جلبناها من Easy Post ستظهر لنا:

1-json.gif


يمكنك الآن الحصول على أجور الشحن ديناميكيًا في موقعك باستخدام نقطة النهاية التي أنشأناها في هذا الدرس.
يمكنك الاطلاع على كامل الشيفرة هنا.
ترجمة –وبتصرّف– للمقال How to Set JSON Endpoints in WordPress to Access an External API لصاحبه Devin Price

حقوق الصورة البارزة محفوظة لـ Freepik





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن