การส่งสตริง JSON ผ่าน wp_remote_post ()


13

ฉันกำลังสร้างการรวม mailchimp และพวกเขาต้องการการเรียก POST ด้วยรหัส JSON

ไม่ฉันใช้รหัสนี้ที่จริงการทำงาน :

$data = wp_remote_post($url, array(
    'headers'   => array('Content-Type' => 'application/json; charset=utf-8'),
    'body'      => json_encode($array_with_parameters),
    'method'    => 'POST'
));

แต่มันกลับคำเตือน PHP

คำเตือน: http_build_query (): พารามิเตอร์ 1 คาดว่าจะเป็น Array หรือ Object ค่าไม่ถูกต้องที่ระบุใน ../wp-includes/Requests/Transport/cURL.php ในบรรทัด 507

วิธีการละทิ้งมัน?

ฉันพยายามใช้อาร์เรย์ธรรมดาในดัชนี 'body' แต่ MailChimp ส่งคืนข้อผิดพลาดในการวิเคราะห์ JSON


1
คุณใช้แพทช์นี้กับคอร์? core.trac.wordpress.org/ticket/37700
อ็อตโต

น่าสนใจ เป็นปลั๊กอินเชิงพาณิชย์จากนั้นจะต้องทำงานกับการติดตั้ง WP ใด ๆ แต่เนื่องจากดูเหมือนว่าจะเป็นข้อผิดพลาด WP สำหรับฉันก็โอเค ขอบคุณมาก!
a-coder

คำตอบ:


16

ลองตั้งค่าdata_formatพารามิเตอร์ในคำขอของคุณดังนี้:

$data = wp_remote_post($url, array(
    'headers'     => array('Content-Type' => 'application/json; charset=utf-8'),
    'body'        => json_encode($array_with_parameters),
    'method'      => 'POST',
    'data_format' => 'body',
));

ดูเหมือนว่ารูปแบบอาจเป็นค่าเริ่มต้นqueryซึ่งในกรณีนี้ WordPress พยายามจัดรูปแบบข้อมูลโดยใช้http_build_queryซึ่งทำให้คุณมีปัญหาเนื่องจากคุณได้จัดรูปแบบเนื้อหาเป็นสตริง นี่คือการตรวจสอบที่เกี่ยวข้องwp-includes/class-http.php:

if (!empty($data)) {
    $data_format = $options['data_format'];

    if ($data_format === 'query') {
        $url = self::format_get($url, $data);
        $data = '';
    }
    elseif (!is_string($data)) {
        $data = http_build_query($data, null, '&');
    }
}

เนื่องจากข้อผิดพลาดของคุณมาจากบรรทัด 507 ของwp-includes/Requests/Transport/cURL.phpเราจะเห็นได้ว่านี่คือการเรียกรูทถึงhttp_build_query:

protected static function format_get($url, $data) {
    if (!empty($data)) {
        $url_parts = parse_url($url);
        if (empty($url_parts['query'])) {
            $query = $url_parts['query'] = '';
        }
        else {
            $query = $url_parts['query'];
        }

        $query .= '&' . http_build_query($data, null, '&');
        $query = trim($query, '&');

        if (empty($url_parts['query'])) {
            $url .= '?' . $query;
        }
        else {
            $url = str_replace($url_parts['query'], $query, $url);
        }
    }
    return $url;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.