HEX
Server: nginx/1.18.0
System: Linux vps-9dcdb12e 5.15.0-176-generic #186-Ubuntu SMP Fri Mar 13 11:01:42 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.24
Disabled: exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Upload Files
File: /var/www/aetherius.pl/wp-content/plugins/the-post-grid/app/Controllers/Hooks/InstallPlugins.php
<?php
/**
 * Action Hooks class.
 *
 * @package RT_TPG
 */

namespace RT\ThePostGrid\Controllers\Hooks;

// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
	exit( 'This script cannot be accessed directly.' );
}

use Plugin_Upgrader;
use RT\ThePostGrid\Helpers\Fns;
use WP_Ajax_Upgrader_Skin;
use WpOrg\Requests\Exception;

/**
 * Action Hooks class.
 */
class InstallPlugins {

	/**
	 * Class init.
	 *
	 * @return void
	 */
	public static function init() {
		// Step 4: PHP — AJAX Handlers to Install and Activate Plugin

		// Handle plugin installation via AJAX
		add_action( 'wp_ajax_install_plugin', function() {
			// Check permissions and nonce
			$nonce_action = isset( $_POST['nonceID'] ) ? sanitize_text_field( $_POST['nonceID'] ) : '';
			$nonce_value  = isset( $_POST['nonce'] ) ? sanitize_text_field( $_POST['nonce'] ) : '';

			if ( ! current_user_can( 'install_plugins' ) || ! Fns::verifyNonce()  ) {
				wp_send_json_error( [ 'message' => 'Permission denied' ] );
			}


			if ( empty( $_POST['slug'] ) ) {
				wp_send_json_error( [ 'message' => 'Missing plugin slug' ] );
			}

			$slug = sanitize_key( $_POST['slug'] );

			require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
			require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
			require_once ABSPATH . 'wp-admin/includes/file.php';
			require_once ABSPATH . 'wp-admin/includes/misc.php';
			require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skins.php';

			// Get plugin information from WordPress.org API
			$api = plugins_api( 'plugin_information', [
				'slug'   => $slug,
				'fields' => [ 'sections' => false ],
			] );

			if ( is_wp_error( $api ) ) {
				wp_send_json_error( [ 'message' => $api->get_error_message() ] );
			}

			// Ensure filesystem credentials are set up
			$creds = request_filesystem_credentials( '', '', false, false, [] );
			if ( ! WP_Filesystem( $creds ) ) {
				wp_send_json_error( [ 'message' => 'Filesystem credentials error.' ] );
			}

			// Install the plugin
			$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
			$result   = $upgrader->install( $api->download_link );

			if ( is_wp_error( $result ) ) {
				wp_send_json_error( [ 'message' => $result->get_error_message() ] );
			}

			if ( ! $upgrader->plugin_info() ) {
				wp_send_json_error( [ 'message' => 'Plugin installation failed.' ] );
			}

			$plugin_file = $upgrader->plugin_info(); // e.g., classified-listing/classified-listing.php
			wp_send_json_success( [ 'plugin' => $plugin_file ] );
		} );

		// Handle plugin activation via AJAX
		add_action( 'wp_ajax_activate_plugin', function() {
			$nonce_action = isset( $_POST['nonceID'] ) ? sanitize_text_field( $_POST['nonceID'] ) : '';
			$nonce_value  = isset( $_POST['nonce'] ) ? sanitize_text_field( $_POST['nonce'] ) : '';

			if ( ! current_user_can( 'install_plugins' ) || ! Fns::verifyNonce()  ) {
				wp_send_json_error( [ 'message' => 'Permission denied' ] );
			}

			if ( empty( $_POST['plugin'] ) ) {
				wp_send_json_error( [ 'message' => 'Missing plugin path' ] );
			}

			$plugin = sanitize_text_field( $_POST['plugin'] );

			include_once ABSPATH . 'wp-admin/includes/plugin.php';

			$result = activate_plugin( $plugin );

			if ( is_wp_error( $result ) ) {
				wp_send_json_error( [ 'message' => $result->get_error_message() ] );
			}

			wp_send_json_success();
		} );

		add_action( 'admin_head', function() {
			// Get current screen object
			$screen = get_current_screen();

			// Check if we are on our desired page
			if (
				$screen &&
				$screen->post_type === 'rttpg' &&
				isset( $_GET['page'] ) &&
				$_GET['page'] === 'rttpg_our_plugins'
			) {
				// Remove default WordPress admin notices
				remove_all_actions( 'admin_notices' );
				remove_all_actions( 'all_admin_notices' );

				// Optionally also hide them with CSS as fallback
				echo '<style>.notice, .updated, .error, .is-dismissible { display: none !important; }</style>';
			}
		} );
	}

}