我使用woocommerce v3 API开发应用程序。
我想通过remote_url推送图片。
但我无法通过Product API更新将其上传到Woocommerce
我在代码中发现了wp_safe_remote_get从Wordpress下载图像的问题。但是这种方法认为我的网址不安全。
为什么不安全? 我可以添加一些whitlist系统,以避免将此URL视为不安全吗?
答案 0 :(得分:1)
Wordpress代码似乎对使用wp_safe_remote_get()
提取的网址进行同一主机检查。
重要的部分是wp_http_validate_url
函数,特别是第524-530行,它们在这里:
$parsed_home = @parse_url( get_option( 'home' ) );
if ( isset( $parsed_home['host'] ) ) {
$same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) );
} else {
$same_host = false;
}
如果$same_host
为false
,则该方法会将网址视为不安全。
我看不到白名单。如果你想避免这个问题,你可能需要编辑代码才能使用wp_remote_get()
。
更新:前面的参数是错误的。即使端口不正常,代码也会返回url。
答案 1 :(得分:0)
如果网址的主机包含以下某个符号,则该网址将被拒绝::#?[]
如果无法检索此图片,请尝试删除?sha=989266d5133de145
答案 2 :(得分:0)
我一直尝试在实时服务器上传您的图片,我使用woocommerce v3 API方法,一切正常。也许您需要重新检查您的应用程序功能,服务器,防火墙,增加超时http等,问题可能来自图像服务器。
https://github.com/woothemes/woocommerce/blob/master/includes/api/class-wc-api-products.php#L2333
protected function upload_image_from_url( $image_url, $upload_for = 'product_image' ) {
$file_name = basename( current( explode( '?', $image_url ) ) );
$wp_filetype = wp_check_filetype( $file_name, null );
$parsed_url = @parse_url( $image_url );
// Check parsed URL.
if ( ! $parsed_url || ! is_array( $parsed_url ) ) {
throw new WC_API_Exception( 'woocommerce_api_invalid_' . $upload_for, sprintf( __( 'Invalid URL %s', 'woocommerce' ), $image_url ), 400 );
}
// Ensure url is valid.
$image_url = str_replace( ' ', '%20', $image_url );
// Get the file.
$response = wp_safe_remote_get( $image_url, array(
'timeout' => 10
) );
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
throw new WC_API_Exception( 'woocommerce_api_invalid_remote_' . $upload_for, sprintf( __( 'Error getting remote image %s', 'woocommerce' ), $image_url ), 400 );
}
...
根据您的问题wp_safe_remote_get
,我们可以调整这些功能,只是为了测试wp_safe_remote_get
以按网址上传图片。
这里是wp_safe_remote_get
Array
(
[headers] => Array
(
[content-disposition] => filename="GI64000_front.png"
[content-length] => 934080
[content-type] => image/png
[etag] => "6f19381f5b2ae0657f6e7945d7ca4bac05e3ad3a"
[server] => nginx
[expires] => Mon, 20 Mar 2017 19:20:54 GMT
[last-modified] => Sun, 20 Mar 2016 19:20:54 GMT
[connection] => close
[date] => Wed, 23 Mar 2016 00:19:28 GMT
[content-encoding] => gzip
)
[body] => �PNG
... I skip this part ...
[response] => Array
(
[code] => 200
[message] => OK
)
[cookies] => Array
(
)
[filename] =>
)