PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.9.4
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.9.4
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php +63 -45 3.1.33.9.4 View file →
@@ -71,9 +71,11 @@
71 71 *
72 72 * @return Dashboard_Widget Module instance.
73 73 */
74 74 public function load( $product ) {
75 -
75 + if ( apply_filters( 'themeisle_sdk_hide_dashboard_widget', false ) ) {
76 + return;
77 + }
76 78 $this->product = $product;
77 79 $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
78 80 $this->feeds = apply_filters(
79 81 'themeisle_sdk_dashboard_widget_feeds',
@@ -93,9 +95,9 @@
93 95 * Add widget to the dashboard
94 96 *
95 97 * @return string|void
96 98 */
97 - function add_widget() {
99 + public function add_widget() {
98 100 global $wp_meta_boxes;
99 101 if ( isset( $wp_meta_boxes['dashboard']['normal']['core']['themeisle'] ) ) {
100 102 return;
101 103 }
@@ -102,9 +104,9 @@
102 104 wp_add_dashboard_widget(
103 105 'themeisle',
104 106 $this->dashboard_name,
105 107 [
106 - &$this,
108 + $this,
107 109 'render_dashboard_widget',
108 110 ]
109 111 );
110 112 }
@@ -111,9 +113,9 @@
111 113
112 114 /**
113 115 * Render widget content
114 116 */
115 - function render_dashboard_widget() {
117 + public function render_dashboard_widget() {
116 118 $this->setup_feeds();
117 119 if ( empty( $this->items ) || ! is_array( $this->items ) ) {
118 120 return;
119 121 }
@@ -126,12 +128,13 @@
126 128 padding-top: 6px;
127 129 }
128 130
129 131 #themeisle h2.hndle {
130 - background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4xMiA3Ny4xMiI+PHRpdGxlPkFzc2V0IDM8L3RpdGxlPjxwYXRoIGQ9Ik03NS43Niw0Ny42cS0xLjUsNi40Ni00LjA3LDkuMjZBMzYuMjIsMzYuMjIsMCwwLDEsNjMuMjYsNjNhNTEsNTEsMCwwLDEtOS43OSw0LjZoLS4xNXY0LjgyQTQuNjYsNC42NiwwLDAsMSw1Miw3NS43Niw0LjA3LDQuMDcsMCwwLDEsNDksNzcuMTJhNCw0LDAsMCwxLTIuMTgtLjYxQTQuOTQsNC45NCwwLDAsMSw0NS4xOSw3NWE0LjQyLDQuNDIsMCwwLDEtNy41NCwwLDQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSwzLjc1LDMuNzUsMCwwLDEtMiwuNjFBNC4yNyw0LjI3LDAsMCwxLDMwLjI3LDc1YTQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSw0LDQsMCwwLDEtMi4xOC42MSwzLjkzLDMuOTMsMCwwLDEtMy4xNi0xLjQzLDUuMyw1LjMsMCwwLDEtMS4yMS0zLjU0LDEzLjgxLDEzLjgxLDAsMCwxLTguNTgsMywxMy4yMywxMy4yMywwLDAsMS05LTMuNDdBMTguMjEsMTguMjEsMCwwLDAsOSw3MC43OWExNC4yNiwxNC4yNiwwLDAsMS03LjgzLTUuNDIsMTYuMTIsMTYuMTIsMCwwLDAsNS4xOS4wNywxMi44OSwxMi44OSwwLDAsMCw0LjktMS43M1EzLjE1LDU1LjQzLDEuMDUsNTAuNDZhMTgsMTgsMCwwLDEtMS02LjkzQTQwLDQwLDAsMCwxLDEuMjEsMzQsMjYuNTksMjYuNTksMCwwLDEsNS4yNywyNC4xUTguNDQsMTkuNDMsMTMsMTkuNDNhMy40MSwzLjQxLDAsMCwxLDMuNDcsMi4yNmMuNi0uOCwxLjItMS41NiwxLjgxLTIuMjZsLjQ1LS40NS43NS0uNzUsMS4wNS0xLjgxYTM1LjIsMzUuMiwwLDAsMSwyLjExLTMuMzIsMjguNTcsMjguNTcsMCwwLDEsOS4xMi03LjY4QTIzLjQsMjMuNCwwLDAsMSw0Mi45MywyLjU2YTIyLjIyLDIyLjIyLDAsMCwxLDIuNzEuMTVBOC4xNiw4LjE2LDAsMCwxLDUxLjgxLDAsOC42OSw4LjY5LDAsMCwxLDU4LDIuNDFhMS41MSwxLjUxLDAsMCwxLC4xNS42OGMwLC4yNS0uNTUuOTMtMS42NiwybC0uMy4zYTkuNjksOS42OSwwLDAsMSwxLjU4LjgzYy41NS4zNS44My42NS44My45YTEuNjIsMS42MiwwLDAsMS0uNiwxbC0uMTUuMTVxNi43OCw2LDguNTgsMTYuMjdBMy4zLDMuMywwLDAsMSw2OSwyMy4zNWE2LjQ4LDYuNDgsMCwwLDEsNC4yMiwyLjFxMy45MiwzLjMyLDMuOTIsMTEuOUE0Mi4wNSw0Mi4wNSwwLDAsMSw3NS43Niw0Ny42Wk01My42Miw1NC4wN2EyNCwyNCwwLDAsMS0xNCw0LjUyQTIxLjQxLDIxLjQxLDAsMCwxLDI3LDU0LjY3LDI0LjI4LDI0LjI4LDAsMCwxLDE4LjUzLDQ1YTI5LDI5LDAsMCwxLTMtMTMsMzEuNzgsMzEuNzgsMCwwLDEsLjkxLTcuNTNBMzIuMTcsMzIuMTcsMCwwLDAsMTEuOSw0MS4yN2EzMy41LDMzLjUsMCwwLDAsMi43OSwxMy40LDI5LjEsMjkuMSwwLDAsMCw3LjksMTAuODUsNC42OCw0LjY4LDAsMCwxLDEuNjYtMS44OCw0LjE3LDQuMTcsMCwwLDEsNC40NC0uMDgsNC41LDQuNSwwLDAsMSwxLjU4LDEuNjZBNC4yLDQuMiwwLDAsMSwzNCw2M2EzLjgzLDMuODMsMCwwLDEsMiwuNiw0LjUsNC41LDAsMCwxLDEuNTgsMS42Niw0LjI3LDQuMjcsMCwwLDEsNy41NCwwLDQuNSw0LjUsMCwwLDEsMS41OC0xLjY2LDQuMTcsNC4xNywwLDAsMSw0LjQ0LjA4LDMuODYsMy44NiwwLDAsMSwxLjUxLDEuNzMsMzAuMTcsMzAuMTcsMCwwLDAsNy42OC05Ljk0LDMxLjE4LDMxLjE4LDAsMCwwLDMuMTYtMTIuMzVBMjguMzksMjguMzksMCwwLDEsNTMuNjIsNTQuMDdaTTI4Ljc3LDY1LjM3YTMuMSwzLjEsMCwwLDAtNC4zNywwLDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi45MywyLjkzLDAsMCwwLDQuMzcsMCwzLjMyLDMuMzIsMCwwLDAsLjktMi4zM1Y2Ny42M0EzLjA2LDMuMDYsMCwwLDAsMjguNzcsNjUuMzdabS45LTQ4YTQuMjQsNC4yNCwwLDAsMCwzLjQ3LDEuNzMsNC40NSw0LjQ1LDAsMCwwLDMuNTQtMS43Myw2LDYsMCwwLDAsMS40My0zLjkyLDUuNyw1LjcsMCwwLDAtMS40My0zLjg0QTQuNTMsNC41MywwLDAsMCwzMy4xNCw4YTQuMzEsNC4zMSwwLDAsMC0zLjQ3LDEuNjYsNS43OSw1Ljc5LDAsMCwwLTEuMzUsMy43N0E2LjMzLDYuMzMsMCwwLDAsMjkuNjcsMTcuNFptNi40OCw0OGEzLjEsMy4xLDAsMCwwLTQuMzcsMCwzLjA2LDMuMDYsMCwwLDAtLjksMi4yNnY0LjgyYTMuMzIsMy4zMiwwLDAsMCwuOSwyLjMzLDIuOTMsMi45MywwLDAsMCw0LjM3LDAsMy4zMiwzLjMyLDAsMCwwLC45LTIuMzNWNjcuNjNBMy4wNiwzLjA2LDAsMCwwLDM2LjE1LDY1LjM3Wm0tNC4wNy01NC4zYTIuMzcsMi4zNywwLDAsMSwyLTEsMi4xNywyLjE3LDAsMCwxLDEuODgsMSw0LjEsNC4xLDAsMCwxLDAsNC41MiwyLjE3LDIuMTcsMCwwLDEtMS44OCwxLDIuMzcsMi4zNywwLDAsMS0yLTEsMy43MiwzLjcyLDAsMCwxLS43NS0yLjM0QTMuNDksMy40OSwwLDAsMSwzMi4wOCwxMS4wN1ptNSw5LjQxYTIwLjYxLDIwLjYxLDAsMCwwLTMuNTQsMTIuMjgsMTcuMTUsMTcuMTUsMCwwLDAsNC4wNywxMSwxMi40MywxMi40MywwLDAsMCw5Ljg3LDQuNDUsMTUuMywxNS4zLDAsMCwwLDktMywxMywxMywwLDAsMCwuNi0zLjMycTAtMy4zMi0zLjE2LTMuMzFhOC41OCw4LjU4LDAsMCwwLTIsLjNxLTcuODMsMS41LTExLjU5LS4zLTQuNTMtMi4xMi00LjUyLTkuMzRBMzcuOTIsMzcuOTIsMCwwLDEsMzcuMDUsMjAuNDhaTTYxLjQ1LDE3QTEyLjg0LDEyLjg0LDAsMCwwLDUxLjIxLDEyLjJhMTUuMTEsMTUuMTEsMCwwLDAtNi40LDEuNDMsMTcuODMsMTcuODMsMCwwLDAtNS41LDRxLTYuMTgsMjAuNjQsNi4xOCwyMC42NEEyNC43NSwyNC43NSwwLDAsMCw0OSwzNy44MWEzOC45MiwzOC45MiwwLDAsMSw0LjgyLS40NmMxLjgxLDAsMy4wNi40NiwzLjc3LDEuMzZxMS4zNSwxLjUuNzUsNS4xMmEyMS43MiwyMS43MiwwLDAsMCw1LTcuMTVBMjEuMzgsMjEuMzgsMCwwLDAsNjUuMDcsMjgsMTcuNDQsMTcuNDQsMCwwLDAsNjEuNDUsMTdaTTQzLjYsNjUuMzdhMi43MiwyLjcyLDAsMCwwLTIuMS0uOSwzLDMsMCwwLDAtMi4xOS45LDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi44NCwyLjg0LDAsMCwwLDIuMTksMSwyLjYxLDIuNjEsMCwwLDAsMi4xLTEsMy40NSwzLjQ1LDAsMCwwLC44My0yLjMzVjY3LjYzQTMuMTcsMy4xNywwLDAsMCw0My42LDY1LjM3Wm03LjQ2LDBhMywzLDAsMCwwLTIuMTgtLjksMi43MywyLjczLDAsMCwwLTIuMTEuOSwzLjE3LDMuMTcsMCwwLDAtLjgzLDIuMjZ2NC44MmEzLjQ1LDMuNDUsMCwwLDAsLjgzLDIuMzMsMi42MSwyLjYxLDAsMCwwLDIuMTEsMSwyLjgzLDIuODMsMCwwLDAsMi4xOC0xLDMuMzIsMy4zMiwwLDAsMCwuOS0yLjMzVjY3LjYzQTMuMDYsMy4wNiwwLDAsMCw1MS4wNiw2NS4zN1oiLz48L3N2Zz4=');
132 + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABbCAMAAADncTNAAAAAtFBMVEVHcEyAgIB/f3+xsbGgoaGBgYGCgoKKioqAgIC1tbW5ubnFx8iAgIDU1taBgYGCgoKAgIC0tLXW19jW2NiAgIC3uLiBgYHLzMy4uLhycnLW19d/f3/T1NW0tLTX19mVlZWvr6+BgYHl5eWKiottbW5JSUnW2Nm5ubnh4eHT1NWVlZVjY2N4eHh9fX6pqqq+v79PT0/39/fu7u7Nzc7Z2ttYWFgBAQHDw8P////JysoZGRk0NTZqJc/sAAAAIXRSTlMA0FL7/oEnEPL6eibivm9gwJya76/enFq2CXI+2lFAyM8GATmPAAADj0lEQVR4Xu2YaW/iOhSGAwRCWDosnXa6znjJvm8svf//f12TuARyhiR2pfnUR6gSEnr0+uT4xK7yRb755pvhHePli5K7Bfpkuhoq8ozRJdMH+WWha6Z3sqYparCSLRJqspjImVbANJU03cNMMpofAwQZCGsmpQYyFvVM0Q00OQ9koMl5IPcCoro+RA1Dt2Ea9n9eZ0+YHJLkgIlkDywQx00wCTyaReiKH8LbNU9ybJOdkchV6QFxyCFLbVvdfaREqgUWg/tx2UbqIcK2Hex2TdGLwFTjIj3XP3YfCZFsb23KRZn/3263oymSFI0/a5S4PqUBjoBIJBDjeEhCN0wxQSRybIxtJ3K5SGzuE/vAwIQc8ZmMMJFAIM4oikZItfEFtorGgoE43FObwqHU68OtPCnOz8KZ2Jbl5LgkSW0Tc7YyIz/EFWmS4jMbiZU5mJOmKRaJpKGGyLZtDJh3iyaNUu/3+xyKnrtFL71EG+FTiMpENhQtxUQ8kSOXCIr2tnCNhg/gTX0SHYFp0t7TCwQZ7U841yoHrW6rtGroUwTWVnLMssxx+H4bgZcSOFf5MYx0Ae8FghomMDyC2EBNImBywPkNTDNqGLQpIg2TjUNU8tBy9DQMo0DAZF16rAi7vJAtFTIYFAHUc6hIRW6OuOhJgaCSwmDEAYK4oa7ro+qIEyJU/US7KTJKPNSFT9tFgVFBu0SF1y7yjX4masRA9Da7EFGj28R/BkQz6xGIOurkx38T/bKs9Uk8aIiMwm/Jw0VP1yLrJwt13xAxvABBgsK4KWLov35DkRF7ZaqgzuZ7MQ8MOntmVYyAqKTwaICKqvSUFnVccMN5sziEP/5+xGDTahbH5Q3ZB76zr8fI+nJtvUUU3t3ml5GKviK/npCg3CGodnuJ4JVkfRFJYGVDBZrqKnn9RLf+CzDTS5PaN5J38+auzX4ykU4Qoj0rdKfcYs5ijfo9OL/uRUgZyQr7NCWtWwiUSLc4arfJa7lpszTA1OJZAQ8w8dXFrR5YHzCWSnS3pZ18tOi4Ps4vl/c7i/6qomjRecN+UubrPyPGn/VEMU3T0UFHkaPzpgjxmJsnjmrtionlMDZiog0TsY/DPtn8SXtlBvbtxKtwopy7lqW3smQO+yoGE1Uu55GJ3pmI8ygoejZNnqj0vnIRCyTKfLstRdtStGQi09myUsvwvlkuzSUXbV+Xz5ryBebV33fln/A/moud69FZiEYAAAAASUVORK5CYII=');
131 133 background-repeat: no-repeat;
132 - background-position: 92% 50%;
133 - background-size: 30px;
134 + background-position: 2% 50%;
135 + background-size: 25px;
136 + padding-left: 39px;
134 137 }
135 138
136 139 #themeisle .inside {
137 140 padding: 0;
@@ -217,21 +220,23 @@
217 220 ?>
218 221 <li class="ti-dw-feed-item">
219 222 <a href="
220 223 <?php
221 - echo add_query_arg(
222 - array(
223 - 'utm_source' => 'wpadmin',
224 - 'utm_campaign' => 'feed',
225 - 'utm_medium' => 'dashboard_widget',
226 - ),
227 - $item['link']
224 + echo esc_url(
225 + add_query_arg(
226 + array(
227 + 'utm_source' => 'wpadmin',
228 + 'utm_campaign' => 'feed',
229 + 'utm_medium' => 'dashboard_widget',
230 + ),
231 + $item['link']
232 + )
228 233 );
229 234 ?>
230 235 " target="_blank">
231 236 <span class="ti-dw-date-container"><span
232 - class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
233 - class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><?php echo $item['title']; ?>
237 + class="ti-dw-day-container"><?php echo esc_attr( gmdate( 'd', $item['date'] ) ); ?></span> <span
238 + class="ti-dw-month-container"><?php echo esc_attr( substr( gmdate( 'M', $item['date'] ), 0, 3 ) ); ?></span></span><?php echo esc_attr( $item['title'] ); ?>
234 239 </a>
235 240 </li>
236 241 <?php
237 242 }
@@ -272,26 +277,30 @@
272 277 }
273 278 ?>
274 279 <div class="ti-dw-footer">
275 280 <span class="ti-dw-recommend-item ">
276 - <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
281 + <span class="ti-dw-recommend"><?php echo esc_attr( apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ) ); ?>
277 282 : </span>
278 283 <?php
279 - echo trim(
280 - str_replace(
281 - array(
282 - 'lite',
283 - 'Lite',
284 - ),
285 - '',
286 - $recommend['name']
284 + echo esc_attr(
285 + trim(
286 + str_replace(
287 + array(
288 + 'lite',
289 + 'Lite',
290 + '(Lite)',
291 + '(lite)',
292 + ),
293 + '',
294 + $recommend['name']
295 + )
287 296 )
288 297 );
289 298 ?>
290 299 (<a class="thickbox open-plugin-details-modal"
291 - href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
300 + href="<?php echo esc_url( $url . '&TB_iframe=true&width=600&height=500' ); ?>"><?php echo esc_attr( apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ) ); ?></a>)
292 301 </span>
293 - <span class="ti-dw-powered-by"><span><?php echo apply_filters( 'themeisle_sdk_dashboard_widget_powered_by', esc_attr( sprintf( 'Powered by %s', $this->product->get_friendly_name() ) ) ); ?></span></span>
302 + <span class="ti-dw-powered-by"><span><?php echo esc_attr( apply_filters( 'themeisle_sdk_dashboard_widget_powered_by', sprintf( 'Powered by %s', $this->product->get_friendly_name() ) ) ); ?></span></span>
294 303 </div>
295 304
296 305 <?php
297 306
@@ -300,9 +309,9 @@
300 309 /**
301 310 * Setup feed items.
302 311 */
303 312 private function setup_feeds() {
304 - if ( false === ( $items_normalized = get_transient( 'themeisle_sdk_feed_items' ) ) ) {
313 + if ( false === ( $items_normalized = get_transient( 'themeisle_sdk_feed_items' ) ) ) { //phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
305 314 // Load SimplePie Instance.
306 315 $feed = fetch_feed( $this->feeds );
307 316 // TODO report error when is an error loading the feed.
308 317 if ( is_wp_error( $feed ) ) {
@@ -348,9 +357,9 @@
348 357
349 358 /**
350 359 * Contact the API and fetch the recommended plugins/themes
351 360 */
352 - function recommend_plugin_or_theme() {
361 + public function recommend_plugin_or_theme() {
353 362 $products = $this->get_product_from_api();
354 363 if ( ! is_array( $products ) ) {
355 364 $products = array();
356 365 }
@@ -369,22 +378,29 @@
369 378 * Fetch products from the recomended section.
370 379 *
371 380 * @return array|mixed The list of products to use in recomended section.
372 381 */
373 - function get_product_from_api() {
374 - if ( false === ( $products = get_transient( 'themeisle_sdk_products' ) ) ) {
375 - $products = array();
376 - $themeisle_themes = $this->get_themes_from_wporg( 'themeisle' );
377 - $codeinwp_themes = $this->get_themes_from_wporg( 'codeinwp' );
378 -
379 - $themeisle_plugins = $this->get_plugins_from_wporg( 'themeisle' );
380 - $codeinwp_plugins = $this->get_plugins_from_wporg( 'codeinwp' );
381 -
382 - $all_themes = array_merge( $themeisle_themes, $codeinwp_themes );
382 + public function get_product_from_api() {
383 + if ( false === ( $products = get_transient( 'themeisle_sdk_products' ) ) ) { //phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
384 + $products = array();
385 + $all_themes = $this->get_themes_from_wporg( 'themeisle' );
386 + $all_plugins = $this->get_plugins_from_wporg( 'themeisle' );
387 + static $allowed_products = [
388 + 'hestia' => true,
389 + 'neve' => true,
390 + 'visualizer' => true,
391 + 'feedzy-rss-feeds' => true,
392 + 'wp-product-review' => true,
393 + 'otter-blocks' => true,
394 + 'themeisle-companion' => true,
395 + ];
383 396 foreach ( $all_themes as $theme ) {
384 397 if ( $theme->active_installs < 4999 ) {
385 398 continue;
386 399 }
400 + if ( ! isset( $allowed_products[ $theme->slug ] ) ) {
401 + continue;
402 + }
387 403 $products[] = array(
388 404 'name' => $theme->name,
389 405 'type' => 'theme',
390 406 'slug' => $theme->slug,
@@ -390,13 +406,15 @@
390 406 'slug' => $theme->slug,
391 407 'installs' => $theme->active_installs,
392 408 );
393 409 }
394 - $all_plugins = array_merge( $themeisle_plugins, $codeinwp_plugins );
395 410 foreach ( $all_plugins as $plugin ) {
396 411 if ( $plugin->active_installs < 4999 ) {
397 412 continue;
398 413 }
414 + if ( ! isset( $allowed_products[ $plugin->slug ] ) ) {
415 + continue;
416 + }
399 417 $products[] = array(
400 418 'name' => $plugin->name,
401 419 'type' => 'plugin',
402 420 'slug' => $plugin->slug,
@@ -415,10 +433,10 @@
415 433 * @param string $author The author name.
416 434 *
417 435 * @return array The list of themes.
418 436 */
419 - function get_themes_from_wporg( $author ) {
420 - $products = wp_remote_get(
437 + public function get_themes_from_wporg( $author ) {
438 + $products = $this->safe_get(
421 439 'https://api.wordpress.org/themes/info/1.1/?action=query_themes&request[author]=' . $author . '&request[per_page]=30&request[fields][active_installs]=true'
422 440 );
423 441 $products = json_decode( wp_remote_retrieve_body( $products ) );
424 442 if ( is_object( $products ) ) {
@@ -436,11 +454,11 @@
436 454 * @param string $author The author slug.
437 455 *
438 456 * @return array The list of plugins for the selected author.
439 457 */
440 - function get_plugins_from_wporg( $author ) {
441 - $products = wp_remote_get(
442 - 'https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[author]=' . $author . '&request[per_page]=20&request[fields][active_installs]=true'
458 + public function get_plugins_from_wporg( $author ) {
459 + $products = $this->safe_get(
460 + 'https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[author]=' . $author . '&request[per_page]=40&request[fields][active_installs]=true'
443 461 );
444 462 $products = json_decode( wp_remote_retrieve_body( $products ) );
445 463 if ( is_object( $products ) ) {
446 464 $products = isset( $products->plugins ) ? $products->plugins : array();