fix(2meet-data-optimizer-hivepress-addon): let transient timeouts outlive their values; register site attributes once themes load
- review F5: a timeout entry expired before its value (a day vs a week), and HivePress reads a missing timeout as "never expires", serving the stale value for up to six more days. The timeout now expires a minute after the later of MAX_CACHE_TTL and its own time, so HivePress sees it expire first - review F7: site attributes accept only types with a plain index (json and binary would fail the CREATE TABLE) - review F8: the hp_listing_attrs group is registered on the run after after_setup_theme (init:1), so a filter added in a theme counts and the group has one definition per request; only keys of other groups are skipped - Verify: TTL test, attribute group tests, unit 148, integration 53, phpcs - PR: PR-115 (2.3 acceptance correctness review)
This commit is contained in:
@@ -280,17 +280,25 @@ final class TMDO_HivePress_Entity_Groups {
|
||||
* They get a group of their own — a new table, each column indexed at
|
||||
* creation — so hp_listing_core and its pinned definition stay unchanged.
|
||||
* Keys another group already manages, keys without the hp_ prefix and
|
||||
* unknown types are ignored. Backfill with `wp tmdo post-migrate-group`.
|
||||
* types that cannot take a plain index (json, binary) are ignored. Core
|
||||
* fills the new table from native meta (drift fix) before using it.
|
||||
*
|
||||
* Registered once themes are loaded (the init:1 run): a filter added in a
|
||||
* theme is seen, and the group gets one definition per request.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private static function register_hp_listing_attributes_group(): void {
|
||||
if ( ! did_action( 'after_setup_theme' ) ) {
|
||||
return;
|
||||
}
|
||||
$fields = array();
|
||||
foreach ( (array) apply_filters( 'tmdo_hp_listing_attribute_fields', array() ) as $key => $type ) {
|
||||
$key = (string) $key;
|
||||
$key = (string) $key;
|
||||
$owner = TMDO_Entity_Registry::get_field( 'post', $key, 'hp_listing' );
|
||||
if ( 1 !== preg_match( '/^hp_[a-z0-9_]+$/', $key )
|
||||
|| ! in_array( $type, TMDO_Entity_Registry::VALID_TYPES, true )
|
||||
|| null !== TMDO_Entity_Registry::get_field( 'post', $key, 'hp_listing' ) ) {
|
||||
|| ! in_array( $type, array( 'text', 'textarea', 'integer', 'decimal', 'boolean', 'date', 'datetime', 'timestamp', 'enum' ), true )
|
||||
|| ( null !== $owner && 'hp_listing_attrs' !== $owner['group'] ) ) {
|
||||
continue;
|
||||
}
|
||||
$fields[] = array(
|
||||
|
||||
@@ -270,9 +270,10 @@ final class TMDO_Hivepress_Transient_Filter {
|
||||
* In wp_options both halves of the transient pair are written with
|
||||
* `autoload=no` (they are read on-demand only — never via
|
||||
* wp_load_alloptions() — so eagerly loading them on every page would defeat
|
||||
* the point of the move). In the object cache a timeout entry expires when
|
||||
* it says; the value, written before its timeout, after MAX_CACHE_TTL — a
|
||||
* miss only makes HivePress rebuild it — so entries of deleted posts do
|
||||
* the point of the move). In the object cache the value, written before its
|
||||
* timeout, expires after MAX_CACHE_TTL (a miss only makes HivePress rebuild
|
||||
* it) and the timeout a minute after the later of that and its own time,
|
||||
* so HivePress always sees it expire first; entries of deleted posts do
|
||||
* not pile up (2.3 PR-099).
|
||||
*
|
||||
* @param int $post_id Post ID.
|
||||
@@ -286,7 +287,9 @@ final class TMDO_Hivepress_Transient_Filter {
|
||||
$option_name = ( $is_timeout ? '_transient_timeout_' : '_transient_' ) . $translated;
|
||||
|
||||
if ( wp_using_ext_object_cache() ) {
|
||||
$ttl = $is_timeout ? min( self::MAX_CACHE_TTL, max( 1, (int) $meta_value - time() ) ) : self::MAX_CACHE_TTL;
|
||||
// A timeout outlives its value: HivePress takes a missing timeout for
|
||||
// "never expires" and would keep serving the value.
|
||||
$ttl = $is_timeout ? max( self::MAX_CACHE_TTL, (int) $meta_value - time() ) + MINUTE_IN_SECONDS : self::MAX_CACHE_TTL;
|
||||
wp_cache_set( $option_name, $meta_value, self::CACHE_GROUP, $ttl );
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user