我读过你的很多帖子,你的查询似乎非常复杂,要么会减慢页面速度,要么会导致页面崩溃。
瞬态绝对是存储此类劳动密集型查询结果的一种选择。正如@s\\u ha\\u dum所提到的,您需要研究您将要保存的内容。
瞬态检查的“额外负载”和数据库中所需的空间是否会超过瞬态可能带来的资源收益?
您需要记住,创建瞬变非常昂贵,因此这是您不希望像您所说的那样每小时都要做的事情。应创建一个具有到期时间的瞬态,使其有用,例如将删除时间设置为天或月。
一旦创建,从瞬态中检查和获取数据就意味着在不到0.002秒的时间内进行2次db调用,因此在真正昂贵的操作中,您肯定会收获很多。
在db中,空间永远不应该是一个问题,因为您只想存储帖子ID,而不想存储完整的对象。我们希望在瞬态中存储尽可能少的数据。这意味着您需要运行第二个查询来获取post对象,但此查询将更加精简。这里最重要的一点是处理并消除了第一个昂贵的查询。第一个查询也应该更加精简,因为我们将只查询id。
在输入数据是动态的情况下,可以而且必须使用输入数据创建动态瞬态名称。你需要记住,一个过渡者的名字只能有45个字符长。超过45个字符的名称使瞬态不会创建,并且每次页面加载都会尝试创建一个瞬态。正如我所说,创建瞬态非常昂贵,您不希望在每个页面负载上创建瞬态,因为这将在已经过载的查询上增加更多负载。我总是将输入数据传递给md5()
(生成一个32字符的密钥)来创建一个唯一的哈希密钥,然后有一个临时名称,如some_name_{md5()_result}
. 只需记住使用json_encode()
首先,然后使用该结果传递给md5()
. 你可以调查一下these posts 要查看示例,请使用md5()
.
这里可能存在的问题是您将要创建的瞬变量。如果可能有100万个动态输入组合,则将创建100万个瞬态,当删除瞬态时,这些瞬态可能会产生影响。这可能再次导致后端崩溃问题。
如果输入是动态的,您还需要为没有返回帖子的查询保存空值,因此您需要考虑这一点。
这里真正的一个重要因素是,两个、十个或一百个用户在一周内使用相同的精确输入值的可能性有多大。我的意思是,如果只有一到两个人会使用相同的精确输入值,那么创建瞬态是没有用的。正如我所说,创建瞬变是昂贵的,所以您不会希望只为一个或两个人创建不必要的瞬变
在一天结束时,你需要掌握这些信息,并决定一个过渡期的有用或无用程度,然后采取行动。
如果你希望有短暂的
// Here is your string of inputs
$args = \'value-1=value&value-2=250000\';
// Create a unique hashed key from the arguments
$key = md5( $args );
//$key = md5( json_encode( $args ) ); // If $args is an array
// Set the transient name
$transient_name = \'custom_input_\' . $key;
if ( false === ( $query = get_transient( $transient_name ) ) ) {
$query = get_posts( $args . \'&fields=ids\' ) // Only get post ids. Alter if $args is an array
// Set the transient only if we have results
if ( $query )
set_transient(
$transient_name, // Transient name
$query, // What should be saved
7 * DAY_IN_SECONDS // Lifespan of transient is 7 days
);
}
// Now run the second query to get the full objects. Just add \'post_type\' if this is not \'post\' posts
if ( $query ) {
$args = [
\'post__in\' => $query,
\'posts_per_page\' => count( $query ),
\'order\' => \'ASC\',
\'orderby\' => \'post_in\'
];
$q = new WP_Query( $args );
var_dump( $q );
}
然后,我们可以在发布新帖子、删除帖子、取消删除或更新帖子时刷新所有瞬态
add_action( \'transition_post_status\', function ()
{
global $wpdb;
$wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE (\'_transient%_custom_input_%\')" );
$wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE (\'_transient_timeout%_custom_input_%\')" );
});