wp_remote_post()によるJSON文字列の送信


13

私はmailchimp統合を構築しており、JSONコードを使用したPOST呼び出しが必要です。

いいえ、実際に機能する次のコードを使用しています。

$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は配列またはオブジェクトである必要があります。507行目で../wp-includes/Requests/Transport/cURL.phpに指定された不正な値

それを回避する方法は?

'body'インデックスでプレーン配列を使用しようとしましたが、MailChimpはJSON解析エラーを返します。


1
このパッチをコアに適用しましたか?core.trac.wordpress.org/ticket/37700
Otto

面白い。商用プラグインであり、どのWPインストールでも機能する必要があります。しかし、WPのバグのようですので、私にとっては問題ありません。どうもありがとう!
a-coder

回答:


15

次の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.