小部件-存储和更新数据

时间:2018-01-09 作者:Nick

存储数据的最佳方式是什么?数据库、缓存等?

我想构建一个小部件,它将显示来自API的一些数据,但由于限制,我不想每次都调用API。我希望每3小时或每天调用一次API,并存储API中的数据和调用API时的时间戳。

怎么做?

抱歉,没有要显示的代码。这是个理论问题

2 个回复
最合适的回答,由SO网友:Scruffy Paws 整理而成

您可能想看看如何使用WordPressTransients 因为它们可以处理数据和时间戳/过期。

您也可以退房The Deal with WordPress Transients 通过CSS技巧,也有一些好的信息。

SO网友:Dhaval Shah

为此目的Transient API 是正确的选择。

From Codex page:

Transient API提供了一种在数据库中临时存储cacheddata的简单而标准化的方法,方法是为cacheddata指定一个自定义名称和一个atimeframe,在该名称和atimeframe过期后将其删除。

。。。

同样值得注意的是,瞬变过程本质上是由杂音加速的,而正常的选项则不是。例如,一个memcached插件可以让WordPress将瞬时值存储在快速内存中,而不是数据库中。因此,应使用瞬态存储任何预期将过期或随时可能过期的数据。也不应假设瞬态存在于数据库中,因为它们可能根本不存储在数据库中。

示例代码如何设置瞬态

set_transient( $transient, $value, $expiration );

$transient

(字符串)临时名称。应为非SQL转义。长度必须小于等于172个字符。

$value

(数组|对象)要保存的数据,可以是正则变量,也可以是数组/对象。API将为您处理复杂数据的序列化。

$expiration

(整数)刷新前保留数据的最长秒数。瞬态可能在$过期之前过期(由于外部对象缓存或数据库升级),但在$过期之后将永远不会返回其值。

因此,例如,要将$special\\u query\\u results对象保存12小时,您可以执行以下操作:

set_transient( \'special_query_results\', $special_query_results, 60*60*12 );

如何获得瞬态

get_transient( $transient );

$瞬态使用set\\u transient()保存瞬态时使用的唯一slug。

在本例中,我们可以使用以下工具获取特殊查询结果:

get_transient( \'special_query_results\' );

如果瞬态不存在或已过期,则get_transient() 将返回false. 应该使用标识运算符(===)而不是普通的相等运算符(==),因为要存储的数据可能是整数值零(或其他“空”/“假”数据)。正因为如此;“错误”;值,不应使用瞬态来保存纯布尔值(真/假)。将它们放入数组或将其转换为整数。

示例用法:

if ( false === ( $value = get_transient( \'value\' ) ) ) {
     // this code runs when there is no valid transient set
}
上述代码将获取瞬态并将其放入$value. if块中的代码仅在没有有效的瞬态时运行。这通常是通过其他方式重新生成瞬态值的方法。请记住,瞬态可能在正常到期时间之前不可用。

完整示例

function wp1707_get_my_api_data ( $update = false ){
    // Checking if our transient is available.
    $my_api_data = get_transient( \'wp1707_my_api_data\' );

    // Is transient data not available or do we want to force the update?
    if ( empty( $my_api_data ) || !$update) {

        // Get the data from API
        $my_api_data = call_to_my_api();
        // Now let\'s set that data as transient and store it for 3hours
        set_transient( \'wp1707_my_api_data\', $my_api_data, 3 * HOUR_IN_SECONDS );
    }

    // 
    return $my_api_data;
}
使用瞬态时的注意事项API瞬态有时间限制,但可能会过期before 您设置的过期时间。Always make sure to have fallback in your code.Never assume or expect transients to be stored inside database.my_api_data 是糟糕的设计决策。最好用唯一的前缀/后缀填充段塞,例如wp1707_wcf_my_api_data. 这是为了确保任何其他设计糟糕的插件/主题不会覆盖您的瞬态数据Don\'t Cache Everything with Transients
  • This article by CSS-Tricks 对示例代码的利弊有一些很好的指示
  • 结束

    相关推荐

    使用WC REST API的流程结账

    主站点使用WordPress/WooCommerce,远程站点服务于前端;是否可以使用WooCommerce REST API处理结帐表单,并接收指向所选支付网关的重定向URL我尝试创建一个自定义AJAX函数,但它似乎需要提交表单上的nonce字段,这是有问题的,因为前端不在同一台服务器上。