oont-contents/plugins/insert-headers-and-footers/includes/admin/class-wpcode-suggested-plugins.php
2025-02-08 15:10:23 +01:00

387 lines
12 KiB
PHP

<?php
/**
* Suggest other relevant free plugins to our users.
*
* @package WPCode
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class WPCode_Suggested_Plugins
*/
class WPCode_Suggested_Plugins {
/**
* WPCode_Suggested_Plugins constructor.
*/
public function __construct() {
$this->hooks();
}
/**
* Hooks for the class.
*/
public function hooks() {
add_action( 'wp_ajax_wpcode_install_plugin', array( $this, 'install_plugin' ) );
// Maybe suggest plugins to the current user.
add_action( 'admin_init', array( $this, 'maybe_suggest_plugins' ) );
}
/**
* Get all plugins that we suggest.
*
* @return array
*/
public static function all_plugins() {
$plugins = array(
'duplicator' => array(
'name' => 'Duplicator',
'description' => esc_html__( 'Easy, Fast and Secure WordPress and Website Migration.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/duplicator.zip',
'slug' => 'duplicator/duplicator.php',
'pro_slug' => 'duplicator-pro/duplicator-pro.php',
'icon' => 'icon-duplicator.png',
'suggested' => true,
'library' => false,
),
'search-replace-wpcode' => array(
'name' => 'Search & Replace Everything',
'description' => esc_html__( 'Replace text across your database or media uploads in a single plugin.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/search-replace-wpcode.zip',
'slug' => 'search-replace-wpcode/wsrw.php',
'pro_slug' => 'search-replace-wpcode-pro/wsrw-premium.php',
'icon' => 'icon-search-replace-wpcode.png',
'suggested' => true,
'library' => false,
),
'wp-mail-smtp' => array(
'name' => 'WP Mail SMTP',
'description' => esc_html__( 'Making Email Deliverability Easy for WordPress', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
'slug' => 'wp-mail-smtp/wp_mail_smtp.php',
'pro_slug' => 'wp-mail-smtp-pro/wp_mail_smtp_pro.php',
'icon' => 'icon-wp-mail-smtp.png',
'suggested' => true,
'library' => false,
),
'all-in-one-seo-pack' => array(
'name' => 'All in One SEO Pack',
'description' => esc_html__( 'Powerful SEO Plugin to Boost SEO Rankings & Increase Traffic.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip',
'slug' => 'all-in-one-seo-pack/all_in_one_seo_pack.php',
'pro_slug' => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
'icon' => 'icon-all-in-one-seo-pack.png',
'suggested' => true,
'library' => true,
),
'wpforms' => array(
'name' => 'WPForms',
'description' => esc_html__( 'The Best Drag & Drop WordPress Form Builder.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip',
'slug' => 'wpforms-lite/wpforms.php',
'pro_slug' => 'wpforms/wpforms.php',
'icon' => 'icon-wpforms.png',
'suggested' => true,
'library' => true,
),
'uncanny-automator' => array(
'name' => 'Uncanny Automator',
'description' => esc_html__( 'Connect your WordPress plugins together and create automated workflows.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/uncanny-automator.zip',
'slug' => 'uncanny-automator/uncanny-automator.php',
'pro_slug' => 'uncanny-automator-pro/uncanny-automator-pro.php',
'icon' => 'icon-uncanny-automator.png',
'suggested' => true,
'library' => false,
),
'easy-digital-downloads' => array(
'name' => 'Easy Digital Downloads',
'description' => esc_html__( 'The easiest way to sell digital products with WordPress.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/easy-digital-downloads.zip',
'slug' => 'easy-digital-downloads/easy-digital-downloads.php',
'pro_slug' => 'easy-digital-downloads-pro/easy-digital-downloads.php',
'icon' => 'icon-edd.png',
'suggested' => false,
'library' => true,
),
'charitable' => array(
'name' => 'Charitable',
'description' => esc_html__( 'Raise more money for your cause with the most powerful WordPress donation and fundraising plugin.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/charitable.zip',
'slug' => 'charitable/charitable.php',
'pro_slug' => 'charitable/charitable.php',
'icon' => 'icon-charitable.jpg',
'suggested' => false,
'library' => true,
),
'wp-simple-pay' => array(
'name' => 'WP Simple Pay',
'description' => esc_html__( 'Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart.', 'insert-headers-and-footers' ),
'url' => 'https://downloads.wordpress.org/plugin/stripe.zip',
'slug' => 'stripe/stripe-checkout.php',
'pro_slug' => 'wp-simple-pay-pro-3/simple-pay.php',
'icon' => 'icon-wp-simple-pay.png',
'suggested' => false,
'library' => true,
),
);
return $plugins;
}
/**
* Get a list of plugins to suggest.
*
* @param int $count How many plugins to suggest.
*
* @return array
*/
public function get_suggested_plugins( $count = 3 ) {
$plugins = self::all_plugins();
// Let's loop through all the plugins and see which are installed already and only suggest the ones that are not. We should check for the pro version for each one.
$suggested_plugins = array();
foreach ( $plugins as $slug => $plugin ) {
if ( $count <= count( $suggested_plugins ) ) {
break;
}
if ( ! $plugin['suggested'] ) {
continue;
}
if ( ! $this->is_plugin_installed( $plugin['slug'] ) && ! $this->is_plugin_installed( $plugin['pro_slug'] ) ) {
$suggested_plugins[ $slug ] = $plugin;
}
}
return $suggested_plugins;
}
/**
* Get a list of plugins that have a library integration so we can show them in the plugin snippets page.
*
* @return array
*/
public static function get_library_plugins() {
$plugins = self::all_plugins();
// Filter out just the plugins that have "library" true.
return array_filter(
$plugins,
function ( $plugin ) {
return $plugin['library'];
}
);
}
/**
* Check if a plugin is installed.
*
* @param string $slug The plugin slug.
*
* @return bool
*/
public function is_plugin_installed( $slug ) {
$installed_plugins = array_keys( get_plugins() );
return in_array( $slug, $installed_plugins, true );
}
/**
* AJAX callback to install a plugin.
*
* @return void
*/
public function install_plugin() {
check_ajax_referer( 'wpcode_admin' );
// If the current user can't install plugins they should not be trying this.
if ( ! current_user_can( 'install_plugins' ) ) {
wp_send_json_error();
}
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/template.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php';
require_once ABSPATH . 'wp-admin/includes/screen.php';
$allowed_plugins = self::all_plugins();
$slug = isset( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : '';
if ( ! array_key_exists( $slug, $allowed_plugins ) ) {
wp_send_json_error();
}
$plugin_info = $allowed_plugins[ $slug ];
// Set the current screen to avoid undefined notices.
set_current_screen( 'toplevel_page_wpcode' );
// Do not allow WordPress to search/download translations, as this will break JS output.
remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
// Let's check if the plugin is already installed.
if ( is_plugin_active( $plugin_info['slug'] ) ) {
wp_send_json_success(
array(
'msg' => esc_html__( 'Plugin already installed and activated.', 'insert-headers-and-footers' ),
)
);
}
// Check if the Pro plugin is available first.
if ( $this->is_plugin_installed( $plugin_info['pro_slug'] ) ) {
activate_plugin( $plugin_info['pro_slug'] );
wp_send_json_success(
array(
'msg' => esc_html__( 'Plugin activated.', 'insert-headers-and-footers' ),
)
);
}
if ( $this->is_plugin_installed( $plugin_info['slug'] ) ) {
activate_plugin( $plugin_info['slug'] );
wp_send_json_success(
array(
'msg' => esc_html__( 'Plugin activated.', 'insert-headers-and-footers' ),
)
);
}
wpcode_require_upgrader();
// Create the plugin upgrader with our custom skin.
$installer = new Plugin_Upgrader( new WPCode_Skin() );
$installer->install( $allowed_plugins[ $slug ]['url'] );
// Flush the cache and return the newly installed plugin basename.
wp_cache_flush();
$plugin_basename = $installer->plugin_info();
if ( ! $plugin_basename ) {
wp_send_json_error();
}
// Activate the plugin silently.
$activated = activate_plugin( $plugin_basename );
if ( is_wp_error( $activated ) ) {
wp_send_json_error();
}
wp_send_json_success(
array(
'message' => esc_html__( 'Plugin installed and activated.', 'insert-headers-and-footers' ),
)
);
}
/**
* Maybe suggest plugins to the current user.
*/
public function maybe_suggest_plugins() {
if ( ! is_super_admin() || ! current_user_can( 'install_plugins' ) ) {
return;
}
// Verify that we can do a check to suggest plugins.
$notices = get_option( 'wpcode_admin_notices', array() );
$time = time();
$load = false;
if ( empty( $notices['suggest_plugins'] ) ) {
$notices['suggest_plugins'] = array(
'time' => $time,
'dismissed' => false,
);
update_option( 'wpcode_admin_notices', $notices );
return;
}
// Check if it has been dismissed or not.
if (
( isset( $notices['suggest_plugins']['dismissed'] ) &&
! $notices['suggest_plugins']['dismissed'] ) &&
(
isset( $notices['suggest_plugins']['time'] ) &&
( ( $notices['suggest_plugins']['time'] + DAY_IN_SECONDS ) <= $time )
)
) {
$load = true;
}
// If we cannot load, return early.
if ( ! $load ) {
return;
}
add_action( 'admin_head', array( $this, 'suggest_plugins' ) );
}
/**
* Suggest plugins to the current user.
*/
public function suggest_plugins() {
// Let's make sure we are on a wpcode screen using get_current_screen.
$screen = get_current_screen();
if ( ! $screen || 'toplevel_page_wpcode' !== $screen->id ) {
return;
}
// Fetch when plugin was initially installed.
$activated = get_option( 'ihaf_activated', array() );
if ( ! empty( $activated['wpcode'] ) ) {
// Only continue if plugin has been installed for at least 21 days.
if ( ( $activated['wpcode'] + ( DAY_IN_SECONDS * 21 ) ) > time() ) {
return;
}
} else {
$activated['wpcode'] = time();
update_option( 'ihaf_activated', $activated );
return;
}
$suggested_plugins = $this->get_suggested_plugins();
if ( empty( $suggested_plugins ) ) {
return;
}
ob_start();
?>
<p class="wpcode-suggestions-title"><?php esc_html_e( 'Enjoying WPCode? Check out some of our other top-rated FREE plugins:', 'insert-headers-and-footers' ); ?></p>
<div class="wpcode-plugin-suggestions">
<?php foreach ( $suggested_plugins as $slug => $plugin ) { ?>
<div class="wpcode-plugin-suggestion-plugin">
<div class="wpcode-plugin-suggestion-plugin-icon">
<img width="72" src="<?php echo esc_url( add_query_arg( 'v', WPCODE_VERSION, WPCODE_PLUGIN_URL . 'admin/images/' . $plugin['icon'] ) ); ?>" alt="<?php echo esc_attr( $plugin['name'] ); ?>"/>
</div>
<div class="wpcode-plugin-suggesion-plugin-text">
<h3><?php echo esc_html( $plugin['name'] ); ?></h3>
<p><?php echo esc_html( $plugin['description'] ); ?></p>
<button type=" button" class="wpcode-button wpcode-button-secondary wpcode-button-install-plugin" data-slug="<?php echo esc_attr( $slug ); ?>"><?php esc_html_e( 'Install Plugin', 'insert-headers-and-footers' ); ?></button>
</div>
</div>
<?php } ?>
</div>
<?php
WPCode_Notice::info(
ob_get_clean(),
array(
'dismiss' => WPCode_Notice::DISMISS_GLOBAL,
'slug' => 'suggest_plugins',
'autop' => false,
'class' => 'wpcode-suggest-plugins-notice',
)
);
}
}