PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.8
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.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 3.10.4 All 148 releases
visualizer / vendor / codeinwp / themeisle-sdk / src / Modules / Recommendation.php

Recommendation.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.4.8, at vendor/codeinwp/themeisle-sdk/src/Modules/Recommendation.php

375 lines 9.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The class that exposes hooks for recommend.
4 *
5 * @package ThemeIsleSDK
6 * @subpackage Rollback
7 * @copyright Copyright (c) 2017, Marius Cristea
8 * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9 * @since 1.0.0
10 */
11
12 namespace ThemeisleSDK\Modules;
13
14 // Exit if accessed directly.
15 use ThemeisleSDK\Common\Abstract_Module;
16 use ThemeisleSDK\Product;
17
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit;
20 }
21
22 /**
23 * Expose endpoints for ThemeIsle SDK.
24 */
25 class Recommendation extends Abstract_Module {
26
27
28 /**
29 * Load module logic.
30 *
31 * @param Product $product Product to load.
32 */
33 public function load( $product ) {
34 $this->product = $product;
35 $this->setup_hooks();
36
37 return $this;
38 }
39
40 /**
41 * Setup endpoints.
42 */
43 private function setup_hooks() {
44 add_action( $this->product->get_key() . '_recommend_products', array( $this, 'render_products_box' ), 10, 4 );
45 add_action( 'admin_head', array( $this, 'enqueue' ) );
46 }
47
48 /**
49 * Check if we should load the module for this product.
50 *
51 * @param Product $product Product data.
52 *
53 * @return bool Should we load the module?
54 */
55 public function can_load( $product ) {
56 return true;
57 }
58
59 /**
60 * Render products box content.
61 *
62 * @param array $plugins_list - list of useful plugins (in slug => nicename format).
63 * @param array $themes_list - list of useful themes (in slug => nicename format).
64 * @param array $strings - list of translated strings.
65 * @param array $preferences - list of preferences.
66 */
67 function render_products_box( $plugins_list, $themes_list, $strings, $preferences = array() ) {
68
69 if ( empty( $plugins_list ) && empty( $themes_list ) ) {
70 return;
71 }
72
73 if ( ! empty( $plugins_list ) && ! current_user_can( 'install_plugins' ) ) {
74 return;
75 }
76
77 if ( ! empty( $themes_list ) && ! current_user_can( 'install_themes' ) ) {
78 return;
79 }
80
81 add_thickbox();
82
83 if ( ! empty( $themes_list ) ) {
84 $list = $this->get_themes( $themes_list, $preferences );
85
86 if ( has_action( $this->product->get_key() . '_recommend_products_theme_template' ) ) {
87 do_action( $this->product->get_key() . '_recommend_products_theme_template', $list, $strings, $preferences );
88 } else {
89 echo '<div class="recommend-product">';
90
91 foreach ( $list as $theme ) {
92 echo '<div class="plugin_box">';
93 echo ' <img class="theme-banner" src="' . $theme->screenshot_url . '">';
94 echo ' <div class="title-action-wrapper">';
95 echo ' <span class="plugin-name">' . esc_html( $theme->custom_name ) . '</span>';
96 if ( ! isset( $preferences['description'] ) || ( isset( $preferences['description'] ) && $preferences['description'] ) ) {
97 echo '<span class="plugin-desc">' . esc_html( substr( $theme->description, 0, strpos( $theme->description, '.' ) ) ) . '.</span>';
98 }
99 echo ' </div>';
100 echo '<div class="plugin-box-footer">';
101 echo ' <div class="button-wrap">';
102 echo ' <a class="button button-primary " href="' . esc_url( $theme->custom_url ) . '"><span class="dashicons dashicons-external"></span>' . esc_html( $strings['install'] ) . '</a>';
103 echo ' </div>';
104 echo ' </div>';
105 echo '</div>';
106 }
107
108 echo '</div>';
109 }
110 }
111 if ( ! empty( $plugins_list ) ) {
112 $list = $this->get_plugins( $plugins_list, $preferences );
113
114 if ( has_action( $this->product->get_key() . '_recommend_products_plugin_template' ) ) {
115 do_action( $this->product->get_key() . '_recommend_products_plugin_template', $list, $strings, $preferences );
116 } else {
117 echo '<div class="recommend-product">';
118
119 foreach ( $list as $current_plugin ) {
120 echo '<div class="plugin_box">';
121 echo ' <img class="plugin-banner" src="' . $current_plugin->custom_image . '">';
122 echo ' <div class="title-action-wrapper">';
123 echo ' <span class="plugin-name">' . esc_html( $current_plugin->custom_name ) . '</span>';
124 if ( ! isset( $preferences['description'] ) || ( isset( $preferences['description'] ) && $preferences['description'] ) ) {
125 echo '<span class="plugin-desc">' . esc_html( substr( $current_plugin->short_description, 0, strpos( $current_plugin->short_description, '.' ) ) ) . '. </span>';
126 }
127 echo ' </div>';
128 echo ' <div class="plugin-box-footer">';
129 echo ' <a class="button button-primary thickbox open-plugin-details-modal" href="' . esc_url( $current_plugin->custom_url ) . '"><span class="dashicons dashicons-external"></span>' . esc_html( $strings['install'] ) . '</a>';
130 echo ' </div>';
131 echo '</div>';
132 }
133
134 echo '</div>';
135 }
136 }
137
138 }
139
140 /**
141 * Collect all the information for the themes list.
142 *
143 * @param array $themes_list - list of useful themes (in slug => nicename format).
144 * @param array $preferences - list of preferences.
145 *
146 * @return array
147 */
148 private function get_themes( $themes_list, $preferences ) {
149 $list = array();
150 foreach ( $themes_list as $slug => $nicename ) {
151 $theme = $this->call_theme_api( $slug );
152 if ( ! $theme ) {
153 continue;
154 }
155
156 $url = add_query_arg(
157 array(
158 'theme' => $theme->slug,
159 ),
160 network_admin_url( 'theme-install.php' )
161 );
162
163 $name = empty( $nicename ) ? $theme->name : $nicename;
164
165 $theme->custom_url = $url;
166 $theme->custom_name = $name;
167
168 $list[] = $theme;
169 }
170
171 return $list;
172 }
173
174 /**
175 * Call theme api
176 *
177 * @param string $slug theme slug.
178 *
179 * @return array|mixed|object
180 */
181 private function call_theme_api( $slug ) {
182 $theme = get_transient( 'ti_theme_info_' . $slug );
183
184 if ( false !== $theme ) {
185 return $theme;
186 }
187
188 $products = wp_remote_get(
189 'https://api.wordpress.org/themes/info/1.1/?action=query_themes&request[theme]=' . $slug . '&request[per_page]=1'
190 );
191 $products = json_decode( wp_remote_retrieve_body( $products ) );
192 if ( is_object( $products ) ) {
193 $theme = $products->themes[0];
194 set_transient( 'ti_theme_info_' . $slug, $theme, 6 * HOUR_IN_SECONDS );
195 }
196
197 return $theme;
198 }
199
200 /**
201 * Collect all the information for the plugins list.
202 *
203 * @param array $plugins_list - list of useful plugins (in slug => nicename format).
204 * @param array $preferences - list of preferences.
205 *
206 * @return array
207 */
208 private function get_plugins( $plugins_list, $preferences ) {
209 $list = array();
210 foreach ( $plugins_list as $plugin => $nicename ) {
211 $current_plugin = $this->call_plugin_api( $plugin );
212
213 $name = empty( $nicename ) ? $current_plugin->name : $nicename;
214
215 $image = $current_plugin->banners['low'];
216 if ( isset( $preferences['image'] ) && 'icon' === $preferences['image'] ) {
217 $image = $current_plugin->icons['1x'];
218 }
219
220 $url = add_query_arg(
221 array(
222 'tab' => 'plugin-information',
223 'plugin' => $current_plugin->slug,
224 'TB_iframe' => true,
225 'width' => 800,
226 'height' => 800,
227 ),
228 network_admin_url( 'plugin-install.php' )
229 );
230
231 $current_plugin->custom_url = $url;
232 $current_plugin->custom_name = $name;
233 $current_plugin->custom_image = $image;
234
235 $list[] = $current_plugin;
236 }
237
238 return $list;
239 }
240
241 /**
242 * Call plugin api
243 *
244 * @param string $slug plugin slug.
245 *
246 * @return array|mixed|object
247 */
248 private function call_plugin_api( $slug ) {
249 include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
250
251 $call_api = get_transient( 'ti_plugin_info_' . $slug );
252
253 if ( false === $call_api ) {
254 $call_api = plugins_api(
255 'plugin_information',
256 array(
257 'slug' => $slug,
258 'fields' => array(
259 'downloaded' => false,
260 'rating' => false,
261 'description' => false,
262 'short_description' => true,
263 'donate_link' => false,
264 'tags' => false,
265 'sections' => true,
266 'homepage' => true,
267 'added' => false,
268 'last_updated' => false,
269 'compatibility' => false,
270 'tested' => false,
271 'requires' => false,
272 'downloadlink' => false,
273 'icons' => true,
274 'banners' => true,
275 ),
276 )
277 );
278 set_transient( 'ti_plugin_info_' . $slug, $call_api, 30 * MINUTE_IN_SECONDS );
279 }
280
281 return $call_api;
282 }
283
284 /**
285 * Load css and scripts for the plugin recommend page.
286 */
287 public function enqueue() {
288 $screen = get_current_screen();
289
290 if ( ! isset( $screen->id ) ) {
291 return;
292 }
293 if ( false === apply_filters( $this->product->get_key() . '_enqueue_recommend', false, $screen->id ) ) {
294 return;
295 }
296
297 ?>
298 <style type="text/css">
299 .recommend-product {
300 display: flex;
301 justify-content: space-between;
302 flex-wrap: wrap;
303 }
304
305 .recommend-product .theme-banner {
306 width:200px;
307 margin: auto;
308 }
309 .recommend-product .plugin-banner {
310 width: 100px;
311 margin: auto;
312 }
313
314 .recommend-product .plugin_box .button span{
315
316 margin-top: 2px;
317 margin-right: 7px;
318 }
319 .recommend-product .plugin_box .button{
320 margin-bottom:10px;
321 }
322 .recommend-product .plugin_box {
323 margin-bottom: 20px;
324 padding-top: 5px;
325 display: flex;
326 box-shadow: 0px 0px 10px -5px rgba(0,0,0,0.55);
327 background: #fff;
328 border-radius: 5px;
329 flex-direction: column;
330 justify-content: flex-start;
331 width: 95%;
332 }
333
334 .recommend-product .title-action-wrapper {
335 padding: 15px 20px 5px 20px;
336 }
337
338 .recommend-product .plugin-name {
339 font-size: 18px;
340 display: block;
341 white-space: nowrap;
342 text-overflow: ellipsis;
343 margin-bottom: 10px;
344 overflow: hidden;
345 line-height: normal;
346 }
347
348
349 .recommend-product .plugin-desc {
350 display: block;
351 margin-bottom: 10px;
352 font-size: 13px;
353 color: #777;
354 line-height: 1.6;
355 }
356
357 .recommend-product .button-wrap > div {
358 padding: 0;
359 margin: 0;
360 }
361
362 .plugin-box-footer {
363 display: flex;
364 justify-content: space-around;
365 vertical-align: middle;
366 align-items: center;
367 padding: 0px 10px 5px;
368 flex: 1;
369 margin-top: auto;
370 }
371 </style>
372 <?php
373 }
374 }
375