441 lines
20 KiB
PHP
441 lines
20 KiB
PHP
|
<?php
|
||
|
namespace Hasthemes\HTContact_Form;
|
||
|
|
||
|
/**
|
||
|
* Recommended Plugins handlers class
|
||
|
* @version 1.0.2
|
||
|
*/
|
||
|
class Recommended_Plugins {
|
||
|
|
||
|
/**
|
||
|
* [$_instance]
|
||
|
* @var null
|
||
|
*/
|
||
|
private static $_instance = null;
|
||
|
|
||
|
/**
|
||
|
* [$plugins_allowedtags] allow tag
|
||
|
* @var array
|
||
|
*/
|
||
|
public $plugins_allowedtags = array(
|
||
|
'a' => array(
|
||
|
'href' => array(),
|
||
|
'title' => array(),
|
||
|
'target' => array(),
|
||
|
),
|
||
|
'abbr' => array( 'title' => array() ),
|
||
|
'acronym' => array( 'title' => array() ),
|
||
|
'code' => array(),
|
||
|
'pre' => array(),
|
||
|
'em' => array(),
|
||
|
'strong' => array(),
|
||
|
'ul' => array(),
|
||
|
'ol' => array(),
|
||
|
'li' => array(),
|
||
|
'p' => array(),
|
||
|
'br' => array(),
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Veriable Initialize
|
||
|
*/
|
||
|
public $text_domain = '';
|
||
|
public $parent_menu_slug = '';
|
||
|
public $menu_label = '';
|
||
|
public $menu_page_slug = '';
|
||
|
public $menu_capability = '';
|
||
|
public $menu_type = '';
|
||
|
public $menu_icon = '';
|
||
|
public $priority = '';
|
||
|
public $hook_suffix = '';
|
||
|
public $assets_url = '';
|
||
|
public $tab_list = [];
|
||
|
|
||
|
/**
|
||
|
* [instance] Initializes a singleton instance
|
||
|
* @return [Recommended_Plugins]
|
||
|
*/
|
||
|
public static function instance( $args = [] ) {
|
||
|
if ( is_null( self::$_instance ) ) {
|
||
|
self::$_instance = new self( $args );
|
||
|
}
|
||
|
return self::$_instance;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [__construct] Class construct
|
||
|
*/
|
||
|
function __construct( $args ) {
|
||
|
|
||
|
// Initialize properties
|
||
|
$this->text_domain = !empty( $args['text_domain'] ) ? $args['text_domain'] : 'htrp';
|
||
|
$this->parent_menu_slug = !empty( $args['parent_menu_slug'] ) ? $args['parent_menu_slug'] : 'plugins.php';
|
||
|
$this->menu_type = !empty( $args['menu_type'] ) ? $args['menu_type'] : 'submenu';
|
||
|
$this->menu_icon = !empty( $args['menu_icon'] ) ? $args['menu_icon'] : 'dashicons-plugins-checked';
|
||
|
$this->menu_label = !empty( $args['menu_label'] ) ? $args['menu_label'] : esc_html__( 'Recommendations', $this->text_domain );
|
||
|
$this->menu_capability = !empty( $args['menu_capability'] ) ? $args['menu_capability'] : 'manage_options';
|
||
|
$this->menu_page_slug = !empty( $args['menu_page_slug'] ) ? $args['menu_page_slug'] : $this->text_domain . '_extensions';
|
||
|
$this->priority = !empty( $args['priority'] ) ? $args['priority'] : 100;
|
||
|
$this->hook_suffix = !empty( $args['hook_suffix'] ) ? $args['hook_suffix'] : '';
|
||
|
$this->assets_url = !empty( $args['assets_url'] ) ? $args['assets_url'] : plugins_url( 'assets', __FILE__ );
|
||
|
$this->tab_list = !empty( $args['tab_list'] ) ? $args['assets_url'] : [];
|
||
|
|
||
|
|
||
|
add_action( 'admin_menu', [ $this, 'admin_menu' ], 20 );
|
||
|
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
|
||
|
|
||
|
// Ajax Action
|
||
|
add_action( 'wp_ajax_'.$this->text_domain.'_ajax_plugin_activation', [ $this, 'plugin_activation' ] );
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [admin_menu] Add Recommended Menu
|
||
|
* @return [void]
|
||
|
*/
|
||
|
public function admin_menu(){
|
||
|
|
||
|
if( $this->menu_type === 'submenu' ){
|
||
|
add_submenu_page(
|
||
|
$this->parent_menu_slug,
|
||
|
$this->menu_label,
|
||
|
$this->menu_label,
|
||
|
$this->menu_capability,
|
||
|
$this->menu_page_slug,
|
||
|
[ $this, 'render_html' ]
|
||
|
);
|
||
|
}else{
|
||
|
add_menu_page(
|
||
|
$this->menu_label,
|
||
|
$this->menu_label,
|
||
|
$this->menu_capability,
|
||
|
$this->menu_page_slug,
|
||
|
[ $this,'render_html' ],
|
||
|
$this->menu_icon,
|
||
|
30
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [enqueue_assets]
|
||
|
* @param [string] $hook_suffix Current page hook
|
||
|
* @return [void]
|
||
|
*/
|
||
|
public function enqueue_assets( $hook_suffix ) {
|
||
|
if( $this->hook_suffix ){
|
||
|
if( $this->hook_suffix == $hook_suffix ){
|
||
|
add_thickbox();
|
||
|
wp_enqueue_script( 'htrp-plugin-install-manager', $this->assets_url . '/js/plugins_install_manager.js', array('jquery','wp-util', 'updates'), '1.1.6', true );
|
||
|
}
|
||
|
} else {
|
||
|
add_thickbox();
|
||
|
wp_enqueue_script( 'htrp-plugin-install-manager', $this->assets_url . '/js/plugins_install_manager.js', array('jquery','wp-util', 'updates'), '1.1.6', true );
|
||
|
}
|
||
|
|
||
|
$localize_vars['ajaxurl'] = admin_url('admin-ajax.php');
|
||
|
$localize_vars['text_domain'] = sanitize_title_with_dashes( $this->text_domain );
|
||
|
$localize_vars['nonce'] = wp_create_nonce('ht-contactform-nonce');
|
||
|
$localize_vars['buttontxt'] = array(
|
||
|
'buynow' => esc_html__( 'Buy Now', $this->text_domain ),
|
||
|
'preview' => esc_html__( 'Preview', $this->text_domain ),
|
||
|
'installing' => esc_html__( 'Installing..', $this->text_domain ),
|
||
|
'activating' => esc_html__( 'Activating..', $this->text_domain ),
|
||
|
'active' => esc_html__( 'Activated', $this->text_domain ),
|
||
|
);
|
||
|
wp_localize_script( 'htrp-plugin-install-manager', 'htrp_params', $localize_vars );
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [add_new_tab]
|
||
|
* @param [void] set tab content
|
||
|
*/
|
||
|
public function add_new_tab( $tab_list ){
|
||
|
$this->tab_list[] = $tab_list;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [render_html]
|
||
|
* @return [void] Render HTML
|
||
|
*/
|
||
|
public function render_html(){
|
||
|
if ( ! function_exists('plugins_api') ){ include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); }
|
||
|
|
||
|
$htplugins_plugin_list = $this->get_plugins();
|
||
|
$palscode_plugin_list = $this->get_plugins( 'palscode' );
|
||
|
|
||
|
$plugin_list = array_merge( $htplugins_plugin_list, $palscode_plugin_list );
|
||
|
|
||
|
$prepare_plugin = array();
|
||
|
foreach ( $plugin_list as $plugin_key => $plugin ) {
|
||
|
$prepare_plugin[$plugin['slug']] = $plugin;
|
||
|
}
|
||
|
|
||
|
?>
|
||
|
<div class="wrap">
|
||
|
<h2><?php echo get_admin_page_title(); ?></h2>
|
||
|
<style>
|
||
|
.htrp-admin-tab-pane{
|
||
|
display: none;
|
||
|
}
|
||
|
.htrp-admin-tab-pane.htrp-active{
|
||
|
display: block;
|
||
|
}
|
||
|
.htrp-extension-admin-tab-area .filter-links li>a:focus, .htrp-extension-admin-tab-area .filter-links li>a:hover {
|
||
|
color: inherit;
|
||
|
box-shadow: none;
|
||
|
}
|
||
|
.filter-links .htrp-active{
|
||
|
box-shadow: none;
|
||
|
border-bottom: 4px solid #646970;
|
||
|
color: #1d2327;
|
||
|
}
|
||
|
.downloaded-count{
|
||
|
display: block;
|
||
|
margin-top:5px;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<div class="htrp-extension-admin-tab-area wp-filter">
|
||
|
<ul class="htrp-admin-tabs filter-links">
|
||
|
<?php
|
||
|
foreach( $this->tab_list as $tab ){
|
||
|
$active_class = isset( $tab['active'] ) && $tab['active'] ? 'htrp-active' : '';
|
||
|
?>
|
||
|
<li>
|
||
|
<a href="#<?php echo esc_attr( sanitize_title_with_dashes( $tab['title'] ) ) ?>" class="<?php echo esc_attr( $active_class ) ?>"><?php echo esc_html( $tab['title'] ) ?></a>
|
||
|
</li>
|
||
|
<?php
|
||
|
}
|
||
|
?>
|
||
|
</ul>
|
||
|
</div>
|
||
|
|
||
|
<?php
|
||
|
$plugins_type = '';
|
||
|
foreach( $this->tab_list as $tab ):
|
||
|
|
||
|
$active_class = isset( $tab['active'] ) && $tab['active'] ? 'htrp-active' : '';
|
||
|
$plugins = $tab['plugins'];
|
||
|
|
||
|
echo '<div id="'.esc_attr( sanitize_title_with_dashes( $tab['title'] ) ).'" class="htrp-admin-tab-pane '.esc_attr( $active_class ).'">';
|
||
|
foreach( $plugins as $plugin ):
|
||
|
|
||
|
$data = array(
|
||
|
'slug' => isset( $plugin['slug'] ) ? $plugin['slug'] : '',
|
||
|
'location' => isset( $plugin['location'] ) ? $plugin['slug'].'/'.$plugin['location'] : '',
|
||
|
'name' => isset( $plugin['name'] ) ? $plugin['name'] : '',
|
||
|
);
|
||
|
$title = wp_kses( $plugin['name'], $this->plugins_allowedtags );
|
||
|
|
||
|
if( array_key_exists( $plugin['slug'], $prepare_plugin ) ){
|
||
|
$plugins_type = 'free';
|
||
|
$image_url = $this->plugin_icon( $plugins_type, $prepare_plugin[$data['slug']]['icons'] );
|
||
|
$description = strip_tags( $prepare_plugin[$data['slug']]['description'] );
|
||
|
$author_name = wp_kses( $prepare_plugin[$data['slug']]['author'], $this->plugins_allowedtags );
|
||
|
$details_link = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] .'&TB_iframe=true&width=772&height=577');
|
||
|
$target = '_self';
|
||
|
$modal_class = 'class="thickbox open-plugin-details-modal"';
|
||
|
|
||
|
}else{
|
||
|
$plugins_type = 'pro';
|
||
|
$image_url = $this->plugin_icon( $plugins_type, $plugin['slug'] );
|
||
|
$description = isset( $plugin['description'] ) ? $plugin['description'] : '';
|
||
|
$author_name = esc_html__( 'HasTheme', $this->text_domain );
|
||
|
$author_link = isset( $plugin['author_link'] ) ? $plugin['author_link'] : '';
|
||
|
$details_link = isset( $plugin['link'] ) ? $plugin['link'] : '';
|
||
|
$button_text = esc_html__('Buy Now', $this->text_domain );
|
||
|
$button_classes = 'button button-primary';
|
||
|
$target = '_blank';
|
||
|
$modal_class = '';
|
||
|
}
|
||
|
|
||
|
if ( ! is_wp_error( $data ) ):
|
||
|
|
||
|
// Installed but Inactive.
|
||
|
if ( file_exists( WP_PLUGIN_DIR . '/' . $data['location'] ) && is_plugin_inactive( $data['location'] ) ) {
|
||
|
|
||
|
$button_classes = 'button activate-now button-primary';
|
||
|
$button_text = esc_html__( 'Activate', $this->text_domain );
|
||
|
|
||
|
// Not Installed.
|
||
|
} elseif ( ! file_exists( WP_PLUGIN_DIR . '/' . $data['location'] ) ) {
|
||
|
|
||
|
$button_classes = 'button install-now';
|
||
|
$button_text = esc_html__( 'Install Now', $this->text_domain );
|
||
|
|
||
|
// Active.
|
||
|
} else {
|
||
|
$button_classes = 'button disabled';
|
||
|
$button_text = esc_html__( 'Activated', $this->text_domain );
|
||
|
}
|
||
|
|
||
|
?>
|
||
|
<div class="plugin-card htrp-plugin-<?php echo sanitize_html_class( $plugin['slug'] ); ?>">
|
||
|
<div class="plugin-card-top">
|
||
|
<div class="name column-name" style="margin-right: 0;">
|
||
|
<h3>
|
||
|
<a href="<?php echo esc_url( $details_link ) ?>" target="<?php echo esc_attr( $target ) ?>" <?php echo $modal_class; ?>>
|
||
|
<?php echo esc_html( $title ) ?>
|
||
|
<img src="<?php echo esc_url( $image_url ) ?>" class="plugin-icon" alt="<?php echo esc_attr( $title ) ?>">
|
||
|
</a>
|
||
|
</h3>
|
||
|
</div>
|
||
|
<div class="desc column-description" style="margin-right: 0;">
|
||
|
<p><?php echo wp_trim_words( $description, 23, '....'); ?></p>
|
||
|
<p class="authors">
|
||
|
<cite><?php echo esc_html__( 'By ', $this->text_domain ); ?>
|
||
|
<?php if( $plugins_type == 'free' ): ?>
|
||
|
<?php echo $author_name; ?>
|
||
|
<?php else: ?>
|
||
|
<a href="<?php echo esc_url( $author_link ); ?>" target="_blank" ><?php echo $author_name; ?></a>
|
||
|
<?php endif; ?>
|
||
|
</cite>
|
||
|
</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="plugin-card-bottom">
|
||
|
<div class="column-updated">
|
||
|
<?php
|
||
|
if (! file_exists( WP_PLUGIN_DIR . '/' . $data['location'] ) && $plugins_type == 'pro' ) {
|
||
|
echo '<a class="button button-primary" href="'.esc_url( $details_link ).'" target="'.esc_attr( $target ).'">'.esc_html__( 'Buy Now', $this->text_domain ).'</a>';
|
||
|
}else{
|
||
|
?>
|
||
|
<button class="<?php echo esc_attr($button_classes); ?>" data-pluginopt='<?php echo wp_json_encode( $data ); ?>'><?php echo wp_kses_post( $button_text ); ?></button>
|
||
|
|
||
|
<?php } ?>
|
||
|
</div>
|
||
|
<div class="column-downloaded">
|
||
|
<a href="<?php echo esc_url( $details_link ) ?>" target="<?php echo esc_attr( $target ) ?>" <?php echo $modal_class; ?>><?php echo esc_html__('More Details', $this->text_domain) ?></a>
|
||
|
<span class="downloaded-count">
|
||
|
<?php
|
||
|
if( $plugins_type == 'free' ){
|
||
|
/* translators: %s: Number of installations. */
|
||
|
printf( __( '%s Active Installations' ), $this->active_install_count( $prepare_plugin[$data['slug']]['active_installs'] ) );
|
||
|
}
|
||
|
?>
|
||
|
</span>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<?php
|
||
|
endif;
|
||
|
endforeach;
|
||
|
echo '</div>';
|
||
|
|
||
|
endforeach;
|
||
|
?>
|
||
|
|
||
|
</div>
|
||
|
<?php
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [get_plugins] Get plugin from wp.org API
|
||
|
* @param string $username wo.org username
|
||
|
* @return [array] plugin list
|
||
|
*/
|
||
|
public function get_plugins( $username = 'htplugins' ){
|
||
|
$transient_var = 'htrp_htplugins_list_'.$username;
|
||
|
$org_plugins_list = get_transient( $transient_var );
|
||
|
|
||
|
if ( false === $org_plugins_list ) {
|
||
|
$plugins_list_by_author = plugins_api( 'query_plugins', array( 'author' => $username, 'per_page' => 100 ) );
|
||
|
set_transient( $transient_var, $plugins_list_by_author->plugins, 1 * WEEK_IN_SECONDS );
|
||
|
$org_plugins_list = $plugins_list_by_author->plugins;
|
||
|
}
|
||
|
|
||
|
return $org_plugins_list;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [plugin_icon] Generate plugin icon
|
||
|
* @param string $type plugin type
|
||
|
* @param [array|string] $icon
|
||
|
* @return [URL] icon URL
|
||
|
*/
|
||
|
public function plugin_icon( $type, $icon ){
|
||
|
if( $type === 'free' ){
|
||
|
if ( ! empty( $icon['svg'] ) ) {
|
||
|
$plugin_icon_url = $icon['svg'];
|
||
|
} elseif ( ! empty( $icon['2x'] ) ) {
|
||
|
$plugin_icon_url = $icon['2x'];
|
||
|
} elseif ( ! empty( $icon['1x'] ) ) {
|
||
|
$plugin_icon_url = $icon['1x'];
|
||
|
} else {
|
||
|
$plugin_icon_url = $icon['default'];
|
||
|
}
|
||
|
}else{
|
||
|
$plugin_icon_url = $this->assets_url .'/images/extensions/'.$icon.'.png';
|
||
|
}
|
||
|
|
||
|
return $plugin_icon_url;
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [active_install_count] Manage Active install count
|
||
|
* @param [int] $active_installs
|
||
|
* @return [string]
|
||
|
*/
|
||
|
public function active_install_count( $active_installs ){
|
||
|
|
||
|
if ( $active_installs >= 1000000 ) {
|
||
|
$active_installs_millions = floor( $active_installs / 1000000 );
|
||
|
$active_installs_text = sprintf(
|
||
|
/* translators: %s: Number of millions. */
|
||
|
_nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ),
|
||
|
number_format_i18n( $active_installs_millions )
|
||
|
);
|
||
|
} elseif ( 0 === $active_installs ) {
|
||
|
$active_installs_text = _x( 'Less Than 10', 'Active plugin installations' );
|
||
|
} else {
|
||
|
$active_installs_text = number_format_i18n( $active_installs ) . '+';
|
||
|
}
|
||
|
return $active_installs_text;
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* [plugin_activation] Plugin activation ajax callable function
|
||
|
* @return [JSON]
|
||
|
*/
|
||
|
public function plugin_activation() {
|
||
|
$nonce = sanitize_text_field($_POST['nonce']);
|
||
|
if(wp_verify_nonce($nonce, 'ht-contactform-nonce')) {
|
||
|
|
||
|
if ( ! current_user_can( 'install_plugins' ) || ! isset( $_POST['location'] ) || ! sanitize_text_field($_POST['location']) ) {
|
||
|
wp_send_json_error(
|
||
|
array(
|
||
|
'success' => false,
|
||
|
'message' => esc_html__( 'Plugin Not Found', $this->text_domain ),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$plugin_location = ( isset( $_POST['location'] ) ) ? sanitize_text_field( $_POST['location'] ) : '';
|
||
|
$activate = activate_plugin( $plugin_location, '', false, true );
|
||
|
|
||
|
if ( is_wp_error( $activate ) ) {
|
||
|
wp_send_json_error(
|
||
|
array(
|
||
|
'success' => false,
|
||
|
'message' => $activate->get_error_message(),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
wp_send_json_success(
|
||
|
array(
|
||
|
'success' => true,
|
||
|
'message' => esc_html__( 'Plugin Successfully Activated', $this->text_domain ),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|