From 9bc934780dcc562ac7b9910b72f854b9a765db33 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 13:54:18 +0200 Subject: [PATCH 01/14] Prevent duplicated orders and attendees as a result --- src/Tickets/Commerce/Abstract_Order.php | 2 +- src/Tickets/Commerce/Cart/Unmanaged_Cart.php | 2 +- src/Tickets/Commerce/Order.php | 110 ++++++++++++++++++- 3 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/Tickets/Commerce/Abstract_Order.php b/src/Tickets/Commerce/Abstract_Order.php index f0cdfe3beb..f4ec3d373a 100644 --- a/src/Tickets/Commerce/Abstract_Order.php +++ b/src/Tickets/Commerce/Abstract_Order.php @@ -95,7 +95,7 @@ public function get_purchaser_data( $data ) { if ( is_user_logged_in() ) { $user = wp_get_current_user(); $purchaser['purchaser_user_id'] = $user->ID; - $purchaser['purchaser_full_name'] = $user->first_name . ' ' . $user->last_name; + $purchaser['purchaser_full_name'] = trim( $user->first_name . ' ' . $user->last_name ); $purchaser['purchaser_first_name'] = $user->first_name; $purchaser['purchaser_last_name'] = $user->last_name; $purchaser['purchaser_email'] = $user->user_email; diff --git a/src/Tickets/Commerce/Cart/Unmanaged_Cart.php b/src/Tickets/Commerce/Cart/Unmanaged_Cart.php index c52894ece5..49d5bddc2f 100644 --- a/src/Tickets/Commerce/Cart/Unmanaged_Cart.php +++ b/src/Tickets/Commerce/Cart/Unmanaged_Cart.php @@ -124,7 +124,7 @@ public function clear() { $this->set_hash( null ); delete_transient( Commerce\Cart::get_transient_name( $cart_hash ) ); - tribe( Commerce\Cart::class )->set_cart_hash_cookie( $cart_hash ); + tribe( Commerce\Cart::class )->set_cart_hash_cookie( null ); // clear cart items data. $this->items = []; diff --git a/src/Tickets/Commerce/Order.php b/src/Tickets/Commerce/Order.php index c41d8df1a2..9ddc429655 100644 --- a/src/Tickets/Commerce/Order.php +++ b/src/Tickets/Commerce/Order.php @@ -8,6 +8,7 @@ use TEC\Tickets\Commerce\Utils\Value; use Tribe__Date_Utils as Dates; use WP_Post; +use TEC\Tickets\Commerce\Status\Pending; /** * Class Order @@ -387,6 +388,7 @@ static function ( $item ) { * Creates a order from the items in the cart. * * @since 5.1.9 + * @since TBD Now it will only create one order per cart hash. Every next time it will update the existing order. * * @throws \Tribe__Repository__Usage_Error * @@ -451,13 +453,16 @@ static function ( $item ) { $total = $this->get_value_total( array_filter( $items ) ); + $hash = $cart->get_cart_hash(); + $existing_order_id = null; + $order_args = [ - 'title' => $this->generate_order_title( $original_cart_items, $cart->get_cart_hash() ), + 'title' => $this->generate_order_title( $original_cart_items, $hash ), 'total_value' => $total->get_decimal(), 'subtotal' => $subtotal->get_decimal(), 'items' => $items, 'gateway' => $gateway::get_key(), - 'hash' => $cart->get_cart_hash(), + 'hash' => $hash, 'currency' => Utils\Currency::get_currency_code(), 'purchaser_user_id' => $purchaser['purchaser_user_id'], 'purchaser_full_name' => $purchaser['purchaser_full_name'], @@ -466,7 +471,20 @@ static function ( $item ) { 'purchaser_email' => $purchaser['purchaser_email'], ]; - $order = $this->create( $gateway, $order_args ); + if ( $hash ) { + $existing_order_id = tec_tc_orders()->by_args( + [ + 'status' => tribe( Pending::class )->get_wp_slug(), + 'hash' => $hash, + ] + )->first_id(); + + if ( ! $existing_order_id || ! is_int( $existing_order_id ) ) { + $existing_order_id = null; + } + } + + $order = $this->upsert( $gateway, $order_args, $existing_order_id ); // We were unable to create the order bail from here. if ( ! $order ) { @@ -514,6 +532,92 @@ public function create( Gateway_Interface $gateway, $args ) { return tec_tc_orders()->set_args( $args )->create(); } + /** + * Filters the values and creates a new Order with Tickets Commerce or updates an existing one. + * + * @since TBD + * + * @param Gateway_Interface $gateway The gateway to use to create the order. + * @param array $args The arguments to create the order. + * @param ?int $existing_order_id The ID of an existing order to update. + * + * @return false|WP_Post + */ + public function upsert( Gateway_Interface $gateway, array $args, ?int $existing_order_id = null ) { + $gateway_key = $gateway::get_key(); + + /** + * Allows filtering of the order upsert arguments for all orders created via Tickets Commerce. + * + * @since TBD + * + * @param array $args The arguments to create the order. + * @param Gateway_Interface $gateway The gateway to use to create the order. + */ + $args = apply_filters( "tec_tickets_commerce_order_{$gateway_key}_upsert_args", $args, $gateway ); + + /** + * Allows filtering of the order upsert arguments for all orders created via Tickets Commerce. + * + * @since TBD + * + * @param array $args The arguments to create the order. + * @param Gateway_Interface $gateway The gateway to use to create the order. + */ + $args = apply_filters( 'tec_tickets_commerce_order_upsert_args', $args, $gateway ); + + /** + * Allows filtering of the existing order ID before "upserting" an order. + * + * @since TDB + * + * @param int $existing_order_id The existing order ID. + */ + $existing_order_id = (int) apply_filters( 'tec_tickets_commerce_order_upsert_existing_order_id', $existing_order_id ); + + if ( ! $existing_order_id ) { + return $this->create( $gateway, $args ); + } + + /** + * Allows filtering of the order update arguments for all orders created via Tickets Commerce. + * + * @since TBD + * + * @param array $args + * @param Gateway_Interface $gateway + */ + $update_args = apply_filters( "tec_tickets_commerce_order_{$gateway_key}_update_args", $args, $gateway ); + + /** + * Allows filtering of the order update arguments for all orders created via Tickets Commerce. + * + * @since TBD + * + * @param array $args + * @param Gateway_Interface $gateway + */ + $update_args = apply_filters( 'tec_tickets_commerce_order_update_args', $update_args, $gateway ); + + $updated = tec_tc_orders()->by_args( + [ + 'status' => 'any', + 'id' => $existing_order_id, + ] + )->set_args( $update_args )->save(); + + if ( empty( $updated[ $existing_order_id ] ) ) { + /** + * It seems like the $existing_order_id no longer exists or failed to be updated. Let's create a new one instead. + * + * BE AWARE: THe variable $args here is not passed through the update filters since its going to pass through the create filters. + */ + return $this->create( $gateway, $args ); + } + + return tec_tc_get_order( $existing_order_id ); + } + /** * Generates a title based on Cart Hash, items in the cart. * From e607588281996a01b01fed53c9e9e12a94f358e8 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 14:37:25 +0200 Subject: [PATCH 02/14] Fix ft_smoketest dump --- tests/_data/ft_smoketest.sql | 111 ++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/tests/_data/ft_smoketest.sql b/tests/_data/ft_smoketest.sql index e34cf4f1d9..b7c015bbe0 100644 --- a/tests/_data/ft_smoketest.sql +++ b/tests/_data/ft_smoketest.sql @@ -1,4 +1,5 @@ --- MariaDB dump 10.19 Distrib 10.5.23-MariaDB, for debian-linux-gnu (x86_64) +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump 10.19 Distrib 10.5.26-MariaDB, for debian-linux-gnu (aarch64) -- -- Host: db Database: test -- ------------------------------------------------------ @@ -643,7 +644,7 @@ CREATE TABLE `wp_options` ( LOCK TABLES `wp_options` WRITE; /*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; -INSERT INTO `wp_options` VALUES (1,'siteurl','https://wordpress.test','yes'),(2,'home','https://wordpress.test','yes'),(3,'blogname','RT Smoketest','yes'),(4,'blogdescription','Just another WordPress site','yes'),(5,'users_can_register','0','yes'),(6,'admin_email','admin@wordpress.test','yes'),(7,'start_of_week','1','yes'),(8,'use_balanceTags','0','yes'),(9,'use_smilies','1','yes'),(10,'require_name_email','1','yes'),(11,'comments_notify','1','yes'),(12,'posts_per_rss','10','yes'),(13,'rss_use_excerpt','0','yes'),(14,'mailserver_url','mail.example.com','yes'),(15,'mailserver_login','login@example.com','yes'),(16,'mailserver_pass','password','yes'),(17,'mailserver_port','110','yes'),(18,'default_category','1','yes'),(19,'default_comment_status','open','yes'),(20,'default_ping_status','open','yes'),(21,'default_pingback_flag','1','yes'),(22,'posts_per_page','10','yes'),(23,'date_format','F j, Y','yes'),(24,'time_format','g:i a','yes'),(25,'links_updated_date_format','F j, Y g:i a','yes'),(26,'comment_moderation','0','yes'),(27,'moderation_notify','1','yes'),(28,'permalink_structure','','yes'),(29,'rewrite_rules','','yes'),(30,'hack_file','0','yes'),(31,'blog_charset','UTF-8','yes'),(32,'moderation_keys','','no'),(33,'active_plugins','a:3:{i:0;s:31:\"event-tickets/event-tickets.php\";i:1;s:34:\"events-pro/events-calendar-pro.php\";i:2;s:43:\"the-events-calendar/the-events-calendar.php\";}','yes'),(34,'category_base','','yes'),(35,'ping_sites','http://rpc.pingomatic.com/','yes'),(36,'comment_max_links','2','yes'),(37,'gmt_offset','0','yes'),(38,'default_email_category','1','yes'),(39,'recently_edited','','no'),(40,'template','twentytwenty','yes'),(41,'stylesheet','twentytwenty','yes'),(42,'comment_registration','0','yes'),(43,'html_type','text/html','yes'),(44,'use_trackback','0','yes'),(45,'default_role','subscriber','yes'),(46,'db_version','56657','yes'),(47,'uploads_use_yearmonth_folders','1','yes'),(48,'upload_path','','yes'),(49,'blog_public','1','yes'),(50,'default_link_category','2','yes'),(51,'show_on_front','posts','yes'),(52,'tag_base','','yes'),(53,'show_avatars','1','yes'),(54,'avatar_rating','G','yes'),(55,'upload_url_path','','yes'),(56,'thumbnail_size_w','150','yes'),(57,'thumbnail_size_h','150','yes'),(58,'thumbnail_crop','1','yes'),(59,'medium_size_w','300','yes'),(60,'medium_size_h','300','yes'),(61,'avatar_default','mystery','yes'),(62,'large_size_w','1024','yes'),(63,'large_size_h','1024','yes'),(64,'image_default_link_type','none','yes'),(65,'image_default_size','','yes'),(66,'image_default_align','','yes'),(67,'close_comments_for_old_posts','0','yes'),(68,'close_comments_days_old','14','yes'),(69,'thread_comments','1','yes'),(70,'thread_comments_depth','5','yes'),(71,'page_comments','0','yes'),(72,'comments_per_page','50','yes'),(73,'default_comments_page','newest','yes'),(74,'comment_order','asc','yes'),(75,'sticky_posts','a:0:{}','yes'),(76,'widget_categories','a:0:{}','yes'),(77,'widget_text','a:0:{}','yes'),(78,'widget_rss','a:0:{}','yes'),(79,'uninstall_plugins','a:0:{}','no'),(80,'timezone_string','America/New_York','yes'),(81,'page_for_posts','0','yes'),(82,'page_on_front','0','yes'),(83,'default_post_format','0','yes'),(84,'link_manager_enabled','0','yes'),(85,'finished_splitting_shared_terms','1','yes'),(86,'site_icon','0','yes'),(87,'medium_large_size_w','768','yes'),(88,'medium_large_size_h','0','yes'),(89,'wp_page_for_privacy_policy','3','yes'),(90,'show_comments_cookies_opt_in','1','yes'),(91,'admin_email_lifespan','1695563689','yes'),(92,'disallowed_keys','','no'),(93,'comment_previously_approved','1','yes'),(94,'auto_plugin_theme_update_emails','a:0:{}','no'),(95,'auto_update_core_dev','enabled','yes'),(96,'auto_update_core_minor','enabled','yes'),(97,'auto_update_core_major','enabled','yes'),(98,'wp_force_deactivated_plugins','a:0:{}','yes'),(99,'initial_db_version','53496','yes'),(100,'wp_user_roles','a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:101:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:25:\"read_private_tribe_events\";b:1;s:17:\"edit_tribe_events\";b:1;s:24:\"edit_others_tribe_events\";b:1;s:25:\"edit_private_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:26:\"delete_others_tribe_events\";b:1;s:27:\"delete_private_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:25:\"read_private_tribe_venues\";b:1;s:17:\"edit_tribe_venues\";b:1;s:24:\"edit_others_tribe_venues\";b:1;s:25:\"edit_private_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:26:\"delete_others_tribe_venues\";b:1;s:27:\"delete_private_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:29:\"read_private_tribe_organizers\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:28:\"edit_others_tribe_organizers\";b:1;s:29:\"edit_private_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:30:\"delete_others_tribe_organizers\";b:1;s:31:\"delete_private_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:31:\"read_private_aggregator-records\";b:1;s:23:\"edit_aggregator-records\";b:1;s:30:\"edit_others_aggregator-records\";b:1;s:31:\"edit_private_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:32:\"delete_others_aggregator-records\";b:1;s:33:\"delete_private_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:74:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:25:\"read_private_tribe_events\";b:1;s:17:\"edit_tribe_events\";b:1;s:24:\"edit_others_tribe_events\";b:1;s:25:\"edit_private_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:26:\"delete_others_tribe_events\";b:1;s:27:\"delete_private_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:25:\"read_private_tribe_venues\";b:1;s:17:\"edit_tribe_venues\";b:1;s:24:\"edit_others_tribe_venues\";b:1;s:25:\"edit_private_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:26:\"delete_others_tribe_venues\";b:1;s:27:\"delete_private_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:29:\"read_private_tribe_organizers\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:28:\"edit_others_tribe_organizers\";b:1;s:29:\"edit_private_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:30:\"delete_others_tribe_organizers\";b:1;s:31:\"delete_private_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:31:\"read_private_aggregator-records\";b:1;s:23:\"edit_aggregator-records\";b:1;s:30:\"edit_others_aggregator-records\";b:1;s:31:\"edit_private_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:32:\"delete_others_aggregator-records\";b:1;s:33:\"delete_private_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:30:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:17:\"edit_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:17:\"edit_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:23:\"edit_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:13:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:17:\"edit_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:17:\"edit_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:23:\"edit_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}','yes'),(101,'fresh_site','1','yes'),(102,'user_count','1','no'),(103,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','yes'),(104,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','yes'),(105,'cron','a:7:{i:1680011715;a:5:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1680011801;a:3:{s:30:\"tribe_schedule_transient_purge\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"tribe_daily_cron\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:26:\"tribe_tickets_migrate_4_12\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1680098115;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1680098201;a:1:{s:24:\"tribe_common_log_cleanup\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1687425476;a:1:{s:21:\"tribe-recurrence-cron\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1692276901;a:1:{s:26:\"action_scheduler_run_queue\";a:1:{s:32:\"0d04ed39571b55704c122d726248bbac\";a:3:{s:8:\"schedule\";s:12:\"every_minute\";s:4:\"args\";a:1:{i:0;s:7:\"WP Cron\";}s:8:\"interval\";i:60;}}}s:7:\"version\";i:2;}','yes'),(106,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(107,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(108,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(109,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(110,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(111,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(112,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(113,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(114,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(115,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(116,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(117,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(118,'_transient_doing_cron','1700233725.4340300559997558593750','yes'),(121,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1680011726;s:7:\"checked\";a:3:{s:12:\"twentytwenty\";s:3:\"2.0\";s:15:\"twentytwentyone\";s:3:\"1.6\";s:15:\"twentytwentytwo\";s:3:\"1.2\";}s:8:\"response\";a:3:{s:12:\"twentytwenty\";a:6:{s:5:\"theme\";s:12:\"twentytwenty\";s:11:\"new_version\";s:3:\"2.1\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwenty/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwenty.2.1.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"1.7\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.1.7.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentytwo\";a:6:{s:5:\"theme\";s:15:\"twentytwentytwo\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentytwo/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentytwo.1.3.zip\";s:8:\"requires\";s:3:\"5.9\";s:12:\"requires_php\";s:3:\"5.6\";}}s:9:\"no_update\";a:0:{}s:12:\"translations\";a:0:{}}','no'),(124,'tribe_last_updated_option','1700233729.9088','yes'),(125,'tribe_events_calendar_options','a:14:{s:25:\"ticket-enabled-post-types\";a:2:{i:0;s:12:\"tribe_events\";i:1;s:4:\"page\";}s:28:\"event-tickets-schema-version\";s:9:\"6.0.0-dev\";s:31:\"previous_event_tickets_versions\";a:1:{i:0;s:1:\"0\";}s:28:\"latest_event_tickets_version\";s:9:\"6.0.0-dev\";s:8:\"did_init\";b:1;s:19:\"tribeEventsTemplate\";s:0:\"\";s:16:\"tribeEnableViews\";a:3:{i:0;s:4:\"list\";i:1;s:5:\"month\";i:2;s:3:\"day\";}s:10:\"viewOption\";s:4:\"list\";s:14:\"schema-version\";s:9:\"6.3.0-dev\";s:21:\"previous_ecp_versions\";a:2:{i:0;s:1:\"0\";i:1;s:5:\"6.1.1\";}s:18:\"latest_ecp_version\";s:9:\"6.3.0-dev\";s:18:\"dateWithYearFormat\";s:6:\"F j, Y\";s:24:\"recurrenceMaxMonthsAfter\";i:60;s:22:\"google_maps_js_api_key\";s:39:\"AIzaSyDNsicAsP6-VuGtAb1O9riI3oc_NOb7IOU\";}','yes'),(126,'tec_recurring_tickets_active','1','yes'),(127,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(128,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(132,'tec_ct1_migration_state','a:3:{s:18:\"complete_timestamp\";N;s:5:\"phase\";s:22:\"migration-not-required\";s:19:\"preview_unsupported\";b:0;}','yes'),(133,'tec_ct1_series_relationship_table_schema_version','1.0.0','yes'),(134,'tec_ct1_events_table_schema_version','1.0.1','yes'),(135,'tec_ct1_occurrences_table_schema_version','1.0.2','yes'),(136,'tec_ct1_events_field_schema_version','1.0.1','yes'),(137,'tec_ct1_occurrences_field_schema_version','1.0.1','yes'),(140,'_transient_tec_custom_tables_v1_ecp_initialized','1680098849','yes'),(141,'tec_custom_tables_v1_provisional_post_base_provisional_id','10000000','yes'),(142,'stellar_schema_version_tec-ft-ticket-groups','1.0.0','yes'),(143,'stellar_schema_version_tec-ft-posts-and-ticket-groups','1.0.0','yes'),(146,'tribe_last_save_post','1700233729.9089','yes'),(147,'widget_tribe-widget-events-list','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(148,'widget_tribe-widget-event-countdown','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(149,'widget_tribe-widget-featured-venue','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(150,'widget_tribe-widget-events-month','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(151,'widget_tribe-widget-events-week','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(152,'stellarwp_telemetry_last_send','','yes'),(153,'stellarwp_telemetry','a:1:{s:7:\"plugins\";a:1:{s:13:\"event-tickets\";a:2:{s:7:\"wp_slug\";s:31:\"event-tickets/event-tickets.php\";s:5:\"optin\";b:0;}}}','yes'),(154,'stellarwp_telemetry_event-tickets_show_optin','1','yes'),(155,'tec_timed_tec_custom_tables_v1_ecp_initialized','a:3:{s:3:\"key\";s:36:\"tec_custom_tables_v1_ecp_initialized\";s:5:\"value\";i:1;s:10:\"expiration\";i:1700320125;}','yes'),(156,'tec_timed_tec_custom_tables_v1_initialized','a:3:{s:3:\"key\";s:32:\"tec_custom_tables_v1_initialized\";s:5:\"value\";i:1;s:10:\"expiration\";i:1700320125;}','yes'),(159,'external_updates-events-calendar-pro','O:8:\"stdClass\":3:{s:9:\"lastCheck\";i:1687425483;s:14:\"checkedVersion\";s:5:\"6.1.0\";s:6:\"update\";O:19:\"Tribe__PUE__Utility\":11:{s:2:\"id\";i:0;s:6:\"plugin\";s:34:\"events-pro/events-calendar-pro.php\";s:4:\"slug\";s:19:\"events-calendar-pro\";s:7:\"version\";s:5:\"6.1.0\";s:8:\"homepage\";s:18:\"https://evnt.is/4d\";s:12:\"download_url\";s:301:\"https://pue.theeventscalendar.com/api/plugins/v2/download?plugin=events-calendar-pro&version=6.1.0&installed_version=6.1.0&domain=wordpress.test&multisite=0&network_activated=0&active_sites=1&wp_version=6.0.2&key=97f261bb1246e1c8ad0b7ace9ec6cb7764a09730&dk=97f261bb1246e1c8ad0b7ace9ec6cb7764a09730&o=e\";s:8:\"sections\";O:8:\"stdClass\":3:{s:11:\"description\";s:204:\"Events Calendar Pro is an extension to The Events Calendar, and includes recurring events, additional frontend views and more. To see a full feature list please visit the product page (http://evnt.is/4d).\";s:12:\"installation\";s:353:\"Installing Events Calendar Pro is easy: just back up your site, download/install The Events Calendar from the WordPress.org repo, and download/install Events Calendar Pro from theeventscalendar.com. Activate them both and you\'ll be good to go! If you\'re still confused or encounter problems, check out part 1 of our new user primer (http://m.tri.be/4i).\";s:9:\"changelog\";s:971:\"

= [6.1.0] 2023-06-14 =

\r\n\";}s:14:\"upgrade_notice\";s:0:\"\";s:13:\"custom_update\";O:8:\"stdClass\":1:{s:5:\"icons\";O:8:\"stdClass\":1:{s:3:\"svg\";s:84:\"https://theeventscalendar.com/content/themes/tribe-ecp/img/svg/product-icons/ECP.svg\";}}s:11:\"api_expired\";b:0;s:11:\"api_upgrade\";b:0;}}','no'),(160,'tribe_pue_key_notices','a:0:{}','yes'),(161,'_site_transient_update_plugins','O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1687425481;s:8:\"response\";a:1:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":12:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:3:\"5.2\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/plugin/akismet.5.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:60:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=2818463\";s:2:\"1x\";s:60:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=2818463\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/akismet/assets/banner-1544x500.png?rev=2900731\";s:2:\"1x\";s:62:\"https://ps.w.org/akismet/assets/banner-772x250.png?rev=2900731\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.8\";s:6:\"tested\";s:5:\"6.2.2\";s:12:\"requires_php\";s:6:\"5.6.20\";}}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:10:{s:35:\"advanced-post-manager/tribe-apm.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:35:\"w.org/plugins/advanced-post-manager\";s:4:\"slug\";s:21:\"advanced-post-manager\";s:6:\"plugin\";s:35:\"advanced-post-manager/tribe-apm.php\";s:11:\"new_version\";s:5:\"4.5.4\";s:3:\"url\";s:52:\"https://wordpress.org/plugins/advanced-post-manager/\";s:7:\"package\";s:70:\"https://downloads.wordpress.org/plugin/advanced-post-manager.4.5.4.zip\";s:5:\"icons\";a:1:{s:7:\"default\";s:72:\"https://s.w.org/plugins/geopattern-icon/advanced-post-manager_66b8d2.svg\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:76:\"https://ps.w.org/advanced-post-manager/assets/banner-1544x500.jpg?rev=593014\";s:2:\"1x\";s:75:\"https://ps.w.org/advanced-post-manager/assets/banner-772x250.png?rev=517740\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.7\";}s:23:\"debug-bar/debug-bar.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:23:\"w.org/plugins/debug-bar\";s:4:\"slug\";s:9:\"debug-bar\";s:6:\"plugin\";s:23:\"debug-bar/debug-bar.php\";s:11:\"new_version\";s:5:\"1.1.4\";s:3:\"url\";s:40:\"https://wordpress.org/plugins/debug-bar/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/plugin/debug-bar.1.1.4.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:54:\"https://ps.w.org/debug-bar/assets/icon.svg?rev=1908362\";s:3:\"svg\";s:54:\"https://ps.w.org/debug-bar/assets/icon.svg?rev=1908362\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:65:\"https://ps.w.org/debug-bar/assets/banner-1544x500.png?rev=1365496\";s:2:\"1x\";s:64:\"https://ps.w.org/debug-bar/assets/banner-772x250.png?rev=1365496\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.4\";}s:49:\"easy-digital-downloads/easy-digital-downloads.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:36:\"w.org/plugins/easy-digital-downloads\";s:4:\"slug\";s:22:\"easy-digital-downloads\";s:6:\"plugin\";s:49:\"easy-digital-downloads/easy-digital-downloads.php\";s:11:\"new_version\";s:5:\"3.1.2\";s:3:\"url\";s:53:\"https://wordpress.org/plugins/easy-digital-downloads/\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/plugin/easy-digital-downloads.3.1.2.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:66:\"https://ps.w.org/easy-digital-downloads/assets/icon.svg?rev=971968\";s:3:\"svg\";s:66:\"https://ps.w.org/easy-digital-downloads/assets/icon.svg?rev=971968\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:78:\"https://ps.w.org/easy-digital-downloads/assets/banner-1544x500.png?rev=2636140\";s:2:\"1x\";s:77:\"https://ps.w.org/easy-digital-downloads/assets/banner-772x250.png?rev=2636140\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.4\";}s:31:\"event-tickets/event-tickets.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:27:\"w.org/plugins/event-tickets\";s:4:\"slug\";s:13:\"event-tickets\";s:6:\"plugin\";s:31:\"event-tickets/event-tickets.php\";s:11:\"new_version\";s:7:\"5.6.0.2\";s:3:\"url\";s:44:\"https://wordpress.org/plugins/event-tickets/\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/plugin/event-tickets.5.6.0.2.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:58:\"https://ps.w.org/event-tickets/assets/icon.svg?rev=2259340\";s:3:\"svg\";s:58:\"https://ps.w.org/event-tickets/assets/icon.svg?rev=2259340\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:69:\"https://ps.w.org/event-tickets/assets/banner-1544x500.png?rev=2257626\";s:2:\"1x\";s:68:\"https://ps.w.org/event-tickets/assets/banner-772x250.png?rev=2257626\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:5:\"5.8.5\";}s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/hello-dolly/assets/banner-1544x500.jpg?rev=2645582\";s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}s:31:\"query-monitor/query-monitor.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:27:\"w.org/plugins/query-monitor\";s:4:\"slug\";s:13:\"query-monitor\";s:6:\"plugin\";s:31:\"query-monitor/query-monitor.php\";s:11:\"new_version\";s:6:\"3.12.3\";s:3:\"url\";s:44:\"https://wordpress.org/plugins/query-monitor/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/plugin/query-monitor.3.12.3.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:58:\"https://ps.w.org/query-monitor/assets/icon.svg?rev=2870124\";s:3:\"svg\";s:58:\"https://ps.w.org/query-monitor/assets/icon.svg?rev=2870124\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:69:\"https://ps.w.org/query-monitor/assets/banner-1544x500.png?rev=2870124\";s:2:\"1x\";s:68:\"https://ps.w.org/query-monitor/assets/banner-772x250.png?rev=2457098\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.2\";}s:27:\"redis-cache/redis-cache.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/redis-cache\";s:4:\"slug\";s:11:\"redis-cache\";s:6:\"plugin\";s:27:\"redis-cache/redis-cache.php\";s:11:\"new_version\";s:5:\"2.4.1\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/redis-cache/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/redis-cache.2.4.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/redis-cache/assets/icon-256x256.gif?rev=2568513\";s:2:\"1x\";s:64:\"https://ps.w.org/redis-cache/assets/icon-128x128.gif?rev=2568513\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/redis-cache/assets/banner-1544x500.png?rev=2315420\";s:2:\"1x\";s:66:\"https://ps.w.org/redis-cache/assets/banner-772x250.png?rev=2315420\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.3\";}s:51:\"rewrite-rules-inspector/rewrite-rules-inspector.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:37:\"w.org/plugins/rewrite-rules-inspector\";s:4:\"slug\";s:23:\"rewrite-rules-inspector\";s:6:\"plugin\";s:51:\"rewrite-rules-inspector/rewrite-rules-inspector.php\";s:11:\"new_version\";s:5:\"1.3.1\";s:3:\"url\";s:54:\"https://wordpress.org/plugins/rewrite-rules-inspector/\";s:7:\"package\";s:72:\"https://downloads.wordpress.org/plugin/rewrite-rules-inspector.1.3.1.zip\";s:5:\"icons\";a:1:{s:7:\"default\";s:74:\"https://s.w.org/plugins/geopattern-icon/rewrite-rules-inspector_e2e3e4.svg\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:79:\"https://ps.w.org/rewrite-rules-inspector/assets/banner-1544x500.png?rev=2533834\";s:2:\"1x\";s:78:\"https://ps.w.org/rewrite-rules-inspector/assets/banner-772x250.png?rev=2533843\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.1\";}s:43:\"the-events-calendar/the-events-calendar.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:33:\"w.org/plugins/the-events-calendar\";s:4:\"slug\";s:19:\"the-events-calendar\";s:6:\"plugin\";s:43:\"the-events-calendar/the-events-calendar.php\";s:11:\"new_version\";s:5:\"6.1.1\";s:3:\"url\";s:50:\"https://wordpress.org/plugins/the-events-calendar/\";s:7:\"package\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-256x256.gif?rev=2516440\";s:2:\"1x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-128x128.gif?rev=2516440\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:75:\"https://ps.w.org/the-events-calendar/assets/banner-1544x500.png?rev=2257622\";s:2:\"1x\";s:74:\"https://ps.w.org/the-events-calendar/assets/banner-772x250.png?rev=2257622\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:5:\"5.8.6\";}s:27:\"woocommerce/woocommerce.php\";O:8:\"stdClass\":12:{s:2:\"id\";s:25:\"w.org/plugins/woocommerce\";s:4:\"slug\";s:11:\"woocommerce\";s:6:\"plugin\";s:27:\"woocommerce/woocommerce.php\";s:11:\"new_version\";s:5:\"7.8.0\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/woocommerce/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/woocommerce.7.8.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-256x256.gif?rev=2869506\";s:2:\"1x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-128x128.gif?rev=2869506\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/woocommerce/assets/banner-1544x500.png?rev=2366418\";s:2:\"1x\";s:66:\"https://ps.w.org/woocommerce/assets/banner-772x250.png?rev=2366418\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"6.1\";s:6:\"tested\";s:5:\"6.2.2\";s:12:\"requires_php\";s:3:\"7.3\";}}}','no'),(162,'schema-ActionScheduler_StoreSchema','7.0.1692276901','yes'),(163,'schema-ActionScheduler_LoggerSchema','3.0.1692276901','yes'),(172,'theme_mods_twentytwentytwo','a:1:{s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1692276901;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','yes'),(173,'current_theme','Twenty Twenty','yes'),(174,'theme_switched','','yes'),(175,'_transient_timeout_as-post-store-dependencies-met','1700320125','no'),(176,'_transient_as-post-store-dependencies-met','yes','no'),(177,'theme_mods_twentytwenty','a:1:{s:18:\"nav_menu_locations\";a:0:{}}','yes'),(178,'_transient_timeout_tribe_events_series_flush_rewrite','1702825725','no'),(179,'_transient_tribe_events_series_flush_rewrite','1','no'),(180,'wp_attachment_pages_enabled','1','yes'),(181,'db_upgraded','1','yes'); +INSERT INTO `wp_options` VALUES (1,'siteurl','https://wordpress.test','yes'),(2,'home','https://wordpress.test','yes'),(3,'blogname','RT Smoketest','yes'),(4,'blogdescription','Just another WordPress site','yes'),(5,'users_can_register','0','yes'),(6,'admin_email','admin@wordpress.test','yes'),(7,'start_of_week','1','yes'),(8,'use_balanceTags','0','yes'),(9,'use_smilies','1','yes'),(10,'require_name_email','1','yes'),(11,'comments_notify','1','yes'),(12,'posts_per_rss','10','yes'),(13,'rss_use_excerpt','0','yes'),(14,'mailserver_url','mail.example.com','yes'),(15,'mailserver_login','login@example.com','yes'),(16,'mailserver_pass','password','yes'),(17,'mailserver_port','110','yes'),(18,'default_category','1','yes'),(19,'default_comment_status','open','yes'),(20,'default_ping_status','open','yes'),(21,'default_pingback_flag','1','yes'),(22,'posts_per_page','10','yes'),(23,'date_format','F j, Y','yes'),(24,'time_format','g:i a','yes'),(25,'links_updated_date_format','F j, Y g:i a','yes'),(26,'comment_moderation','0','yes'),(27,'moderation_notify','1','yes'),(28,'permalink_structure','','yes'),(29,'rewrite_rules','','yes'),(30,'hack_file','0','yes'),(31,'blog_charset','UTF-8','yes'),(32,'moderation_keys','','no'),(33,'active_plugins','a:3:{i:0;s:31:\"event-tickets/event-tickets.php\";i:1;s:34:\"events-pro/events-calendar-pro.php\";i:2;s:43:\"the-events-calendar/the-events-calendar.php\";}','yes'),(34,'category_base','','yes'),(35,'ping_sites','http://rpc.pingomatic.com/','yes'),(36,'comment_max_links','2','yes'),(37,'gmt_offset','0','yes'),(38,'default_email_category','1','yes'),(39,'recently_edited','','no'),(40,'template','twentytwenty','yes'),(41,'stylesheet','twentytwenty','yes'),(42,'comment_registration','0','yes'),(43,'html_type','text/html','yes'),(44,'use_trackback','0','yes'),(45,'default_role','subscriber','yes'),(46,'db_version','57155','yes'),(47,'uploads_use_yearmonth_folders','1','yes'),(48,'upload_path','','yes'),(49,'blog_public','1','yes'),(50,'default_link_category','2','yes'),(51,'show_on_front','posts','yes'),(52,'tag_base','','yes'),(53,'show_avatars','1','yes'),(54,'avatar_rating','G','yes'),(55,'upload_url_path','','yes'),(56,'thumbnail_size_w','150','yes'),(57,'thumbnail_size_h','150','yes'),(58,'thumbnail_crop','1','yes'),(59,'medium_size_w','300','yes'),(60,'medium_size_h','300','yes'),(61,'avatar_default','mystery','yes'),(62,'large_size_w','1024','yes'),(63,'large_size_h','1024','yes'),(64,'image_default_link_type','none','yes'),(65,'image_default_size','','yes'),(66,'image_default_align','','yes'),(67,'close_comments_for_old_posts','0','yes'),(68,'close_comments_days_old','14','yes'),(69,'thread_comments','1','yes'),(70,'thread_comments_depth','5','yes'),(71,'page_comments','0','yes'),(72,'comments_per_page','50','yes'),(73,'default_comments_page','newest','yes'),(74,'comment_order','asc','yes'),(75,'sticky_posts','a:0:{}','yes'),(76,'widget_categories','a:0:{}','yes'),(77,'widget_text','a:0:{}','yes'),(78,'widget_rss','a:0:{}','yes'),(79,'uninstall_plugins','a:0:{}','no'),(80,'timezone_string','America/New_York','yes'),(81,'page_for_posts','0','yes'),(82,'page_on_front','0','yes'),(83,'default_post_format','0','yes'),(84,'link_manager_enabled','0','yes'),(85,'finished_splitting_shared_terms','1','yes'),(86,'site_icon','0','yes'),(87,'medium_large_size_w','768','yes'),(88,'medium_large_size_h','0','yes'),(89,'wp_page_for_privacy_policy','3','yes'),(90,'show_comments_cookies_opt_in','1','yes'),(91,'admin_email_lifespan','1695563689','yes'),(92,'disallowed_keys','','no'),(93,'comment_previously_approved','1','yes'),(94,'auto_plugin_theme_update_emails','a:0:{}','no'),(95,'auto_update_core_dev','enabled','yes'),(96,'auto_update_core_minor','enabled','yes'),(97,'auto_update_core_major','enabled','yes'),(98,'wp_force_deactivated_plugins','a:0:{}','yes'),(99,'initial_db_version','53496','yes'),(100,'wp_user_roles','a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:101:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:25:\"read_private_tribe_events\";b:1;s:17:\"edit_tribe_events\";b:1;s:24:\"edit_others_tribe_events\";b:1;s:25:\"edit_private_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:26:\"delete_others_tribe_events\";b:1;s:27:\"delete_private_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:25:\"read_private_tribe_venues\";b:1;s:17:\"edit_tribe_venues\";b:1;s:24:\"edit_others_tribe_venues\";b:1;s:25:\"edit_private_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:26:\"delete_others_tribe_venues\";b:1;s:27:\"delete_private_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:29:\"read_private_tribe_organizers\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:28:\"edit_others_tribe_organizers\";b:1;s:29:\"edit_private_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:30:\"delete_others_tribe_organizers\";b:1;s:31:\"delete_private_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:31:\"read_private_aggregator-records\";b:1;s:23:\"edit_aggregator-records\";b:1;s:30:\"edit_others_aggregator-records\";b:1;s:31:\"edit_private_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:32:\"delete_others_aggregator-records\";b:1;s:33:\"delete_private_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:74:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:25:\"read_private_tribe_events\";b:1;s:17:\"edit_tribe_events\";b:1;s:24:\"edit_others_tribe_events\";b:1;s:25:\"edit_private_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:26:\"delete_others_tribe_events\";b:1;s:27:\"delete_private_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:25:\"read_private_tribe_venues\";b:1;s:17:\"edit_tribe_venues\";b:1;s:24:\"edit_others_tribe_venues\";b:1;s:25:\"edit_private_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:26:\"delete_others_tribe_venues\";b:1;s:27:\"delete_private_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:29:\"read_private_tribe_organizers\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:28:\"edit_others_tribe_organizers\";b:1;s:29:\"edit_private_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:30:\"delete_others_tribe_organizers\";b:1;s:31:\"delete_private_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:31:\"read_private_aggregator-records\";b:1;s:23:\"edit_aggregator-records\";b:1;s:30:\"edit_others_aggregator-records\";b:1;s:31:\"edit_private_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:32:\"delete_others_aggregator-records\";b:1;s:33:\"delete_private_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:30:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:17:\"edit_tribe_events\";b:1;s:27:\"edit_published_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:29:\"delete_published_tribe_events\";b:1;s:20:\"publish_tribe_events\";b:1;s:17:\"edit_tribe_venues\";b:1;s:27:\"edit_published_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:29:\"delete_published_tribe_venues\";b:1;s:20:\"publish_tribe_venues\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:31:\"edit_published_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:33:\"delete_published_tribe_organizers\";b:1;s:24:\"publish_tribe_organizers\";b:1;s:23:\"edit_aggregator-records\";b:1;s:33:\"edit_published_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;s:35:\"delete_published_aggregator-records\";b:1;s:26:\"publish_aggregator-records\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:13:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:17:\"edit_tribe_events\";b:1;s:19:\"delete_tribe_events\";b:1;s:17:\"edit_tribe_venues\";b:1;s:19:\"delete_tribe_venues\";b:1;s:21:\"edit_tribe_organizers\";b:1;s:23:\"delete_tribe_organizers\";b:1;s:23:\"edit_aggregator-records\";b:1;s:25:\"delete_aggregator-records\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}','yes'),(101,'fresh_site','1','yes'),(102,'user_count','1','no'),(103,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','yes'),(104,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','yes'),(105,'cron','a:7:{i:1680011715;a:5:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1680011801;a:3:{s:30:\"tribe_schedule_transient_purge\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"tribe_daily_cron\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:26:\"tribe_tickets_migrate_4_12\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1680098115;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1680098201;a:1:{s:24:\"tribe_common_log_cleanup\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1687425476;a:1:{s:21:\"tribe-recurrence-cron\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1692276901;a:1:{s:26:\"action_scheduler_run_queue\";a:1:{s:32:\"0d04ed39571b55704c122d726248bbac\";a:3:{s:8:\"schedule\";s:12:\"every_minute\";s:4:\"args\";a:1:{i:0;s:7:\"WP Cron\";}s:8:\"interval\";i:60;}}}s:7:\"version\";i:2;}','yes'),(106,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(107,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(108,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(109,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(110,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(111,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(112,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(113,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(114,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(115,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(116,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(117,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(118,'_transient_doing_cron','1700233725.4340300559997558593750','yes'),(121,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1680011726;s:7:\"checked\";a:3:{s:12:\"twentytwenty\";s:3:\"2.0\";s:15:\"twentytwentyone\";s:3:\"1.6\";s:15:\"twentytwentytwo\";s:3:\"1.2\";}s:8:\"response\";a:3:{s:12:\"twentytwenty\";a:6:{s:5:\"theme\";s:12:\"twentytwenty\";s:11:\"new_version\";s:3:\"2.1\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwenty/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwenty.2.1.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"1.7\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.1.7.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentytwo\";a:6:{s:5:\"theme\";s:15:\"twentytwentytwo\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentytwo/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentytwo.1.3.zip\";s:8:\"requires\";s:3:\"5.9\";s:12:\"requires_php\";s:3:\"5.6\";}}s:9:\"no_update\";a:0:{}s:12:\"translations\";a:0:{}}','no'),(124,'tribe_last_updated_option','1700233729.9088','yes'),(125,'tribe_events_calendar_options','a:14:{s:25:\"ticket-enabled-post-types\";a:2:{i:0;s:12:\"tribe_events\";i:1;s:4:\"page\";}s:28:\"event-tickets-schema-version\";s:9:\"6.0.0-dev\";s:31:\"previous_event_tickets_versions\";a:1:{i:0;s:1:\"0\";}s:28:\"latest_event_tickets_version\";s:9:\"6.0.0-dev\";s:8:\"did_init\";b:1;s:19:\"tribeEventsTemplate\";s:0:\"\";s:16:\"tribeEnableViews\";a:3:{i:0;s:4:\"list\";i:1;s:5:\"month\";i:2;s:3:\"day\";}s:10:\"viewOption\";s:4:\"list\";s:14:\"schema-version\";s:9:\"6.3.0-dev\";s:21:\"previous_ecp_versions\";a:2:{i:0;s:1:\"0\";i:1;s:5:\"6.1.1\";}s:18:\"latest_ecp_version\";s:9:\"6.3.0-dev\";s:18:\"dateWithYearFormat\";s:6:\"F j, Y\";s:24:\"recurrenceMaxMonthsAfter\";i:60;s:22:\"google_maps_js_api_key\";s:39:\"AIzaSyDNsicAsP6-VuGtAb1O9riI3oc_NOb7IOU\";}','yes'),(126,'tec_recurring_tickets_active','1','yes'),(127,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(128,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(132,'tec_ct1_migration_state','a:3:{s:18:\"complete_timestamp\";N;s:5:\"phase\";s:22:\"migration-not-required\";s:19:\"preview_unsupported\";b:0;}','yes'),(133,'tec_ct1_series_relationship_table_schema_version','1.0.0','yes'),(134,'tec_ct1_events_table_schema_version','1.0.1','yes'),(135,'tec_ct1_occurrences_table_schema_version','1.0.2','yes'),(136,'tec_ct1_events_field_schema_version','1.0.1','yes'),(137,'tec_ct1_occurrences_field_schema_version','1.0.1','yes'),(140,'_transient_tec_custom_tables_v1_ecp_initialized','1680098849','yes'),(141,'tec_custom_tables_v1_provisional_post_base_provisional_id','10000000','yes'),(142,'stellar_schema_version_tec-ft-ticket-groups','1.0.0','yes'),(143,'stellar_schema_version_tec-ft-posts-and-ticket-groups','1.0.0','yes'),(146,'tribe_last_save_post','1700233729.9089','yes'),(147,'widget_tribe-widget-events-list','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(148,'widget_tribe-widget-event-countdown','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(149,'widget_tribe-widget-featured-venue','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(150,'widget_tribe-widget-events-month','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(151,'widget_tribe-widget-events-week','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(152,'stellarwp_telemetry_last_send','','yes'),(153,'stellarwp_telemetry','a:1:{s:7:\"plugins\";a:1:{s:13:\"event-tickets\";a:2:{s:7:\"wp_slug\";s:31:\"event-tickets/event-tickets.php\";s:5:\"optin\";b:0;}}}','yes'),(154,'stellarwp_telemetry_event-tickets_show_optin','1','yes'),(155,'tec_timed_tec_custom_tables_v1_ecp_initialized','a:3:{s:3:\"key\";s:36:\"tec_custom_tables_v1_ecp_initialized\";s:5:\"value\";i:1;s:10:\"expiration\";i:1700320125;}','yes'),(156,'tec_timed_tec_custom_tables_v1_initialized','a:3:{s:3:\"key\";s:32:\"tec_custom_tables_v1_initialized\";s:5:\"value\";i:1;s:10:\"expiration\";i:1700320125;}','yes'),(159,'external_updates-events-calendar-pro','O:8:\"stdClass\":3:{s:9:\"lastCheck\";i:1687425483;s:14:\"checkedVersion\";s:5:\"6.1.0\";s:6:\"update\";O:19:\"Tribe__PUE__Utility\":11:{s:2:\"id\";i:0;s:6:\"plugin\";s:34:\"events-pro/events-calendar-pro.php\";s:4:\"slug\";s:19:\"events-calendar-pro\";s:7:\"version\";s:5:\"6.1.0\";s:8:\"homepage\";s:18:\"https://evnt.is/4d\";s:12:\"download_url\";s:301:\"https://pue.theeventscalendar.com/api/plugins/v2/download?plugin=events-calendar-pro&version=6.1.0&installed_version=6.1.0&domain=wordpress.test&multisite=0&network_activated=0&active_sites=1&wp_version=6.0.2&key=97f261bb1246e1c8ad0b7ace9ec6cb7764a09730&dk=97f261bb1246e1c8ad0b7ace9ec6cb7764a09730&o=e\";s:8:\"sections\";O:8:\"stdClass\":3:{s:11:\"description\";s:204:\"Events Calendar Pro is an extension to The Events Calendar, and includes recurring events, additional frontend views and more. To see a full feature list please visit the product page (http://evnt.is/4d).\";s:12:\"installation\";s:353:\"Installing Events Calendar Pro is easy: just back up your site, download/install The Events Calendar from the WordPress.org repo, and download/install Events Calendar Pro from theeventscalendar.com. Activate them both and you\'ll be good to go! If you\'re still confused or encounter problems, check out part 1 of our new user primer (http://m.tri.be/4i).\";s:9:\"changelog\";s:971:\"

= [6.1.0] 2023-06-14 =

\r\n\";}s:14:\"upgrade_notice\";s:0:\"\";s:13:\"custom_update\";O:8:\"stdClass\":1:{s:5:\"icons\";O:8:\"stdClass\":1:{s:3:\"svg\";s:84:\"https://theeventscalendar.com/content/themes/tribe-ecp/img/svg/product-icons/ECP.svg\";}}s:11:\"api_expired\";b:0;s:11:\"api_upgrade\";b:0;}}','no'),(160,'tribe_pue_key_notices','a:0:{}','yes'),(161,'_site_transient_update_plugins','O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1687425481;s:8:\"response\";a:1:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":12:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:3:\"5.2\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/plugin/akismet.5.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:60:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=2818463\";s:2:\"1x\";s:60:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=2818463\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/akismet/assets/banner-1544x500.png?rev=2900731\";s:2:\"1x\";s:62:\"https://ps.w.org/akismet/assets/banner-772x250.png?rev=2900731\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.8\";s:6:\"tested\";s:5:\"6.2.2\";s:12:\"requires_php\";s:6:\"5.6.20\";}}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:10:{s:35:\"advanced-post-manager/tribe-apm.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:35:\"w.org/plugins/advanced-post-manager\";s:4:\"slug\";s:21:\"advanced-post-manager\";s:6:\"plugin\";s:35:\"advanced-post-manager/tribe-apm.php\";s:11:\"new_version\";s:5:\"4.5.4\";s:3:\"url\";s:52:\"https://wordpress.org/plugins/advanced-post-manager/\";s:7:\"package\";s:70:\"https://downloads.wordpress.org/plugin/advanced-post-manager.4.5.4.zip\";s:5:\"icons\";a:1:{s:7:\"default\";s:72:\"https://s.w.org/plugins/geopattern-icon/advanced-post-manager_66b8d2.svg\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:76:\"https://ps.w.org/advanced-post-manager/assets/banner-1544x500.jpg?rev=593014\";s:2:\"1x\";s:75:\"https://ps.w.org/advanced-post-manager/assets/banner-772x250.png?rev=517740\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.7\";}s:23:\"debug-bar/debug-bar.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:23:\"w.org/plugins/debug-bar\";s:4:\"slug\";s:9:\"debug-bar\";s:6:\"plugin\";s:23:\"debug-bar/debug-bar.php\";s:11:\"new_version\";s:5:\"1.1.4\";s:3:\"url\";s:40:\"https://wordpress.org/plugins/debug-bar/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/plugin/debug-bar.1.1.4.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:54:\"https://ps.w.org/debug-bar/assets/icon.svg?rev=1908362\";s:3:\"svg\";s:54:\"https://ps.w.org/debug-bar/assets/icon.svg?rev=1908362\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:65:\"https://ps.w.org/debug-bar/assets/banner-1544x500.png?rev=1365496\";s:2:\"1x\";s:64:\"https://ps.w.org/debug-bar/assets/banner-772x250.png?rev=1365496\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.4\";}s:49:\"easy-digital-downloads/easy-digital-downloads.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:36:\"w.org/plugins/easy-digital-downloads\";s:4:\"slug\";s:22:\"easy-digital-downloads\";s:6:\"plugin\";s:49:\"easy-digital-downloads/easy-digital-downloads.php\";s:11:\"new_version\";s:5:\"3.1.2\";s:3:\"url\";s:53:\"https://wordpress.org/plugins/easy-digital-downloads/\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/plugin/easy-digital-downloads.3.1.2.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:66:\"https://ps.w.org/easy-digital-downloads/assets/icon.svg?rev=971968\";s:3:\"svg\";s:66:\"https://ps.w.org/easy-digital-downloads/assets/icon.svg?rev=971968\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:78:\"https://ps.w.org/easy-digital-downloads/assets/banner-1544x500.png?rev=2636140\";s:2:\"1x\";s:77:\"https://ps.w.org/easy-digital-downloads/assets/banner-772x250.png?rev=2636140\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.4\";}s:31:\"event-tickets/event-tickets.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:27:\"w.org/plugins/event-tickets\";s:4:\"slug\";s:13:\"event-tickets\";s:6:\"plugin\";s:31:\"event-tickets/event-tickets.php\";s:11:\"new_version\";s:7:\"5.6.0.2\";s:3:\"url\";s:44:\"https://wordpress.org/plugins/event-tickets/\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/plugin/event-tickets.5.6.0.2.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:58:\"https://ps.w.org/event-tickets/assets/icon.svg?rev=2259340\";s:3:\"svg\";s:58:\"https://ps.w.org/event-tickets/assets/icon.svg?rev=2259340\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:69:\"https://ps.w.org/event-tickets/assets/banner-1544x500.png?rev=2257626\";s:2:\"1x\";s:68:\"https://ps.w.org/event-tickets/assets/banner-772x250.png?rev=2257626\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:5:\"5.8.5\";}s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/hello-dolly/assets/banner-1544x500.jpg?rev=2645582\";s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}s:31:\"query-monitor/query-monitor.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:27:\"w.org/plugins/query-monitor\";s:4:\"slug\";s:13:\"query-monitor\";s:6:\"plugin\";s:31:\"query-monitor/query-monitor.php\";s:11:\"new_version\";s:6:\"3.12.3\";s:3:\"url\";s:44:\"https://wordpress.org/plugins/query-monitor/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/plugin/query-monitor.3.12.3.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:58:\"https://ps.w.org/query-monitor/assets/icon.svg?rev=2870124\";s:3:\"svg\";s:58:\"https://ps.w.org/query-monitor/assets/icon.svg?rev=2870124\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:69:\"https://ps.w.org/query-monitor/assets/banner-1544x500.png?rev=2870124\";s:2:\"1x\";s:68:\"https://ps.w.org/query-monitor/assets/banner-772x250.png?rev=2457098\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.2\";}s:27:\"redis-cache/redis-cache.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/redis-cache\";s:4:\"slug\";s:11:\"redis-cache\";s:6:\"plugin\";s:27:\"redis-cache/redis-cache.php\";s:11:\"new_version\";s:5:\"2.4.1\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/redis-cache/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/redis-cache.2.4.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/redis-cache/assets/icon-256x256.gif?rev=2568513\";s:2:\"1x\";s:64:\"https://ps.w.org/redis-cache/assets/icon-128x128.gif?rev=2568513\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/redis-cache/assets/banner-1544x500.png?rev=2315420\";s:2:\"1x\";s:66:\"https://ps.w.org/redis-cache/assets/banner-772x250.png?rev=2315420\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.3\";}s:51:\"rewrite-rules-inspector/rewrite-rules-inspector.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:37:\"w.org/plugins/rewrite-rules-inspector\";s:4:\"slug\";s:23:\"rewrite-rules-inspector\";s:6:\"plugin\";s:51:\"rewrite-rules-inspector/rewrite-rules-inspector.php\";s:11:\"new_version\";s:5:\"1.3.1\";s:3:\"url\";s:54:\"https://wordpress.org/plugins/rewrite-rules-inspector/\";s:7:\"package\";s:72:\"https://downloads.wordpress.org/plugin/rewrite-rules-inspector.1.3.1.zip\";s:5:\"icons\";a:1:{s:7:\"default\";s:74:\"https://s.w.org/plugins/geopattern-icon/rewrite-rules-inspector_e2e3e4.svg\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:79:\"https://ps.w.org/rewrite-rules-inspector/assets/banner-1544x500.png?rev=2533834\";s:2:\"1x\";s:78:\"https://ps.w.org/rewrite-rules-inspector/assets/banner-772x250.png?rev=2533843\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"3.1\";}s:43:\"the-events-calendar/the-events-calendar.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:33:\"w.org/plugins/the-events-calendar\";s:4:\"slug\";s:19:\"the-events-calendar\";s:6:\"plugin\";s:43:\"the-events-calendar/the-events-calendar.php\";s:11:\"new_version\";s:5:\"6.1.1\";s:3:\"url\";s:50:\"https://wordpress.org/plugins/the-events-calendar/\";s:7:\"package\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-256x256.gif?rev=2516440\";s:2:\"1x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-128x128.gif?rev=2516440\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:75:\"https://ps.w.org/the-events-calendar/assets/banner-1544x500.png?rev=2257622\";s:2:\"1x\";s:74:\"https://ps.w.org/the-events-calendar/assets/banner-772x250.png?rev=2257622\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:5:\"5.8.6\";}s:27:\"woocommerce/woocommerce.php\";O:8:\"stdClass\":12:{s:2:\"id\";s:25:\"w.org/plugins/woocommerce\";s:4:\"slug\";s:11:\"woocommerce\";s:6:\"plugin\";s:27:\"woocommerce/woocommerce.php\";s:11:\"new_version\";s:5:\"7.8.0\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/woocommerce/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/woocommerce.7.8.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-256x256.gif?rev=2869506\";s:2:\"1x\";s:64:\"https://ps.w.org/woocommerce/assets/icon-128x128.gif?rev=2869506\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/woocommerce/assets/banner-1544x500.png?rev=2366418\";s:2:\"1x\";s:66:\"https://ps.w.org/woocommerce/assets/banner-772x250.png?rev=2366418\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"6.1\";s:6:\"tested\";s:5:\"6.2.2\";s:12:\"requires_php\";s:3:\"7.3\";}}}','no'),(162,'schema-ActionScheduler_StoreSchema','7.0.1692276901','yes'),(163,'schema-ActionScheduler_LoggerSchema','3.0.1692276901','yes'),(172,'theme_mods_twentytwentytwo','a:1:{s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1692276901;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','no'),(173,'current_theme','Twenty Twenty','yes'),(174,'theme_switched','','yes'),(177,'theme_mods_twentytwenty','a:1:{s:18:\"nav_menu_locations\";a:0:{}}','yes'),(180,'wp_attachment_pages_enabled','1','yes'),(181,'db_upgraded','1','yes'); /*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; UNLOCK TABLES; @@ -845,6 +846,110 @@ LOCK TABLES `wp_tec_series_relationships` WRITE; /*!40000 ALTER TABLE `wp_tec_series_relationships` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `wp_tec_slr_layouts` +-- + +DROP TABLE IF EXISTS `wp_tec_slr_layouts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_tec_slr_layouts` ( + `id` varchar(36) NOT NULL, + `name` varchar(255) NOT NULL, + `created_date` datetime NOT NULL, + `map` varchar(36) NOT NULL, + `seats` int(11) NOT NULL DEFAULT 0, + `screenshot_url` varchar(255) DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_tec_slr_layouts` +-- + +LOCK TABLES `wp_tec_slr_layouts` WRITE; +/*!40000 ALTER TABLE `wp_tec_slr_layouts` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_tec_slr_layouts` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_tec_slr_maps` +-- + +DROP TABLE IF EXISTS `wp_tec_slr_maps`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_tec_slr_maps` ( + `id` varchar(36) NOT NULL, + `name` varchar(255) NOT NULL, + `seats` int(11) NOT NULL DEFAULT 0, + `screenshot_url` varchar(255) DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_tec_slr_maps` +-- + +LOCK TABLES `wp_tec_slr_maps` WRITE; +/*!40000 ALTER TABLE `wp_tec_slr_maps` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_tec_slr_maps` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_tec_slr_seat_types` +-- + +DROP TABLE IF EXISTS `wp_tec_slr_seat_types`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_tec_slr_seat_types` ( + `id` varchar(36) NOT NULL, + `name` varchar(255) NOT NULL, + `map` varchar(36) NOT NULL, + `layout` varchar(36) NOT NULL, + `seats` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_tec_slr_seat_types` +-- + +LOCK TABLES `wp_tec_slr_seat_types` WRITE; +/*!40000 ALTER TABLE `wp_tec_slr_seat_types` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_tec_slr_seat_types` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_tec_slr_sessions` +-- + +DROP TABLE IF EXISTS `wp_tec_slr_sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wp_tec_slr_sessions` ( + `token` varchar(150) NOT NULL, + `object_id` bigint(20) NOT NULL, + `expiration` int(11) NOT NULL, + `reservations` longblob DEFAULT NULL, + `expiration_lock` tinyint(1) DEFAULT 0, + PRIMARY KEY (`token`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_tec_slr_sessions` +-- + +LOCK TABLES `wp_tec_slr_sessions` WRITE; +/*!40000 ALTER TABLE `wp_tec_slr_sessions` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_tec_slr_sessions` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `wp_tec_ticket_groups` -- @@ -1052,4 +1157,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-07-11 18:14:46 +-- Dump completed on 2025-01-06 12:37:04 From 968f9989a96eb7ec58de8283301ce1a2f8741f61 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 14:38:26 +0200 Subject: [PATCH 03/14] added changelog entry --- changelog/fix-duplicated-orders-and-attendees | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/fix-duplicated-orders-and-attendees diff --git a/changelog/fix-duplicated-orders-and-attendees b/changelog/fix-duplicated-orders-and-attendees new file mode 100644 index 0000000000..ea95300314 --- /dev/null +++ b/changelog/fix-duplicated-orders-and-attendees @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Prevent duplicate orders and as a result duplicated attendees when a payment would initially fail at least once. [ET-2279] From bbfe0b90980e7658dac79f9bfe1c7089822cc841 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 15:03:33 +0200 Subject: [PATCH 04/14] test case to support one order per cart --- .../TEC/Tickets/Commerce/Order_Test.php | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php diff --git a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php new file mode 100644 index 0000000000..3147246e8a --- /dev/null +++ b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php @@ -0,0 +1,97 @@ +post->create(); + $ticket_id_1 = $this->create_tc_ticket( $post, 10 ); + $ticket_id_2 = $this->create_tc_ticket( $post, 20 ); + + $cart = tribe( Cart::class ); + $hash = $cart->get_cart_hash( true ); + + $this->assertTrue( ! empty( $hash ) && is_string( $hash ) ); + + // Careful!!! Each next order includes previous order's items as well since we are not clearing the cart in between!! + $order_1 = $this->create_order_from_cart( [ $ticket_id_1 => 1 ] ); + $order_2 = $this->create_order_from_cart( [ $ticket_id_2 => 1 ] ); + $order_3 = $this->create_order_from_cart( [ $ticket_id_1 => 2, $ticket_id_2 => 2 ] ); + + $this->assertInstanceof( WP_Post::class, $order_1 ); + $this->assertInstanceof( WP_Post::class, $order_2 ); + $this->assertInstanceof( WP_Post::class, $order_3 ); + + // They should be the same order! + $this->assertEquals( $order_1->ID, $order_2->ID ); + $this->assertEquals( $order_1->ID, $order_3->ID ); + + // They should not have the same totals! + $this->assertEquals( 10, $order_1->total_value->get_decimal() ); + $this->assertEquals( 30, $order_2->total_value->get_decimal() ); + $this->assertEquals( 90, $order_3->total_value->get_decimal() ); + + $cart->clear_cart(); + $order_4 = $this->create_order_from_cart( [ $ticket_id_1 => 1 ] ); + $cart->clear_cart(); + $order_5 = $this->create_order_from_cart( [ $ticket_id_2 => 1 ] ); + $cart->clear_cart(); + $order_6 = $this->create_order_from_cart( [ $ticket_id_1 => 2, $ticket_id_2 => 2 ] ); + $cart->clear_cart(); + + // They should NOT be the same order! + $this->assertTrue( $order_4->ID !== $order_5->ID ); + $this->assertTrue( $order_4->ID !== $order_6->ID ); + $this->assertTrue( $order_5->ID !== $order_6->ID ); + + // They should have the same totals though. + $this->assertEquals( 10, $order_4->total_value->get_decimal() ); + $this->assertEquals( 20, $order_5->total_value->get_decimal() ); + $this->assertEquals( 60, $order_6->total_value->get_decimal() ); + } + + protected function create_order_from_cart( array $items, array $overrides = [] ) { + foreach ( $items as $id => $quantity ) { + tribe( Cart::class )->get_repository()->add_item( $id, $quantity ); + } + + $default_purchaser = [ + 'purchaser_user_id' => 0, + 'purchaser_full_name' => 'Test Purchaser', + 'purchaser_first_name' => 'Test', + 'purchaser_last_name' => 'Purchaser', + 'purchaser_email' => 'test-' . uniqid() . '@test.com', + ]; + + $purchaser = wp_parse_args( $overrides, $default_purchaser ); + + $feed_args_callback = function ( $args ) use ( $overrides ) { + $args['post_date'] = $overrides['post_date'] ?? ''; + $args['post_date_gmt'] = $overrides['post_date_gmt'] ?? $args['post_date']; + + return $args; + }; + + add_filter( 'tec_tickets_commerce_order_create_args', $feed_args_callback ); + + $orders = tribe( Order::class ); + $order = $orders->create_from_cart( tribe( Gateway::class ), $purchaser ); + + clean_post_cache( $order->ID ); + + remove_filter( 'tec_tickets_commerce_order_create_args', $feed_args_callback ); + + return $order; + } +} From a20ff223ba5216c5fb67cdd8ec752d07ed4e9989 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 15:06:15 +0200 Subject: [PATCH 05/14] remove unused classes from Order_Test --- .../TEC/Tickets/Commerce/Order_Test.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php index 3147246e8a..6d60831c88 100644 --- a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php +++ b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php @@ -2,17 +2,14 @@ namespace TEC\Tickets\Commerce; -use TEC\Tickets\Commerce; use TEC\Tickets\Commerce\Cart; use Tribe\Tickets\Test\Commerce\TicketsCommerce\Ticket_Maker; use Codeception\TestCase\WPTestCase; -use Tribe\Tickets\Test\Commerce\TicketsCommerce\Order_Maker; use TEC\Tickets\Commerce\Gateways\Stripe\Gateway; use WP_Post; class Order_Test extends WPTestCase { use Ticket_Maker; - use Order_Maker; public function test_it_does_not_create_multiple_orders_for_single_cart() { $post = self::factory()->post->create(); @@ -50,6 +47,10 @@ public function test_it_does_not_create_multiple_orders_for_single_cart() { $order_6 = $this->create_order_from_cart( [ $ticket_id_1 => 2, $ticket_id_2 => 2 ] ); $cart->clear_cart(); + $this->assertInstanceof( WP_Post::class, $order_4 ); + $this->assertInstanceof( WP_Post::class, $order_5 ); + $this->assertInstanceof( WP_Post::class, $order_6 ); + // They should NOT be the same order! $this->assertTrue( $order_4->ID !== $order_5->ID ); $this->assertTrue( $order_4->ID !== $order_6->ID ); From 9796f938c03cd41482ae04d7727631e9435d8ca1 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 16:33:42 +0200 Subject: [PATCH 06/14] Fix tests --- src/Tickets/Commerce/Order.php | 2 + .../TEC/Tickets/Commerce/Order_Test.php | 43 +++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/Tickets/Commerce/Order.php b/src/Tickets/Commerce/Order.php index 9ddc429655..aa5ddaad1c 100644 --- a/src/Tickets/Commerce/Order.php +++ b/src/Tickets/Commerce/Order.php @@ -499,6 +499,8 @@ static function ( $item ) { * * @since 5.2.0 * + * @internal Use `upsert` instead. + * * @param Gateway_Interface $gateway * @param array $args * diff --git a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php index 6d60831c88..3fb747ef54 100644 --- a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php +++ b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php @@ -6,10 +6,12 @@ use Tribe\Tickets\Test\Commerce\TicketsCommerce\Ticket_Maker; use Codeception\TestCase\WPTestCase; use TEC\Tickets\Commerce\Gateways\Stripe\Gateway; +use Tribe\Tests\Traits\With_Uopz; use WP_Post; class Order_Test extends WPTestCase { use Ticket_Maker; + use With_Uopz; public function test_it_does_not_create_multiple_orders_for_single_cart() { $post = self::factory()->post->create(); @@ -17,14 +19,18 @@ public function test_it_does_not_create_multiple_orders_for_single_cart() { $ticket_id_2 = $this->create_tc_ticket( $post, 20 ); $cart = tribe( Cart::class ); - $hash = $cart->get_cart_hash( true ); - $this->assertTrue( ! empty( $hash ) && is_string( $hash ) ); + $this->set_fn_return( 'wp_generate_password', 'abcdefghijklmnop' ); + $hash = $cart->get_cart_hash( true ); + $this->assertSame( 'abcdefghijklmnop', $hash ); // Careful!!! Each next order includes previous order's items as well since we are not clearing the cart in between!! $order_1 = $this->create_order_from_cart( [ $ticket_id_1 => 1 ] ); + $this->assertSame( 'abcdefghijklmnop', $cart->get_cart_hash() ); $order_2 = $this->create_order_from_cart( [ $ticket_id_2 => 1 ] ); + $this->assertSame( 'abcdefghijklmnop', $cart->get_cart_hash() ); $order_3 = $this->create_order_from_cart( [ $ticket_id_1 => 2, $ticket_id_2 => 2 ] ); + $this->assertSame( 'abcdefghijklmnop', $cart->get_cart_hash() ); $this->assertInstanceof( WP_Post::class, $order_1 ); $this->assertInstanceof( WP_Post::class, $order_2 ); @@ -35,16 +41,28 @@ public function test_it_does_not_create_multiple_orders_for_single_cart() { $this->assertEquals( $order_1->ID, $order_3->ID ); // They should not have the same totals! - $this->assertEquals( 10, $order_1->total_value->get_decimal() ); - $this->assertEquals( 30, $order_2->total_value->get_decimal() ); - $this->assertEquals( 90, $order_3->total_value->get_decimal() ); + $this->assertSame( 10.0, $order_1->total_value->get_decimal() ); + $this->assertSame( 30.0, $order_2->total_value->get_decimal() ); + $this->assertSame( 90.0, $order_3->total_value->get_decimal() ); + + $times =0; + $this->set_fn_return( 'wp_generate_password', function () use ( &$times ) { + $times++; + return 'abcdefghijklmnop-' . $times; + }, true ); $cart->clear_cart(); + $cart->get_cart_hash( true ); $order_4 = $this->create_order_from_cart( [ $ticket_id_1 => 1 ] ); + $this->assertSame( 'abcdefghijklmnop-1', $cart->get_cart_hash() ); $cart->clear_cart(); + $cart->get_cart_hash( true ); $order_5 = $this->create_order_from_cart( [ $ticket_id_2 => 1 ] ); + $this->assertSame( 'abcdefghijklmnop-2', $cart->get_cart_hash() ); $cart->clear_cart(); + $cart->get_cart_hash( true ); $order_6 = $this->create_order_from_cart( [ $ticket_id_1 => 2, $ticket_id_2 => 2 ] ); + $this->assertSame( 'abcdefghijklmnop-3', $cart->get_cart_hash() ); $cart->clear_cart(); $this->assertInstanceof( WP_Post::class, $order_4 ); @@ -52,14 +70,13 @@ public function test_it_does_not_create_multiple_orders_for_single_cart() { $this->assertInstanceof( WP_Post::class, $order_6 ); // They should NOT be the same order! - $this->assertTrue( $order_4->ID !== $order_5->ID ); - $this->assertTrue( $order_4->ID !== $order_6->ID ); - $this->assertTrue( $order_5->ID !== $order_6->ID ); - - // They should have the same totals though. - $this->assertEquals( 10, $order_4->total_value->get_decimal() ); - $this->assertEquals( 20, $order_5->total_value->get_decimal() ); - $this->assertEquals( 60, $order_6->total_value->get_decimal() ); + $this->assertNotSame( $order_4->ID, $order_5->ID ); + $this->assertNotSame( $order_4->ID, $order_6->ID ); + $this->assertNotSame( $order_5->ID, $order_6->ID ); + + $this->assertSame( 10.0, $order_4->total_value->get_decimal() ); + $this->assertSame( 20.0, $order_5->total_value->get_decimal() ); + $this->assertSame( 60.0, $order_6->total_value->get_decimal() ); } protected function create_order_from_cart( array $items, array $overrides = [] ) { From 98af1416450ce4fe6a014f157df84f79b86d975a Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 16:44:47 +0200 Subject: [PATCH 07/14] attach existing order id inside args --- src/Tickets/Commerce/Order.php | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Tickets/Commerce/Order.php b/src/Tickets/Commerce/Order.php index aa5ddaad1c..25dcd0ffa9 100644 --- a/src/Tickets/Commerce/Order.php +++ b/src/Tickets/Commerce/Order.php @@ -484,6 +484,8 @@ static function ( $item ) { } } + $order_args['id'] = $existing_order_id; + $order = $this->upsert( $gateway, $order_args, $existing_order_id ); // We were unable to create the order bail from here. @@ -541,13 +543,15 @@ public function create( Gateway_Interface $gateway, $args ) { * * @param Gateway_Interface $gateway The gateway to use to create the order. * @param array $args The arguments to create the order. - * @param ?int $existing_order_id The ID of an existing order to update. * - * @return false|WP_Post + * @return false|WP_Post WP_Post instance on success or false on failure. */ - public function upsert( Gateway_Interface $gateway, array $args, ?int $existing_order_id = null ) { + public function upsert( Gateway_Interface $gateway, array $args ) { $gateway_key = $gateway::get_key(); + $existing_order_id = (int) $args['id'] ?? 0; + unset( $args['id'] ); + /** * Allows filtering of the order upsert arguments for all orders created via Tickets Commerce. * @@ -577,7 +581,7 @@ public function upsert( Gateway_Interface $gateway, array $args, ?int $existing_ */ $existing_order_id = (int) apply_filters( 'tec_tickets_commerce_order_upsert_existing_order_id', $existing_order_id ); - if ( ! $existing_order_id ) { + if ( ! $existing_order_id || 0 > $existing_order_id ) { return $this->create( $gateway, $args ); } @@ -617,7 +621,13 @@ public function upsert( Gateway_Interface $gateway, array $args, ?int $existing_ return $this->create( $gateway, $args ); } - return tec_tc_get_order( $existing_order_id ); + $order = tec_tc_get_order( $existing_order_id ); + + if ( ! $order instanceof WP_Post ) { + return false; + } + + return $order; } /** From ba29d742373469108a3d67c8aa70fd8ceba7c242 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 17:59:36 +0200 Subject: [PATCH 08/14] Prevent attendees from being generated if they exist already --- src/Tickets/Commerce/Attendee.php | 113 +++++++++++++++++- .../Flag_Actions/Generate_Attendees.php | 8 +- src/Tickets/Commerce/Order.php | 7 +- 3 files changed, 120 insertions(+), 8 deletions(-) diff --git a/src/Tickets/Commerce/Attendee.php b/src/Tickets/Commerce/Attendee.php index e1ef6cf76b..1465bc2ff1 100644 --- a/src/Tickets/Commerce/Attendee.php +++ b/src/Tickets/Commerce/Attendee.php @@ -297,7 +297,7 @@ public function delete( $attendee_id, $force = true ) { if ( ! $attendee_id ) { return false; } - + $event_id = (int) get_post_meta( $attendee_id, static::$event_relation_meta_key, true ); /** @@ -441,6 +441,117 @@ public function create( \WP_Post $order, $ticket, array $args = [] ) { return apply_filters( 'tec_tickets_commerce_attendee_create', $attendee, $order, $ticket, $args ); } + /** + * Updates or creates an individual attendee given an Order and Ticket. + * + * @since TBD + * + * @param \WP_Post $order Which order generated this attendee. + * @param Ticket_Object $ticket Which ticket generated this Attendee. + * @param array $args Set of extra arguments used to populate the data for the attendee. + * @param ?int $existing The ID of the existing attendee. + * + * @return \WP_Error|\WP_Post + */ + public function upsert( \WP_Post $order, $ticket, array $args = [], ?int $existing = null ) { + if ( ! $existing ) { + return $this->create( $order, $ticket, $args ); + } + + $update_args = [ + 'order_id' => $order->ID, + 'ticket_id' => $ticket->ID, + 'event_id' => $ticket->get_event_id(), + 'security_code' => Arr::get( $args, 'security_code' ), + 'opt_out' => Arr::get( $args, 'opt_out' ), + 'price_paid' => Arr::get( $args, 'price_paid' ), + 'currency' => Arr::get( $args, 'currency' ), + ]; + + if ( ! empty( $order->purchaser['user_id'] ) ) { + $update_args['user_id'] = $order->purchaser['user_id']; + } + + if ( ! empty( $args['email'] ) ) { + $update_args['email'] = $args['email']; + } + + if ( + empty( $args['email'] ) + && ! empty( $order->purchaser['email'] ) + ) { + $update_args['email'] = $order->purchaser['email']; + } + + if ( ! empty( $args['full_name'] ) ) { + $update_args['full_name'] = $args['full_name']; + $update_args['title'] = $args['full_name']; + } + + if ( + empty( $args['full_name'] ) + && ! empty( $order->purchaser['full_name'] ) + ) { + $update_args['full_name'] = $order->purchaser['full_name']; + $update_args['title'] = $order->purchaser['full_name']; + } + + $fields = Arr::get( $args, 'fields', [] ); + if ( ! empty( $fields ) ) { + $update_args['fields'] = $fields; + } + + /** + * Allow the filtering of the update arguments for attendee. + * + * @since TBD + * + * @param array $update_args Which arguments we are going to use to update the attendee. + * @param \WP_Post $order Which order generated this attendee. + * @param Ticket_Object $ticket Which ticket generated this Attendee. + * @param array $args Set of extra arguments used to populate the data for the attendee. + */ + $update_args = apply_filters( 'tec_tickets_commerce_attendee_update_args', $update_args, $order, $ticket, $args ); + + /** + * Allow the actions before updating the attendee. + * + * @since TBD + * + * @param array $update_args Which arguments we are going to use to update the attendee. + * @param \WP_Post $order Which order generated this attendee. + * @param Ticket_Object $ticket Which ticket generated this Attendee. + * @param array $args Set of extra arguments used to populate the data for the attendee. + */ + do_action( 'tec_tickets_commerce_attendee_before_update', $update_args, $order, $ticket, $args ); + + $attendee = tec_tc_attendees()->where( 'id', $existing )->set_args( $update_args )->save(); + + /** + * Allow the actions after updating the attendee. + * + * @since TBD + * + * @param \WP_Post $attendee Post object for the attendee. + * @param \WP_Post $order Which order generated this attendee. + * @param Ticket_Object $ticket Which ticket generated this Attendee. + * @param array $args Set of extra arguments used to populate the data for the attendee. + */ + do_action( 'tec_tickets_commerce_attendee_after_update', $attendee, $order, $ticket, $args ); + + /** + * Allow the filtering of the attendee WP_Post after updating attendee. + * + * @since TBD + * + * @param \WP_Post $attendee Post object for the attendee. + * @param \WP_Post $order Which order generated this attendee. + * @param Ticket_Object $ticket Which ticket generated this Attendee. + * @param array $args Set of extra arguments used to populate the data for the attendee. + */ + return apply_filters( 'tec_tickets_commerce_attendee_update', $attendee, $order, $ticket, $args ); + } + /** * If the post that was moved to the trash was a Tickets Commerce attendee post type, redirect to * the Attendees Report rather than the Tickets Commerce attendees post list (because that's kind of diff --git a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php index 2c5fcd1f6d..51370b1d13 100644 --- a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php +++ b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php @@ -138,7 +138,13 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord */ $args = apply_filters( 'tec_tickets_commerce_flag_action_generate_attendee_args', $args, $ticket, $order, $new_status, $old_status, $item, $i ); - $attendee = tribe( Attendee::class )->create( $order, $ticket, $args ); + $existing = tec_tc_attendees()->by_args( $args )->offset( $i )->first_id(); + + if ( ! $existing || ! is_int( $existing ) ) { + $existing = null; + } + + $attendee = tribe( Attendee::class )->upsert( $order, $ticket, $args, $existing ); /** * Fires after an attendee is generated for an order. diff --git a/src/Tickets/Commerce/Order.php b/src/Tickets/Commerce/Order.php index 25dcd0ffa9..fbeaff1bec 100644 --- a/src/Tickets/Commerce/Order.php +++ b/src/Tickets/Commerce/Order.php @@ -605,12 +605,7 @@ public function upsert( Gateway_Interface $gateway, array $args ) { */ $update_args = apply_filters( 'tec_tickets_commerce_order_update_args', $update_args, $gateway ); - $updated = tec_tc_orders()->by_args( - [ - 'status' => 'any', - 'id' => $existing_order_id, - ] - )->set_args( $update_args )->save(); + $updated = tec_tc_orders()->where( 'id', $existing_order_id )->set_args( $update_args )->save(); if ( empty( $updated[ $existing_order_id ] ) ) { /** From 3ac168f69a2f4f7a0bd866fd67f9cce524b0b9a6 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 18:37:18 +0200 Subject: [PATCH 09/14] Amend mike's comments --- src/Tickets/Commerce/Order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tickets/Commerce/Order.php b/src/Tickets/Commerce/Order.php index fbeaff1bec..0a2ed1c888 100644 --- a/src/Tickets/Commerce/Order.php +++ b/src/Tickets/Commerce/Order.php @@ -486,7 +486,7 @@ static function ( $item ) { $order_args['id'] = $existing_order_id; - $order = $this->upsert( $gateway, $order_args, $existing_order_id ); + $order = $this->upsert( $gateway, $order_args ); // We were unable to create the order bail from here. if ( ! $order ) { From 2fc0b2a30029312662a196b72d8dc09b27df76d1 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 19:03:41 +0200 Subject: [PATCH 10/14] Fix return type of attendee during upsert --- src/Tickets/Commerce/Attendee.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Tickets/Commerce/Attendee.php b/src/Tickets/Commerce/Attendee.php index 1465bc2ff1..a5efdeee58 100644 --- a/src/Tickets/Commerce/Attendee.php +++ b/src/Tickets/Commerce/Attendee.php @@ -525,7 +525,13 @@ public function upsert( \WP_Post $order, $ticket, array $args = [], ?int $existi */ do_action( 'tec_tickets_commerce_attendee_before_update', $update_args, $order, $ticket, $args ); - $attendee = tec_tc_attendees()->where( 'id', $existing )->set_args( $update_args )->save(); + $updated = tec_tc_attendees()->where( 'id', $existing )->set_args( $update_args )->save(); + + if ( empty( $updated[ $existing ] ) ) { + return $this->create( $order, $ticket, $args ); + } + + $attendee = tec_tc_attendees()->where( 'id', $existing )->first(); /** * Allow the actions after updating the attendee. From 263a97c006e4715f7faf11dd6f32fbda5d5bfe52 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 19:03:50 +0200 Subject: [PATCH 11/14] fix test case --- .../TEC/Tickets/Commerce/Order_Test.php | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php index 3fb747ef54..4f54ff16d1 100644 --- a/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php +++ b/tests/commerce_integration/TEC/Tickets/Commerce/Order_Test.php @@ -7,14 +7,22 @@ use Codeception\TestCase\WPTestCase; use TEC\Tickets\Commerce\Gateways\Stripe\Gateway; use Tribe\Tests\Traits\With_Uopz; +use Tribe\Tickets\Test\Commerce\TicketsCommerce\Order_Maker; use WP_Post; +use TEC\Tickets\Commerce\Status\Pending; +use TEC\Tickets\Commerce\Status\Completed; class Order_Test extends WPTestCase { use Ticket_Maker; use With_Uopz; + use Order_Maker; public function test_it_does_not_create_multiple_orders_for_single_cart() { - $post = self::factory()->post->create(); + $post = self::factory()->post->create( + [ + 'post_type' => 'page', + ] + ); $ticket_id_1 = $this->create_tc_ticket( $post, 10 ); $ticket_id_2 = $this->create_tc_ticket( $post, 20 ); @@ -79,6 +87,36 @@ public function test_it_does_not_create_multiple_orders_for_single_cart() { $this->assertSame( 60.0, $order_6->total_value->get_decimal() ); } + public function test_attendees_are_not_created_multiple_times() { + $post = self::factory()->post->create( + [ + 'post_type' => 'page', + ] + ); + $ticket_id_1 = $this->create_tc_ticket( $post, 10 ); + $ticket_id_2 = $this->create_tc_ticket( $post, 20 ); + + $order = $this->create_order( [ $ticket_id_1 => 1, $ticket_id_2 => 2 ] ); + + tribe( Order::class )->modify_status( $order->ID, Pending::SLUG ); + + $attendees = tec_tc_attendees()->by( 'parent', $order->ID )->by( 'status', 'any' )->all(); + + $this->assertCount( 3, $attendees ); + + tribe( Order::class )->modify_status( $order->ID, Pending::SLUG ); + + $attendees = tec_tc_attendees()->by( 'parent', $order->ID )->by( 'status', 'any' )->all(); + + $this->assertCount( 3, $attendees ); + + tribe( Order::class )->modify_status( $order->ID, Completed::SLUG ); + + $attendees = tec_tc_attendees()->by( 'parent', $order->ID )->by( 'status', 'any' )->all(); + + $this->assertCount( 3, $attendees ); + } + protected function create_order_from_cart( array $items, array $overrides = [] ) { foreach ( $items as $id => $quantity ) { tribe( Cart::class )->get_repository()->add_item( $id, $quantity ); From 13bda2c7bacb7d53d9636c57bbdbd8d6346db8a2 Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Mon, 6 Jan 2025 21:54:48 +0200 Subject: [PATCH 12/14] keep track of found attendees already --- src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php index 51370b1d13..2e1d3cbfc6 100644 --- a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php +++ b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php @@ -115,6 +115,8 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord $attendees = []; + $found = []; + for ( $i = 0; $i < $quantity; $i ++ ) { $args = [ 'opt_out' => Arr::get( $extra, 'optout' ), @@ -144,6 +146,12 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord $existing = null; } + $found[] = $existing; + + $found = array_filter( $found ); + + $existing = in_array( $existing, $found, true ) ? null : $existing; + $attendee = tribe( Attendee::class )->upsert( $order, $ticket, $args, $existing ); /** From 69d58134ad8aef8455bd4adb602f73504948aaec Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Tue, 7 Jan 2025 14:05:29 +0200 Subject: [PATCH 13/14] Fix broken tests by correctly calculating existing attendees --- .../Flag_Actions/Generate_Attendees.php | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php index 2e1d3cbfc6..84d49147d7 100644 --- a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php +++ b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php @@ -115,7 +115,18 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord $attendees = []; - $found = []; + $existing = []; + foreach ( + tec_tc_attendees()->by_args( + [ + 'order_id' => $order->ID, + 'ticket_id' => $ticket->ID, + 'event_id' => $ticket->get_event_id(), + ] + )->fields( 'ids' )->all( true ) as $attendee_id + ) { + $existing[] = $attendee_id; + } for ( $i = 0; $i < $quantity; $i ++ ) { $args = [ @@ -140,19 +151,7 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord */ $args = apply_filters( 'tec_tickets_commerce_flag_action_generate_attendee_args', $args, $ticket, $order, $new_status, $old_status, $item, $i ); - $existing = tec_tc_attendees()->by_args( $args )->offset( $i )->first_id(); - - if ( ! $existing || ! is_int( $existing ) ) { - $existing = null; - } - - $found[] = $existing; - - $found = array_filter( $found ); - - $existing = in_array( $existing, $found, true ) ? null : $existing; - - $attendee = tribe( Attendee::class )->upsert( $order, $ticket, $args, $existing ); + $attendee = tribe( Attendee::class )->upsert( $order, $ticket, $args, $existing[ $i ] ?? null ); /** * Fires after an attendee is generated for an order. From 7ec2340b17ea27bbd2e7894d3be6f6ccc499240b Mon Sep 17 00:00:00 2001 From: Dimitrios Pantazis Date: Tue, 7 Jan 2025 14:18:41 +0200 Subject: [PATCH 14/14] Fix existing attendee format to be only ints or nulls --- src/Tickets/Commerce/Attendee.php | 3 +++ src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Tickets/Commerce/Attendee.php b/src/Tickets/Commerce/Attendee.php index a5efdeee58..1a8dd3da6c 100644 --- a/src/Tickets/Commerce/Attendee.php +++ b/src/Tickets/Commerce/Attendee.php @@ -501,6 +501,9 @@ public function upsert( \WP_Post $order, $ticket, array $args = [], ?int $existi $update_args['fields'] = $fields; } + // No need to update the security code. + unset( $update_args['security_code'] ); + /** * Allow the filtering of the update arguments for attendee. * diff --git a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php index 84d49147d7..d0985a295d 100644 --- a/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php +++ b/src/Tickets/Commerce/Flag_Actions/Generate_Attendees.php @@ -123,8 +123,12 @@ public function handle( Status_Interface $new_status, $old_status, \WP_Post $ord 'ticket_id' => $ticket->ID, 'event_id' => $ticket->get_event_id(), ] - )->fields( 'ids' )->all( true ) as $attendee_id + )->get_ids( true ) as $attendee_id ) { + if ( ! is_int( $attendee_id ) || 0 >= $attendee_id ) { + $existing[] = null; + continue; + } $existing[] = $attendee_id; }