Senden einer JSON-Zeichenfolge über wp_remote_post ()

12

Ich baue eine Mailchimp-Integration auf und sie erfordern einen POST-Aufruf mit JSON-Code.

Nein, ich verwende diesen Code, der tatsächlich funktioniert :

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

Es wird jedoch eine PHP-Warnung zurückgegeben

Warnung: http_build_query (): Parameter 1 wird voraussichtlich Array oder Objekt sein. Falscher Wert in ../wp-includes/Requests/Transport/cURL.php in Zeile 507

Wie vermeide ich das?

Ich habe versucht, nur das einfache Array im 'body'-Index zu verwenden, aber MailChimp gibt einen JSON-Analysefehler zurück.

a-coder
quelle
1
Haben Sie diesen Patch auf den Kern angewendet? core.trac.wordpress.org/ticket/37700
Otto
Interessant. Ist ein kommerzielles Plugin, muss dann auf jeder WP-Installation funktionieren. Aber da scheint ein WP-Bug zu sein, ist für mich ok. Danke vielmals!
A-Codierer

Antworten:

13

Versuchen Sie, den data_formatParameter in Ihrer Anfrage wie folgt einzustellen :

$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',
));

Es sieht so aus, als ob das Format standardmäßig verwendet querywird. In diesem Fall versucht WordPress, die Daten mit zu formatieren http_build_query, was zu Problemen führt, da Sie den Text bereits als Zeichenfolge formatieren. Hier ist der relevante Check-in 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, '&');
    }
}

Da Ihr Fehler aus Zeile 507 von stammt wp-includes/Requests/Transport/cURL.php, können wir sehen, dass dies der Root-Aufruf von 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;
}
Phatskat
quelle