通过带有参数的短代码公开的单个API调用

时间:2019-06-26 作者:Connor

我正在尝试创建一个带有单个短代码的插件,该短代码使用一个参数来标识要从JSON API响应中获取的字段。

API返回多个值,我正在尝试将其分解。例如:

[user_link type="url"]
将只公开url,而

[user_link type="user_name"]
只会暴露名称。

所有这些应该只影响API一次,而不是两次。

我试图将其设置为我的插件文件如下所示:

$api_response = null;

function get_user_info($type) {
  if($api_response === null) {
     ... make api reqest
     $api_response = api request data;
     return $api_response[$type];
  } else {
    return $api_response[$type];
  }
} 
add_shortcode( "user_link", "get_user_info" );
这仍然会导致多个API请求,我添加的每个短代码一个。我认为这是因为两个原因之一。要么清除变量$api\\U响应,要么同时运行所有短代码,并且在下一个运行时未设置该变量。

我在这里的做法完全失败了吗?有没有办法做到这一点?我试图分别公开每一段数据,以便最终用户能够按照自己的意愿显示和设置数据样式。

1 个回复
最合适的回答,由SO网友:ngearing 整理而成

这里的问题是变量作用域。您正在尝试本地访问全局变量。

// Global scope.
$api_response = null;

function get_user_info( $type ) {
    // Local scope.    

    if ( $api_response === null ) {
        // make api reqest.
        // $api_response = api request data;
        return $api_response[ $type ];
    } else {
        return $api_response[ $type ];
    }
}
add_shortcode( \'user_link\', \'get_user_info\' );
添加global $api_response 函数的顶部可以解决您的问题,但通常不赞成使用全局变量,您应该考虑另一种解决方案,如瞬态(如注释中所述)。

如何向函数中添加瞬态的示例如下:

function get_user_info( $type ) {
    $user_id      = get_current_user_id();
    $api_response = get_transient( "prefix_api_response_$user_id" );

    if ( ! $api_response ) {
        // make api request.
        $api_response = api_request_data();

        // Save response for 1 day.
        set_transient( "prefix_api_response_$user_id", $api_response, DAY_IN_SECONDS );
    }

    return $api_response[ $type ];
}

相关推荐

Shortcode to show the code

如何创建一个短代码(或类似的代码)来在页面的某个地方显示页脚?我试过了,但没有结果。。。function show_footer() { return get_footer(); } add_shortcode( \'show_f\', \'show_footer\' ); 或者这个。。。function show_footer() { get_footer(); } add_shortcode( \'show_f\', \'sho