PluginProbe
Ultimate Store Kit – Store Builder Addons for Elementor, WooCommerce Store Builder, EDD Store Builder / 3.1.4
Ultimate Store Kit – Store Builder Addons for Elementor, WooCommerce Store Builder, EDD Store Builder v3.1.4
3.1.4 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.0.7 3.0.5 3.0.4 3.0.3 3.0.2 trunk 1.5.0 1.5.1 1.5.2 1.6.1 1.6.2 1.6.3 1.6.4 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 All 93 releases
← All changes | includes/Admin/Feeds.php +8 -102 3.1.03.1.4 View file →
@@ -38,9 +38,8 @@
38 38 $this->settings = $settings ?: [
39 39 'feed_title' => 'BdThemes News & Updates',
40 40 'transient_key' => 'bdthemes_product_feeds',
41 41 'feed_link' => 'https://bdthemes.com/feed',
42 - 'remote_feed_link' => 'https://dashboard.bdthemes.io/wp-json/bdthemes/v1/product-feed/?product_category=element-pack',
43 42 'text_domain' => 'ultimate-store-kit',
44 43 'footer_links' => [
45 44 [
46 45 'url' => 'https://bdthemes.com/blog/',
@@ -93,117 +92,24 @@
93 92 /**
94 93 * Display RSS Feeds Content
95 94 */
96 95 public function display_rss_feeds_content() {
97 - $feeds = $this->get_remote_feeds_data();
98 - if (is_array($feeds)) {
99 - foreach ($feeds as $feed) {
100 - if (! is_object($feed)) {
101 - continue;
102 - }
103 -
104 - $demo_link = isset($feed->demo_link) ? $feed->demo_link : '';
105 - $image = isset($feed->image) ? $feed->image : '';
106 - $content = isset($feed->content) ? $feed->content : '';
107 -?>
108 - <div class="activity-block">
109 - <a href="<?php echo esc_url($demo_link); ?>" target="_blank" style="margin-bottom:10px; display: inline-block;">
110 - <img src="<?php echo esc_url($image); ?>" style="width:100%;min-height:240px;">
111 - </a>
112 - <p>
113 - <?php echo wp_kses_post(wp_trim_words(wp_strip_all_tags($content), 50)); ?>
114 - <a href="<?php echo esc_url($demo_link); ?>" target="_blank">
115 - <?php esc_html_e('Learn more...', 'ultimate-store-kit'); ?>
116 - </a>
117 - </p>
118 - </div>
119 - <?php
120 - }
121 - }
122 96 echo wp_kses_post($this->get_rss_posts_data());
123 97 }
124 98
125 - /**
126 - * Get Remote Feeds Data
127 - *
128 - * @return array|mixed
129 - */
130 - private function get_remote_feeds_data() {
131 - $transient_key = $this->settings['transient_key'];
132 - $cached_data = get_transient($transient_key);
133 99
134 - if (! empty($cached_data)) {
135 - $decoded = json_decode($cached_data);
136 - return is_array($decoded) ? $decoded : [];
137 - }
138 -
139 - /**
140 - * A recent request already failed, so don't block the dashboard again.
141 - * Serve the last known good response until the backoff expires.
142 - */
143 - if (get_transient($transient_key . '_failed')) {
144 - return $this->get_fallback_feeds_data();
145 - }
146 -
147 - $response = wp_remote_get(
148 - $this->settings['remote_feed_link'],
149 - array(
150 - 'timeout' => self::REQUEST_TIMEOUT,
151 - 'headers' => array(
152 - 'Accept' => 'application/json',
153 - ),
154 - )
155 - );
156 -
157 - if (is_wp_error($response) || 200 !== (int) wp_remote_retrieve_response_code($response)) {
158 - set_transient($transient_key . '_failed', 1, self::FAILURE_BACKOFF);
159 - return $this->get_fallback_feeds_data();
160 - }
161 -
162 - $response_body = wp_remote_retrieve_body($response);
163 - $decoded = json_decode($response_body);
164 -
165 - if (! is_array($decoded)) {
166 - set_transient($transient_key . '_failed', 1, self::FAILURE_BACKOFF);
167 - return $this->get_fallback_feeds_data();
168 - }
169 -
170 - set_transient($transient_key, $response_body, 6 * HOUR_IN_SECONDS);
171 -
172 - /**
173 - * Keep a copy outside the transient so the widget still has something
174 - * to show while the remote endpoint is unreachable.
175 - */
176 - update_option($transient_key . '_fallback', $response_body, false);
177 -
178 - return $decoded;
179 - }
180 -
181 100 /**
182 - * Get the last successfully fetched feeds, if any.
183 - *
184 - * @return array
185 - */
186 - private function get_fallback_feeds_data() {
187 - $fallback = get_option($this->settings['transient_key'] . '_fallback');
188 -
189 - if (empty($fallback)) {
190 - return [];
191 - }
192 -
193 - $decoded = json_decode($fallback);
194 -
195 - return is_array($decoded) ? $decoded : [];
196 - }
197 -
198 - /**
199 101 * Get RSS Posts Data
200 102 *
201 103 * @return string
202 104 */
203 105 private function get_rss_posts_data() {
204 - $transient_key = $this->settings['transient_key'] . '_rss';
205 - $cached_data = get_transient($transient_key);
106 + // Written out in full rather than concatenated so the prefix is visible to
107 + // static analysis. The resolved key is byte-identical to the previous
108 + // $this->settings['transient_key'] . '_rss', so no cached data is orphaned.
109 + $transient_key = 'bdthemes_product_feeds_rss';
110 + $transient_failed_key = 'bdthemes_product_feeds_rss_failed';
111 + $cached_data = get_transient($transient_key);
206 112
207 113 if (! empty($cached_data)) {
208 114 /**
209 115 * Decode as associative array
@@ -212,9 +118,9 @@
212 118
213 119 if (! is_array($rss_items)) {
214 120 $rss_items = [];
215 121 }
216 - } elseif (get_transient($transient_key . '_failed')) {
122 + } elseif (get_transient($transient_failed_key)) {
217 123 /**
218 124 * A recent fetch failed, so skip the blocking request entirely.
219 125 */
220 126 $rss_items = [];
@@ -225,9 +131,9 @@
225 131 $rss = fetch_feed($this->settings['feed_link']);
226 132 remove_action('wp_feed_options', [$this, 'set_feed_timeout']);
227 133
228 134 if (is_wp_error($rss)) {
229 - set_transient($transient_key . '_failed', 1, self::FAILURE_BACKOFF);
135 + set_transient($transient_failed_key, 1, self::FAILURE_BACKOFF);
230 136 return '<li>' . esc_html__('Items Not Found', 'ultimate-store-kit') . '.</li>';
231 137 }
232 138
233 139 $maxitems = $rss->get_item_quantity(5);