',
$color,
$item['available_version']
);
}
if ( empty( $output ) ) {
return ' '; // Let's not break the table layout.
} else {
return implode( "\n", $output );
}
}
/**
* Sets default message within the plugins table if no plugins
* are left for interaction.
*
* Hides the menu item to prevent the user from clicking and
* getting a permissions error.
*
* @since 2.2.0
*/
public function no_items() {
echo esc_html__( 'No plugins to install, update or activate.', 'tgmpa' ) . ' ' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '';
echo '';
}
/**
* Output all the column information within the table.
*
* @since 2.2.0
*
* @return array $columns The column names.
*/
public function get_columns() {
$columns = array(
'cb' => '',
'plugin' => __( 'Plugin', 'tgmpa' ),
'source' => __( 'Source', 'tgmpa' ),
'type' => __( 'Type', 'tgmpa' ),
);
if ( 'all' === $this->view_context || 'update' === $this->view_context ) {
$columns['version'] = __( 'Version', 'tgmpa' );
$columns['status'] = __( 'Status', 'tgmpa' );
}
return apply_filters( 'tgmpa_table_columns', $columns );
}
/**
* Get name of default primary column
*
* @since 2.5.0 / WP 4.3+ compatibility
* @access protected
*
* @return string
*/
protected function get_default_primary_column_name() {
return 'plugin';
}
/**
* Get the name of the primary column.
*
* @since 2.5.0 / WP 4.3+ compatibility
* @access protected
*
* @return string The name of the primary column.
*/
protected function get_primary_column_name() {
if ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) {
return parent::get_primary_column_name();
} else {
return $this->get_default_primary_column_name();
}
}
/**
* Get the actions which are relevant for a specific plugin row.
*
* @since 2.5.0
*
* @param array $item Array of item data.
* @return array Array with relevant action links.
*/
protected function get_row_actions( $item ) {
$actions = array();
$action_links = array();
// Display the 'Install' action link if the plugin is not yet available.
if ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['install'] = __( 'Install %2$s', 'tgmpa' );
} else {
// Display the 'Update' action link if an update is available and WP complies with plugin minimum.
if ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['update'] = __( 'Update %2$s', 'tgmpa' );
}
// Display the 'Activate' action link, but only if the plugin meets the minimum version.
if ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['activate'] = __( 'Activate %2$s', 'tgmpa' );
}
}
// Create the actual links.
foreach ( $actions as $action => $text ) {
$nonce_url = wp_nonce_url(
add_query_arg(
array(
'plugin' => urlencode( $item['slug'] ),
'tgmpa-' . $action => $action . '-plugin',
),
$this->tgmpa->get_tgmpa_url()
),
'tgmpa-' . $action,
'tgmpa-nonce'
);
$action_links[ $action ] = sprintf(
'' . esc_html( $text ) . '', // $text contains the second placeholder.
esc_url( $nonce_url ),
'' . esc_html( $item['sanitized_plugin'] ) . ''
);
}
$prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : '';
return apply_filters( "tgmpa_{$prefix}plugin_action_links", array_filter( $action_links ), $item['slug'], $item, $this->view_context );
}
/**
* Generates content for a single row of the table.
*
* @since 2.5.0
*
* @param object $item The current item.
*/
public function single_row( $item ) {
parent::single_row( $item );
/**
* Fires after each specific row in the TGMPA Plugins list table.
*
* The dynamic portion of the hook name, `$item['slug']`, refers to the slug
* for the plugin.
*
* @since 2.5.0
*/
do_action( "tgmpa_after_plugin_row_{$item['slug']}", $item['slug'], $item, $this->view_context );
}
/**
* Show the upgrade notice below a plugin row if there is one.
*
* @since 2.5.0
*
* @see /wp-admin/includes/update.php
*
* @param string $slug Plugin slug.
* @param array $item The information available in this table row.
* @return null Return early if upgrade notice is empty.
*/
public function wp_plugin_update_row( $slug, $item ) {
if ( empty( $item['upgrade_notice'] ) ) {
return;
}
echo '
',
esc_html__( 'Upgrade message from the plugin author:', 'tgmpa' ),
' ', wp_kses_data( $item['upgrade_notice'] ), '
';
}
/**
* Extra controls to be displayed between bulk actions and pagination.
*
* @since 2.5.0
*
* @param string $which 'top' or 'bottom' table navigation.
*/
public function extra_tablenav( $which ) {
if ( 'bottom' === $which ) {
$this->tgmpa->show_tgmpa_version();
}
}
/**
* Defines the bulk actions for handling registered plugins.
*
* @since 2.2.0
*
* @return array $actions The bulk actions for the plugin install table.
*/
public function get_bulk_actions() {
$actions = array();
if ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) {
if ( current_user_can( 'install_plugins' ) ) {
$actions['tgmpa-bulk-install'] = __( 'Install', 'tgmpa' );
}
}
if ( 'install' !== $this->view_context ) {
if ( current_user_can( 'update_plugins' ) ) {
$actions['tgmpa-bulk-update'] = __( 'Update', 'tgmpa' );
}
if ( current_user_can( 'activate_plugins' ) ) {
$actions['tgmpa-bulk-activate'] = __( 'Activate', 'tgmpa' );
}
}
return $actions;
}
/**
* Processes bulk installation and activation actions.
*
* The bulk installation process looks for the $_POST information and passes that
* through if a user has to use WP_Filesystem to enter their credentials.
*
* @since 2.2.0
*/
public function process_bulk_actions() {
// Bulk installation process.
if ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) {
check_admin_referer( 'bulk-' . $this->_args['plural'] );
$install_type = 'install';
if ( 'tgmpa-bulk-update' === $this->current_action() ) {
$install_type = 'update';
}
$plugins_to_install = array();
// Did user actually select any plugins to install/update ?
if ( empty( $_POST['plugin'] ) ) {
if ( 'install' === $install_type ) {
$message = __( 'No plugins were selected to be installed. No action taken.', 'tgmpa' );
} else {
$message = __( 'No plugins were selected to be updated. No action taken.', 'tgmpa' );
}
echo '
', esc_html( $message ), '
';
return false;
}
if ( is_array( $_POST['plugin'] ) ) {
$plugins_to_install = (array) $_POST['plugin'];
} elseif ( is_string( $_POST['plugin'] ) ) {
// Received via Filesystem page - un-flatten array (WP bug #19643).
$plugins_to_install = explode( ',', $_POST['plugin'] );
}
// Sanitize the received input.
$plugins_to_install = array_map( 'urldecode', $plugins_to_install );
$plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install );
// Validate the received input.
foreach ( $plugins_to_install as $key => $slug ) {
// Check if the plugin was registered with TGMPA and remove if not.
if ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) {
unset( $plugins_to_install[ $key ] );
continue;
}
// For install: make sure this is a plugin we *can* install and not one already installed.
if ( 'install' === $install_type && true === $this->tgmpa->is_plugin_installed( $slug ) ) {
unset( $plugins_to_install[ $key ] );
}
// For updates: make sure this is a plugin we *can* update (update available and WP version ok).
if ( 'update' === $install_type && false === $this->tgmpa->is_plugin_updatetable( $slug ) ) {
unset( $plugins_to_install[ $key ] );
}
}
// No need to proceed further if we have no plugins to handle.
if ( empty( $plugins_to_install ) ) {
if ( 'install' === $install_type ) {
$message = __( 'No plugins are available to be installed at this time.', 'tgmpa' );
} else {
$message = __( 'No plugins are available to be updated at this time.', 'tgmpa' );
}
echo '
', esc_html( $message ), '
';
return false;
}
// Pass all necessary information if WP_Filesystem is needed.
$url = wp_nonce_url(
$this->tgmpa->get_tgmpa_url(),
'bulk-' . $this->_args['plural']
);
// Give validated data back to $_POST which is the only place the filesystem looks for extra fields.
$_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643.
$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.
$fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem.
if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) {
return true; // Stop the normal page form from displaying, credential request form will be shown.
}
// Now we have some credentials, setup WP_Filesystem.
if ( ! WP_Filesystem( $creds ) ) {
// Our credentials were no good, ask the user for them again.
request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields );
return true;
}
/* If we arrive here, we have the filesystem */
// Store all information in arrays since we are processing a bulk installation.
$names = array();
$sources = array(); // Needed for installs.
$file_paths = array(); // Needed for upgrades.
$to_inject = array(); // Information to inject into the update_plugins transient.
// Prepare the data for validated plugins for the install/upgrade.
foreach ( $plugins_to_install as $slug ) {
$name = $this->tgmpa->plugins[ $slug ]['name'];
$source = $this->tgmpa->get_download_url( $slug );
if ( ! empty( $name ) && ! empty( $source ) ) {
$names[] = $name;
switch ( $install_type ) {
case 'install':
$sources[] = $source;
break;
case 'update':
$file_paths[] = $this->tgmpa->plugins[ $slug ]['file_path'];
$to_inject[ $slug ] = $this->tgmpa->plugins[ $slug ];
$to_inject[ $slug ]['source'] = $source;
break;
}
}
}
unset( $slug, $name, $source );
// Create a new instance of TGMPA_Bulk_Installer.
$installer = new TGMPA_Bulk_Installer(
new TGMPA_Bulk_Installer_Skin(
array(
'url' => esc_url_raw( $this->tgmpa->get_tgmpa_url() ),
'nonce' => 'bulk-' . $this->_args['plural'],
'names' => $names,
'install_type' => $install_type,
)
)
);
// Wrap the install process with the appropriate HTML.
echo '
',
'
', esc_html( get_admin_page_title() ), '
';
// Process the bulk installation submissions.
add_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 );
if ( 'tgmpa-bulk-update' === $this->current_action() ) {
// Inject our info into the update transient.
$this->tgmpa->inject_update_info( $to_inject );
$installer->bulk_upgrade( $file_paths );
} else {
$installer->bulk_install( $sources );
}
remove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1 );
echo '
';
return true;
}
// Bulk activation process.
if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
check_admin_referer( 'bulk-' . $this->_args['plural'] );
// Did user actually select any plugins to activate ?
if ( empty( $_POST['plugin'] ) ) {
echo '
', esc_html__( 'No plugins were selected to be activated. No action taken.', 'tgmpa' ), '
';
return false;
}
// Grab plugin data from $_POST.
$plugins = array();
if ( isset( $_POST['plugin'] ) ) {
$plugins = array_map( 'urldecode', (array) $_POST['plugin'] );
$plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins );
}
$plugins_to_activate = array();
$plugin_names = array();
// Grab the file paths for the selected & inactive plugins from the registration array.
foreach ( $plugins as $slug ) {
if ( $this->tgmpa->can_plugin_activate( $slug ) ) {
$plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path'];
$plugin_names[] = $this->tgmpa->plugins[ $slug ]['name'];
}
}
unset( $slug );
// Return early if there are no plugins to activate.
if ( empty( $plugins_to_activate ) ) {
echo '
', esc_html__( 'No plugins are available to be activated at this time.', 'tgmpa' ), '
';
return false;
}
// Now we are good to go - let's start activating plugins.
$activate = activate_plugins( $plugins_to_activate );
if ( is_wp_error( $activate ) ) {
echo '
';
} else {
$count = count( $plugin_names ); // Count so we can use _n function.
$plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names );
$last_plugin = array_pop( $plugin_names ); // Pop off last name to prep for readability.
$imploded = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin );
printf( // WPCS: xss ok.
'
%1$s %2$s.
',
esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'tgmpa' ) ),
$imploded
);
// Update recently activated plugins option.
$recent = (array) get_option( 'recently_activated' );
foreach ( $plugins_to_activate as $plugin => $time ) {
if ( isset( $recent[ $plugin ] ) ) {
unset( $recent[ $plugin ] );
}
}
update_option( 'recently_activated', $recent );
}
unset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another.
return true;
}
return false;
}
/**
* Prepares all of our information to be outputted into a usable table.
*
* @since 2.2.0
*/
public function prepare_items() {
$columns = $this->get_columns(); // Get all necessary column information.
$hidden = array(); // No columns to hide, but we must set as an array.
$sortable = array(); // No reason to make sortable columns.
$primary = $this->get_primary_column_name(); // Column which has the row actions.
$this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers.
// Process our bulk activations here.
if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
$this->process_bulk_actions();
}
// Store all of our plugin data into $items array so WP_List_Table can use it.
$this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() );
}
/* *********** DEPRECATED METHODS *********** */
/**
* Retrieve plugin data, given the plugin name.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead.
* @see TGM_Plugin_Activation::_get_plugin_data_from_name()
*
* @param string $name Name of the plugin, as it was registered.
* @param string $data Optional. Array key of plugin data to return. Default is slug.
* @return string|boolean Plugin slug if found, false otherwise.
*/
protected function _get_plugin_data_from_name( $name, $data = 'slug' ) {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' );
return $this->tgmpa->_get_plugin_data_from_name( $name, $data );
}
}
}
if ( ! class_exists( 'TGM_Bulk_Installer' ) ) {
/**
* Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+.
*
* @since 2.5.2
*
* {@internal The TGMPA_Bulk_Installer class was originally called TGM_Bulk_Installer.
* For more information, see that class.}}
*/
class TGM_Bulk_Installer {
}
}
if ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) {
/**
* Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+.
*
* @since 2.5.2
*
* {@internal The TGMPA_Bulk_Installer_Skin class was originally called TGM_Bulk_Installer_Skin.
* For more information, see that class.}}
*/
class TGM_Bulk_Installer_Skin {
}
}
/**
* The WP_Upgrader file isn't always available. If it isn't available,
* we load it here.
*
* We check to make sure no action or activation keys are set so that WordPress
* does not try to re-include the class when processing upgrades or installs outside
* of the class.
*
* @since 2.2.0
*/
add_action( 'admin_init', 'tgmpa_load_bulk_installer' );
if ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) {
/**
* Load bulk installer
*/
function tgmpa_load_bulk_installer() {
// Silently fail if 2.5+ is loaded *after* an older version.
if ( ! isset( $GLOBALS['tgmpa'] ) ) {
return;
}
// Get TGMPA class instance.
$tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
if ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) {
if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
}
if ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) {
/**
* Installer class to handle bulk plugin installations.
*
* Extends WP_Upgrader and customizes to suit the installation of multiple
* plugins.
*
* @since 2.2.0
*
* {@internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader.}}
* {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer.
* This was done to prevent backward compatibility issues with v2.3.6.}}
*
* @package TGM-Plugin-Activation
* @author Thomas Griffin
* @author Gary Jones
*/
class TGMPA_Bulk_Installer extends Plugin_Upgrader {
/**
* Holds result of bulk plugin installation.
*
* @since 2.2.0
*
* @var string
*/
public $result;
/**
* Flag to check if bulk installation is occurring or not.
*
* @since 2.2.0
*
* @var boolean
*/
public $bulk = false;
/**
* TGMPA instance
*
* @since 2.5.0
*
* @var object
*/
protected $tgmpa;
/**
* Whether or not the destination directory needs to be cleared ( = on update).
*
* @since 2.5.0
*
* @var bool
*/
protected $clear_destination = false;
/**
* References parent constructor and sets defaults for class.
*
* @since 2.2.0
*
* @param \Bulk_Upgrader_Skin|null $skin Installer skin.
*/
public function __construct( $skin = null ) {
// Get TGMPA class instance.
$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
parent::__construct( $skin );
if ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) {
$this->clear_destination = true;
}
if ( $this->tgmpa->is_automatic ) {
$this->activate_strings();
}
add_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) );
}
/**
* Sets the correct activation strings for the installer skin to use.
*
* @since 2.2.0
*/
public function activate_strings() {
$this->strings['activation_failed'] = __( 'Plugin activation failed.', 'tgmpa' );
$this->strings['activation_success'] = __( 'Plugin activated successfully.', 'tgmpa' );
}
/**
* Performs the actual installation of each plugin.
*
* @since 2.2.0
*
* @see WP_Upgrader::run()
*
* @param array $options The installation config options.
* @return null|array Return early if error, array of installation data on success.
*/
public function run( $options ) {
$result = parent::run( $options );
// Reset the strings in case we changed one during automatic activation.
if ( $this->tgmpa->is_automatic ) {
if ( 'update' === $this->skin->options['install_type'] ) {
$this->upgrade_strings();
} else {
$this->install_strings();
}
}
return $result;
}
/**
* Processes the bulk installation of plugins.
*
* @since 2.2.0
*
* {@internal This is basically a near identical copy of the WP Core
* Plugin_Upgrader::bulk_upgrade() method, with minor adjustments to deal with
* new installs instead of upgrades.
* For ease of future synchronizations, the adjustments are clearly commented, but no other
* comments are added. Code style has been made to comply.}}
*
* @see Plugin_Upgrader::bulk_upgrade()
* @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838
* (@internal Last synced: Dec 31st 2015 against https://core.trac.wordpress.org/browser/trunk?rev=36134}}
*
* @param array $plugins The plugin sources needed for installation.
* @param array $args Arbitrary passed extra arguments.
* @return array|false Install confirmation messages on success, false on failure.
*/
public function bulk_install( $plugins, $args = array() ) {
// [TGMPA + ] Hook auto-activation in.
add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
$defaults = array(
'clear_update_cache' => true,
);
$parsed_args = wp_parse_args( $args, $defaults );
$this->init();
$this->bulk = true;
$this->install_strings(); // [TGMPA + ] adjusted.
/* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */
/* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */
$this->skin->header();
// Connect to the Filesystem first.
$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
if ( ! $res ) {
$this->skin->footer();
return false;
}
$this->skin->bulk_header();
/*
* Only start maintenance mode if:
* - running Multisite and there are one or more plugins specified, OR
* - a plugin with an update available is currently active.
* @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.
*/
$maintenance = ( is_multisite() && ! empty( $plugins ) );
/*
[TGMPA - ]
foreach ( $plugins as $plugin )
$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) );
*/
if ( $maintenance ) {
$this->maintenance_mode( true );
}
$results = array();
$this->update_count = count( $plugins );
$this->update_current = 0;
foreach ( $plugins as $plugin ) {
$this->update_current++;
/*
[TGMPA - ]
$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);
if ( !isset( $current->response[ $plugin ] ) ) {
$this->skin->set_result('up_to_date');
$this->skin->before();
$this->skin->feedback('up_to_date');
$this->skin->after();
$results[$plugin] = true;
continue;
}
// Get the URL to the zip file.
$r = $current->response[ $plugin ];
$this->skin->plugin_active = is_plugin_active($plugin);
*/
$result = $this->run(
array(
'package' => $plugin, // [TGMPA + ] adjusted.
'destination' => WP_PLUGIN_DIR,
'clear_destination' => false, // [TGMPA + ] adjusted.
'clear_working' => true,
'is_multi' => true,
'hook_extra' => array(
'plugin' => $plugin,
),
)
);
$results[ $plugin ] = $this->result;
// Prevent credentials auth screen from displaying multiple times.
if ( false === $result ) {
break;
}
} //end foreach $plugins
$this->maintenance_mode( false );
/**
* Fires when the bulk upgrader process is complete.
*
* @since WP 3.6.0 / TGMPA 2.5.0
*
* @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might
* be a Theme_Upgrader or Core_Upgrade instance.
* @param array $data {
* Array of bulk item update data.
*
* @type string $action Type of action. Default 'update'.
* @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'.
* @type bool $bulk Whether the update process is a bulk update. Default true.
* @type array $packages Array of plugin, theme, or core packages to update.
* }
*/
do_action( 'upgrader_process_complete', $this, array(
'action' => 'install', // [TGMPA + ] adjusted.
'type' => 'plugin',
'bulk' => true,
'plugins' => $plugins,
) );
$this->skin->bulk_footer();
$this->skin->footer();
// Cleanup our hooks, in case something else does a upgrade on this connection.
/* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */
// [TGMPA + ] Remove our auto-activation hook.
remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
// Force refresh of plugin update information.
wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );
return $results;
}
/**
* Handle a bulk upgrade request.
*
* @since 2.5.0
*
* @see Plugin_Upgrader::bulk_upgrade()
*
* @param array $plugins The local WP file_path's of the plugins which should be upgraded.
* @param array $args Arbitrary passed extra arguments.
* @return string|bool Install confirmation messages on success, false on failure.
*/
public function bulk_upgrade( $plugins, $args = array() ) {
add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
$result = parent::bulk_upgrade( $plugins, $args );
remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
return $result;
}
/**
* Abuse a filter to auto-activate plugins after installation.
*
* Hooked into the 'upgrader_post_install' filter hook.
*
* @since 2.5.0
*
* @param bool $bool The value we need to give back (true).
* @return bool
*/
public function auto_activate( $bool ) {
// Only process the activation of installed plugins if the automatic flag is set to true.
if ( $this->tgmpa->is_automatic ) {
// Flush plugins cache so the headers of the newly installed plugins will be read correctly.
wp_clean_plugins_cache();
// Get the installed plugin file.
$plugin_info = $this->plugin_info();
// Don't try to activate on upgrade of active plugin as WP will do this already.
if ( ! is_plugin_active( $plugin_info ) ) {
$activate = activate_plugin( $plugin_info );
// Adjust the success string based on the activation result.
$this->strings['process_success'] = $this->strings['process_success'] . " \n";
if ( is_wp_error( $activate ) ) {
$this->skin->error( $activate );
$this->strings['process_success'] .= $this->strings['activation_failed'];
} else {
$this->strings['process_success'] .= $this->strings['activation_success'];
}
}
}
return $bool;
}
}
}
if ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) {
/**
* Installer skin to set strings for the bulk plugin installations..
*
* Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple
* plugins.
*
* @since 2.2.0
*
* {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to
* TGMPA_Bulk_Installer_Skin.
* This was done to prevent backward compatibility issues with v2.3.6.}}
*
* @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php
*
* @package TGM-Plugin-Activation
* @author Thomas Griffin
* @author Gary Jones
*/
class TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin {
/**
* Holds plugin info for each individual plugin installation.
*
* @since 2.2.0
*
* @var array
*/
public $plugin_info = array();
/**
* Holds names of plugins that are undergoing bulk installations.
*
* @since 2.2.0
*
* @var array
*/
public $plugin_names = array();
/**
* Integer to use for iteration through each plugin installation.
*
* @since 2.2.0
*
* @var integer
*/
public $i = 0;
/**
* TGMPA instance
*
* @since 2.5.0
*
* @var object
*/
protected $tgmpa;
/**
* Constructor. Parses default args with new ones and extracts them for use.
*
* @since 2.2.0
*
* @param array $args Arguments to pass for use within the class.
*/
public function __construct( $args = array() ) {
// Get TGMPA class instance.
$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
// Parse default and new args.
$defaults = array(
'url' => '',
'nonce' => '',
'names' => array(),
'install_type' => 'install',
);
$args = wp_parse_args( $args, $defaults );
// Set plugin names to $this->plugin_names property.
$this->plugin_names = $args['names'];
// Extract the new args.
parent::__construct( $args );
}
/**
* Sets install skin strings for each individual plugin.
*
* Checks to see if the automatic activation flag is set and uses the
* the proper strings accordingly.
*
* @since 2.2.0
*/
public function add_strings() {
if ( 'update' === $this->options['install_type'] ) {
parent::add_strings();
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
} else {
/* translators: 1: plugin name, 2: error message. */
$this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: %2$s.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'tgmpa' );
if ( $this->tgmpa->is_automatic ) {
// Automatic activation strings.
$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '' . esc_html__( 'Hide Details', 'tgmpa' ) . '.';
$this->upgrader->strings['skin_upgrade_end'] = __( 'All installations and activations have been completed.', 'tgmpa' );
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
} else {
// Default installation strings.
$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '' . esc_html__( 'Hide Details', 'tgmpa' ) . '.';
$this->upgrader->strings['skin_upgrade_end'] = __( 'All installations have been completed.', 'tgmpa' );
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Installing Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
}
}
}
/**
* Outputs the header strings and necessary JS before each plugin installation.
*
* @since 2.2.0
*
* @param string $title Unused in this implementation.
*/
public function before( $title = '' ) {
if ( empty( $title ) ) {
$title = esc_html( $this->plugin_names[ $this->i ] );
}
parent::before( $title );
}
/**
* Outputs the footer strings and necessary JS after each plugin installation.
*
* Checks for any errors and outputs them if they exist, else output
* success strings.
*
* @since 2.2.0
*
* @param string $title Unused in this implementation.
*/
public function after( $title = '' ) {
if ( empty( $title ) ) {
$title = esc_html( $this->plugin_names[ $this->i ] );
}
parent::after( $title );
$this->i++;
}
/**
* Outputs links after bulk plugin installation is complete.
*
* @since 2.2.0
*/
public function bulk_footer() {
// Serve up the string to say installations (and possibly activations) are complete.
parent::bulk_footer();
// Flush plugins cache so we can make sure that the installed plugins list is always up to date.
wp_clean_plugins_cache();
$this->tgmpa->show_tgmpa_version();
// Display message based on if all plugins are now active or not.
$update_actions = array();
if ( $this->tgmpa->is_tgmpa_complete() ) {
// All plugins are active, so we display the complete string and hide the menu to protect users.
echo '';
$update_actions['dashboard'] = sprintf(
esc_html( $this->tgmpa->strings['complete'] ),
'' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . ''
);
} else {
$update_actions['tgmpa_page'] = '' . esc_html( $this->tgmpa->strings['return'] ) . '';
}
/**
* Filter the list of action links available following bulk plugin installs/updates.
*
* @since 2.5.0
*
* @param array $update_actions Array of plugin action links.
* @param array $plugin_info Array of information for the last-handled plugin.
*/
$update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );
if ( ! empty( $update_actions ) ) {
$this->feedback( implode( ' | ', (array) $update_actions ) );
}
}
/* *********** DEPRECATED METHODS *********** */
/**
* Flush header output buffer.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
* @see Bulk_Upgrader_Skin::flush_output()
*/
public function before_flush_output() {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
$this->flush_output();
}
/**
* Flush footer output buffer and iterate $this->i to make sure the
* installation strings reference the correct plugin.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
* @see Bulk_Upgrader_Skin::flush_output()
*/
public function after_flush_output() {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
$this->flush_output();
$this->i++;
}
}
}
}
}
}
if ( ! class_exists( 'TGMPA_Utils' ) ) {
/**
* Generic utilities for TGMPA.
*
* All methods are static, poor-dev name-spacing class wrapper.
*
* Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy.
*
* @since 2.5.0
*
* @package TGM-Plugin-Activation
* @author Juliette Reinders Folmer
*/
class TGMPA_Utils {
/**
* Whether the PHP filter extension is enabled.
*
* @see http://php.net/book.filter
*
* @since 2.5.0
*
* @static
*
* @var bool $has_filters True is the extension is enabled.
*/
public static $has_filters;
/**
* Wrap an arbitrary string in tags. Meant to be used in combination with array_map().
*
* @since 2.5.0
*
* @static
*
* @param string $string Text to be wrapped.
* @return string
*/
public static function wrap_in_em( $string ) {
return '' . wp_kses_post( $string ) . '';
}
/**
* Wrap an arbitrary string in tags. Meant to be used in combination with array_map().
*
* @since 2.5.0
*
* @static
*
* @param string $string Text to be wrapped.
* @return string
*/
public static function wrap_in_strong( $string ) {
return '' . wp_kses_post( $string ) . '';
}
/**
* Helper function: Validate a value as boolean
*
* @since 2.5.0
*
* @static
*
* @param mixed $value Arbitrary value.
* @return bool
*/
public static function validate_bool( $value ) {
if ( ! isset( self::$has_filters ) ) {
self::$has_filters = extension_loaded( 'filter' );
}
if ( self::$has_filters ) {
return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
} else {
return self::emulate_filter_bool( $value );
}
}
/**
* Helper function: Cast a value to bool
*
* @since 2.5.0
*
* @static
*
* @param mixed $value Value to cast.
* @return bool
*/
protected static function emulate_filter_bool( $value ) {
// @codingStandardsIgnoreStart
static $true = array(
'1',
'true', 'True', 'TRUE',
'y', 'Y',
'yes', 'Yes', 'YES',
'on', 'On', 'ON',
);
static $false = array(
'0',
'false', 'False', 'FALSE',
'n', 'N',
'no', 'No', 'NO',
'off', 'Off', 'OFF',
);
// @codingStandardsIgnoreEnd
if ( is_bool( $value ) ) {
return $value;
} elseif ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) {
return (bool) $value;
} elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) {
return (bool) $value;
} elseif ( is_string( $value ) ) {
$value = trim( $value );
if ( in_array( $value, $true, true ) ) {
return true;
} elseif ( in_array( $value, $false, true ) ) {
return false;
} else {
return false;
}
}
return false;
}
} // End of class TGMPA_Utils
} // End of class_exists wrapper
Recensioni di Dott. Domenico Tavella, Ospedale Borgo Trento, VeronaSalta ai contenuti
Il Dott. Domenico Tavella è un esperto cardiologo presso l’Ospedale Borgo Trento, situato in Piazzale Aristide Stefani, Verona. Con la sua vasta esperienza nel campo della cardiologia, il Dott. Tavella si impegna a fornire cure di alta qualità ai suoi pazienti.
Esperienze presso Dott. Domenico Tavella
Il Dott. Domenico Tavella è un esperto cardiologo presso l'Ospedale Borgo Trento, situato in Piazzale Aristide Stefani, Verona. Con la sua vasta esperienza nel campo della cardiologia, il Dott. Tavella si impegna a fornire cure di alta qualità ai suoi pazienti.
L'orario di apertura dello studio del Dott. Tavella varia a seconda dei giorni. Il lunedì, lo studio è aperto dalle 16 alle 19. Tuttavia, il martedì, il mercoledì, il giovedì, il sabato e la domenica lo studio è chiuso.
Per quanto riguarda l'accessibilità, lo studio del Dott. Tavella dispone di servizi per i pazienti con disabilità. In particolare, è dotato di un bagno accessibile per le persone in sedia a rotelle. Inoltre, offre anche un parcheggio accessibile per le persone con disabilità.
All'interno dello studio del Dott. Tavella, i pazienti possono trovare servizi essenziali come un bagno e una toilette. Questi servizi sono forniti per garantire il comfort e la comodità dei pazienti.
Il Dott. Tavella è aperto ad accettare nuovi pazienti che desiderano beneficiare delle sue competenze e della sua esperienza nella cardiologia. Se sei alla ricerca di un cardiologo affidabile e professionale a Verona, il Dott. Tavella è la scelta ideale.
Per contattare il Dott. Domenico Tavella e prenotare una visita, è possibile chiamare il numero 00454155855. Il suo staff sarà lieto di assistervi e fornirvi tutte le informazioni necessarie.
Non esitare a prenotare una visita presso lo studio del Dott. Tavella e beneficia delle sue competenze nel campo della cardiologia. La sua dedizione e professionalità garantiscono cure di alta qualità e un'esperienza positiva per ogni paziente.
Esplora le zone circostanti a Dott. Domenico Tavella e scopri luoghi affascinanti e attività interessanti. Lasciati guidare attraverso le vicinanze per un'esperienza completa e autentica.
Lungadige Attiraglio, 1, 37126 Verona VR, Italia (0.25 km).
Articolo Recensioni di Dott. Domenico Tavella, Ospedale Borgo Trento, Verona, offre una panoramica su Dott. Domenico Tavella, dai suoi punti salienti alle esperienze che questo luogo offre. Attraverso l'articolo, scoprirai e comprenderai meglio i punti salienti di Dott. Domenico Tavella, aiutandoti a pianificare o a esplorare questo luogo in dettaglio e in modo completo.
4/5 - (50 voti)
Gabriella Bianchi
Sono Gabriella Bianchi, il fondatore e al contempo il gestore del sito web veronasegwaytours.com. Con oltre 13 anni di esperienza nel campo della tecnologia e della cultura, ho dedicato impegno per creare uno spazio informativo affidabile e di qualità sul turismo a Verona, Italia.