一些事情:
第一:
为您的函数添加前缀 - 特别是如果您使用的名称具有全局范围或吸引力。
api() 确实应该类似于solaiman_api() 以防止任何冲突。
第二:
您应该使用WP Transients API 来缓存结果,这样您就不会限制 CMC API 的速率
第三:
对于您的问题的实际答案,您只需将 URL 中的输入值参数化即可。
function solaiman_api( $atts ) {
extract( shortcode_atts( array(
'placeholder' => ''
), $atts ) );
$coin = $atts['coin'] ? $atts['coin'] : 0; // Default to 0 for BTC
$limit = $atts['limit'] ? $atts['limit'] : 250; // Default to 250
$url = 'https://api.coinmarketcap.com/v1/ticker/?start='. $coin .'&limit='. $limit;
$response = wp_remote_get( esc_url_raw( $url ) );
$api_response = json_decode( wp_remote_retrieve_body( $response ), true );
foreach( $api_response as $c ){
echo $c['name'].': $'.$c['price_usd'].'<br />';
}
}
add_shortcode( 'cmc_api', 'solaiman_api' );
请注意,我更改了您的函数名称和简码,因为 api_short 的描述性不强。
这个短代码现在看起来像这样:
[cmc_api coin="1" limit="1"]
这应该给你以太坊的价格。
改用此代码:
这里有一个更好的,根据 CMC 的服务条款将结果缓存 10 分钟:
function solaiman_api( $atts ) {
extract( shortcode_atts( array(
'placeholder' => ''
), $atts ) );
$coin = $atts['coin'] ? $atts['coin'] : 0; // Default to 0 for BTC
$limit = $atts['limit'] ? $atts['limit'] : 250; // Default to 250
$url = 'https://api.coinmarketcap.com/v1/ticker/?start='. $coin .'&limit='. $limit;
$transient_name = 'cmc_api_'.$coin.'_'.$limit; // One transient per coin per limit
if( false === ( $response = get_transient( $transient_name ) ) ){
$response = wp_remote_get( esc_url_raw( $url ) );
set_transient( $transient_name, $response, 600 ); // Cache for 10 minutes
}
$api_response = json_decode( wp_remote_retrieve_body( $response ), true );
foreach( $api_response as $c ){
echo $c['name'].': $'.$c['price_usd'].'<br />';
}
}
add_shortcode( 'cmc_api', 'solaiman_api' );
您可以在此处查看[cmc_api coin="1" limit="1"] 的示例:http://xhynk.com/headless/2018/02/28/cmc-test/