Skip to content

Commit 7cc1053

Browse files
authored
Create class-connekt-plugin-installer.php
1 parent 30f2d08 commit 7cc1053

File tree

1 file changed

+338
-0
lines changed

1 file changed

+338
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,338 @@
1+
<?php
2+
/**
3+
* Connekt Plugin Installer.
4+
*
5+
* @author Darren Cooney
6+
* @link https://github.com/dcooney/wordpress-plugin-installer
7+
* @link https://connekthq.com
8+
* @version 1.0.2
9+
*
10+
* @package Connekt_Plugin_Installer
11+
*/
12+
13+
if ( ! defined( 'ABSPATH' ) ) {
14+
exit;
15+
}
16+
17+
if ( ! defined( 'CNKT_INSTALLER_PATH' ) ) {
18+
define( 'CNKT_INSTALLER_PATH', plugins_url( '/', __FILE__ ) );
19+
}
20+
21+
if ( ! defined( 'CNKT_INSTALLER_VERSION' ) ) {
22+
define( 'CNKT_INSTALLER_VERSION', '1.0.2' );
23+
}
24+
25+
if ( ! class_exists( 'Connekt_Plugin_Installer' ) ) {
26+
27+
/**
28+
* Initiate the class.
29+
*/
30+
class Connekt_Plugin_Installer {
31+
32+
/**
33+
* Start installer functionality.
34+
*
35+
* @return void
36+
*/
37+
public function start() {
38+
add_action( 'cnkt_installer_enqueue_scripts', [ &$this, 'cnkt_installer_enqueue_scripts' ] );
39+
add_action( 'wp_ajax_cnkt_plugin_installer', [ &$this, 'cnkt_plugin_installer' ] );
40+
add_action( 'wp_ajax_cnkt_plugin_activation', [ &$this, 'cnkt_plugin_activation' ] );
41+
}
42+
43+
/**
44+
* Initialize the display of the plugins.
45+
*
46+
* @since 1.0
47+
* @param array $plugins The array plugin data for display.
48+
*/
49+
public static function init( $plugins ) {
50+
// Add the required plugin scripts.
51+
do_action( 'cnkt_installer_enqueue_scripts' );
52+
?>
53+
<div class="cnkt-plugin-installer">
54+
<?php
55+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
56+
57+
foreach ( $plugins as $plugin ) :
58+
59+
$button_classes = 'install button';
60+
$button_text = __( 'Install Now', 'cnkt-installer' );
61+
62+
$api = plugins_api(
63+
'plugin_information',
64+
[
65+
'slug' => sanitize_file_name( $plugin['slug'] ),
66+
'fields' => [
67+
'short_description' => true,
68+
'sections' => false,
69+
'requires' => false,
70+
'downloaded' => true,
71+
'last_updated' => false,
72+
'added' => false,
73+
'tags' => false,
74+
'compatibility' => false,
75+
'homepage' => false,
76+
'donate_link' => false,
77+
'icons' => true,
78+
'banners' => true,
79+
],
80+
]
81+
);
82+
83+
if ( ! is_wp_error( $api ) ) {
84+
$main_plugin_file = self::get_plugin_file( $plugin['slug'] ); // Get main plugin file.
85+
86+
// Plugin is installed.
87+
if ( $main_plugin_file ) {
88+
if ( is_plugin_active( $main_plugin_file ) ) {
89+
// plugin activated.
90+
$button_classes = 'button disabled';
91+
$button_text = __( 'Activated', 'cnkt-installer' );
92+
} else {
93+
// Installed, let's activate it.
94+
$button_classes = 'activate button button-primary';
95+
$button_text = __( 'Activate', 'cnkt-installer' );
96+
}
97+
}
98+
99+
// Send plugin data to template.
100+
self::render_template( $plugin, $api, $button_text, $button_classes );
101+
}
102+
endforeach;
103+
?>
104+
</div>
105+
<?php
106+
}
107+
108+
/**
109+
* Render display template for each plugin.
110+
*
111+
* @since 1.0
112+
* @param array $plugin Original data passed.
113+
* @param array $api Results from plugins_api.
114+
* @param string $button_text Text for the button.
115+
* @param string $button_classes Classnames for the button.
116+
*/
117+
public static function render_template( $plugin, $api, $button_text, $button_classes ) {
118+
?>
119+
<div class="plugin">
120+
<div class="plugin-wrap">
121+
<?php if ( isset( $api->icons ) && isset( $api->icons['1x'] ) ) { ?>
122+
<img src="<?php echo esc_attr( $api->icons['1x'] ); ?>" alt="">
123+
<?php } else { ?>
124+
<img src="https://s.w.org/plugins/geopattern-icon/classic-widgets.svg" alt="">
125+
<?php } ?>
126+
<h2><?php echo wp_kses_post( $api->name ); ?></h2>
127+
<p><?php echo wp_kses_post( $api->short_description ); ?></p>
128+
<p class="plugin-author"><?php esc_attr_e( 'By', 'cnkt-installer' ); ?> <?php echo wp_kses_post( $api->author ); ?></p>
129+
</div>
130+
<ul class="activation-row">
131+
<li>
132+
<a class="<?php echo esc_attr( $button_classes ); ?>" data-slug="<?php echo esc_attr( $api->slug ); ?>" data-name="<?php echo esc_attr( $api->name ); ?>" href="<?php echo get_admin_url(); ?>/update.php?action=install-plugin&amp;plugin=<?php echo $api->slug; ?>&amp;_wpnonce=<?php echo wp_create_nonce( 'install-plugin_' . $api->slug ); ?>">
133+
<?php echo esc_attr( $button_text ); ?>
134+
</a>
135+
</li>
136+
<li>
137+
<a href="https://wordpress.org/plugins/<?php echo esc_attr( $api->slug ); ?>/" target="_blank">
138+
<?php esc_attr_e( 'More Details', 'cnkt-installer' ); ?>
139+
</a>
140+
</li>
141+
</ul>
142+
</div>
143+
<?php
144+
}
145+
146+
/**
147+
* Ajax method for installing a plugin.
148+
*
149+
* @since 1.0
150+
* @return void|string The plugin data as JSON.
151+
*/
152+
public function cnkt_plugin_installer() {
153+
if ( ! current_user_can( 'install_plugins' ) ) {
154+
// Bail early if requirements not met.
155+
wp_die( esc_attr__( 'Sorry, you are not allowed to install plugins on this site.', 'cnkt-installer' ) );
156+
}
157+
158+
// Get POST data.
159+
$params = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
160+
$nonce = $params['nonce'];
161+
$plugin = $params['plugin'];
162+
163+
// Check our nonce, if they don't match then bounce!
164+
if ( ! wp_verify_nonce( $nonce, 'cnkt_installer_nonce' ) ) {
165+
wp_die( esc_attr__( 'Error - unable to verify nonce, please try again.', 'cnkt-installer' ) );
166+
}
167+
168+
// Required core libs for installation.
169+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
170+
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
171+
require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
172+
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
173+
174+
// Get plugin data.
175+
$api = plugins_api(
176+
'plugin_information',
177+
[
178+
'slug' => $plugin,
179+
'fields' => [
180+
'short_description' => false,
181+
'sections' => false,
182+
'requires' => false,
183+
'rating' => false,
184+
'ratings' => false,
185+
'downloaded' => false,
186+
'last_updated' => false,
187+
'added' => false,
188+
'tags' => false,
189+
'compatibility' => false,
190+
'homepage' => false,
191+
'donate_link' => false,
192+
],
193+
]
194+
);
195+
196+
$skin = new WP_Ajax_Upgrader_Skin();
197+
$upgrader = new Plugin_Upgrader( $skin );
198+
$upgrader->install( $api->download_link );
199+
200+
if ( $api->name ) {
201+
$status = 'success';
202+
$msg = $api->name . ' successfully installed.';
203+
} else {
204+
$status = 'failed';
205+
$msg = 'There was an error installing ' . $api->name . '.';
206+
}
207+
208+
$json = [
209+
'status' => $status,
210+
'msg' => $msg,
211+
];
212+
213+
wp_send_json( $json );
214+
}
215+
216+
217+
/**
218+
* Activate plugin via Ajax.
219+
*
220+
* @since 1.0
221+
* @return void|string The plugin data as JSON.
222+
*/
223+
public function cnkt_plugin_activation() {
224+
if ( ! current_user_can( 'install_plugins' ) ) {
225+
// Bail early if requirements not met.
226+
wp_die( esc_attr__( 'Sorry, you are not allowed to activate plugins on this site.', 'cnkt-installer' ) );
227+
}
228+
229+
// Get POST data.
230+
$params = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
231+
$nonce = $params['nonce'];
232+
$plugin = $params['plugin'];
233+
234+
// Check our nonce, if they don't match then bounce!
235+
if ( ! wp_verify_nonce( $nonce, 'cnkt_installer_nonce' ) ) {
236+
wp_die( esc_attr__( 'Error - unable to verify nonce, please try again.', 'cnkt-installer' ) );
237+
}
238+
239+
// Required core WP libs for activation.
240+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
241+
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
242+
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
243+
244+
// Get plugin data.
245+
$api = plugins_api(
246+
'plugin_information',
247+
[
248+
'slug' => $plugin,
249+
'fields' => [
250+
'short_description' => false,
251+
'sections' => false,
252+
'requires' => false,
253+
'rating' => false,
254+
'ratings' => false,
255+
'downloaded' => false,
256+
'last_updated' => false,
257+
'added' => false,
258+
'tags' => false,
259+
'compatibility' => false,
260+
'homepage' => false,
261+
'donate_link' => false,
262+
],
263+
]
264+
);
265+
266+
if ( $api->name ) {
267+
$main_plugin_file = self::get_plugin_file( $plugin );
268+
$status = 'success';
269+
if ( $main_plugin_file ) {
270+
activate_plugin( $main_plugin_file );
271+
$msg = $api->name . ' successfully activated.';
272+
}
273+
} else {
274+
$status = 'failed';
275+
$msg = 'There was an error activating ' . $api->name . '.';
276+
}
277+
278+
$json = [
279+
'status' => $status,
280+
'msg' => $msg,
281+
];
282+
wp_send_json( $json );
283+
}
284+
285+
/**
286+
* A method to get the main plugin file.
287+
*
288+
* @since 1.0
289+
* @param string $plugin_slug The slug of the plugin.
290+
* @return void|string The plugin file.
291+
*/
292+
public static function get_plugin_file( $plugin_slug ) {
293+
// Load core WP plugin lib.
294+
require_once ABSPATH . '/wp-admin/includes/plugin.php';
295+
296+
$plugins = get_plugins();
297+
if ( ! $plugins ) {
298+
return;
299+
}
300+
301+
foreach ( $plugins as $plugin_file => $plugin_info ) {
302+
// Get the basename of the plugin e.g. [askismet]/askismet.php.
303+
$slug = dirname( plugin_basename( $plugin_file ) );
304+
if ( $slug ) {
305+
if ( $slug === $plugin_slug ) {
306+
return $plugin_file;
307+
}
308+
}
309+
}
310+
}
311+
312+
/**
313+
* Enqueue admin scripts and scripts localization.
314+
*
315+
* @since 1.0
316+
*/
317+
public function cnkt_installer_enqueue_scripts() {
318+
wp_enqueue_script( 'plugin-installer', CNKT_INSTALLER_PATH . 'assets/installer.js', [ 'jquery' ], CNKT_INSTALLER_VERSION, false );
319+
wp_localize_script(
320+
'plugin-installer',
321+
'cnkt_installer_localize',
322+
[
323+
'ajax_url' => admin_url( 'admin-ajax.php' ),
324+
'admin_nonce' => wp_create_nonce( 'cnkt_installer_nonce' ),
325+
'install_now' => __( 'Are you sure you want to install this plugin?', 'cnkt-installer' ),
326+
'install_btn' => __( 'Install Now', 'cnkt-installer' ),
327+
'activate_btn' => __( 'Activate', 'cnkt-installer' ),
328+
'installed_btn' => __( 'Activated', 'cnkt-installer' ),
329+
]
330+
);
331+
wp_enqueue_style( 'plugin-installer', CNKT_INSTALLER_PATH . 'assets/installer.css', '', CNKT_INSTALLER_VERSION );
332+
}
333+
}
334+
335+
// Initialize the installer class.
336+
$cnkt_plugin_installer = new Connekt_Plugin_Installer();
337+
$cnkt_plugin_installer->start();
338+
}

0 commit comments

Comments
 (0)