Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 66 additions & 2 deletions includes/Admin/Admin_Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ public function __construct( Admin_AJAX $admin_ajax ) {
*/
public function add_hooks() {
add_action( 'admin_menu', array( $this, 'add_and_initialize_page' ) );
add_action( 'network_admin_menu', array( $this, 'add_and_initialize_network_page' ) );
add_filter( 'plugin_action_links', array( $this, 'filter_plugin_action_links' ), 10, 4 );
add_filter( 'network_admin_plugin_action_links', array( $this, 'filter_network_admin_plugin_action_links' ), 10, 4 );
add_action( 'admin_enqueue_scripts', array( $this, 'add_jump_to_line_code_editor' ) );

$this->admin_ajax->add_hooks();
Expand Down Expand Up @@ -87,6 +89,35 @@ public function add_and_initialize_page() {
add_action( 'load-' . $this->get_hook_suffix(), array( $this, 'initialize_page' ) );
}

/**
* Adds the admin page under the network "Settings" menu.
*
* The "Tools" menu does not exist in the Network Admin, so the screen is
* added under "Settings" (settings.php) instead.
*
* @since 2.1.0
*/
public function add_network_page() {
$this->hook_suffix = add_submenu_page(
'settings.php',
__( 'Plugin Check', 'plugin-check' ),
__( 'Plugin Check', 'plugin-check' ),
'manage_network_plugins',
'plugin-check',
array( $this, 'render_page' )
);
}

/**
* Adds and initializes the admin page under the network "Settings" menu.
*
* @since 2.1.0
*/
public function add_and_initialize_network_page() {
$this->add_network_page();
add_action( 'load-' . $this->get_hook_suffix(), array( $this, 'initialize_page' ) );
}

/**
* Initializes page hooks.
*
Expand Down Expand Up @@ -336,6 +367,39 @@ static function ( Check $check ) {
* @return array The modified list of actions.
*/
public function filter_plugin_action_links( $actions, $plugin_file, $plugin_data, $context ) {
return $this->add_check_action_link( $actions, $plugin_file, $context, admin_url( 'tools.php?page=plugin-check' ) );
}

/**
* Adds "check this plugin" link in the Network Admin plugins list table.
*
* In the Network Admin the page lives under "Settings" (settings.php), so
* the link URL differs from the regular WP Admin.
*
* @since 2.1.0
*
* @param array $actions List of actions.
* @param string $plugin_file Plugin main file.
* @param array $plugin_data An array of plugin data.
* @param string $context The plugin context.
* @return array The modified list of actions.
*/
public function filter_network_admin_plugin_action_links( $actions, $plugin_file, $plugin_data, $context ) {
return $this->add_check_action_link( $actions, $plugin_file, $context, network_admin_url( 'settings.php?page=plugin-check' ) );
}

/**
* Adds the "check this plugin" action link using the given page URL.
*
* @since 2.1.0
*
* @param array $actions List of actions.
* @param string $plugin_file Plugin main file.
* @param string $context The plugin context.
* @param string $page_url The Plugin Check page URL to link to.
* @return array The modified list of actions.
*/
private function add_check_action_link( $actions, $plugin_file, $context, $page_url ) {

if ( in_array( $context, array( 'mustuse', 'dropins' ), true ) ) {
return $actions;
Expand All @@ -345,7 +409,7 @@ public function filter_plugin_action_links( $actions, $plugin_file, $plugin_data
if ( $plugin_check_base_name === $plugin_file ) {
$actions[] = sprintf(
'<a href="%1$s">%2$s</a>',
esc_url( admin_url( 'tools.php?page=plugin-check' ) ),
esc_url( $page_url ),
esc_html__( 'Check a plugin', 'plugin-check' )
);
return $actions;
Expand All @@ -354,7 +418,7 @@ public function filter_plugin_action_links( $actions, $plugin_file, $plugin_data
if ( current_user_can( 'activate_plugins' ) ) {
$actions[] = sprintf(
'<a href="%1$s">%2$s</a>',
esc_url( admin_url( "tools.php?page=plugin-check&plugin={$plugin_file}" ) ),
esc_url( $page_url . "&plugin={$plugin_file}" ),
esc_html__( 'Check this plugin', 'plugin-check' )
);
}
Expand Down
59 changes: 59 additions & 0 deletions tests/phpunit/tests/Admin/Admin_Page_Tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,39 @@ public function set_up() {
public function test_add_hooks() {
$this->admin_page->add_hooks();
$this->assertEquals( 10, has_action( 'admin_menu', array( $this->admin_page, 'add_and_initialize_page' ) ) );
$this->assertEquals( 10, has_action( 'network_admin_menu', array( $this->admin_page, 'add_and_initialize_network_page' ) ) );
$this->assertEquals( 10, has_filter( 'plugin_action_links', array( $this->admin_page, 'filter_plugin_action_links' ) ) );
$this->assertEquals( 10, has_filter( 'network_admin_plugin_action_links', array( $this->admin_page, 'filter_network_admin_plugin_action_links' ) ) );
}

public function test_add_and_initialize_network_page() {

if ( ! is_multisite() ) {
$this->markTestSkipped( 'The Network Admin is only available on multisite.' );
}

global $_parent_pages;

$current_screen = get_current_screen();

$admin_user = self::factory()->user->create( array( 'role' => 'administrator' ) );
grant_super_admin( $admin_user );
wp_set_current_user( $admin_user );

set_current_screen( 'dashboard-network' );

$this->admin_page->add_and_initialize_network_page();
$page_hook = $this->admin_page->get_hook_suffix();
$parent_pages = $_parent_pages;

set_current_screen( $current_screen );

$this->assertNotEmpty( $page_hook );

// In the Network Admin the page lives under "Settings" (settings.php).
$this->assertArrayHasKey( 'plugin-check', $parent_pages );
$this->assertEquals( 'settings.php', $parent_pages['plugin-check'] );
$this->assertNotFalse( has_action( "load-{$page_hook}", array( $this->admin_page, 'initialize_page' ) ) );
}

public function test_add_and_initialize_page() {
Expand Down Expand Up @@ -156,6 +188,33 @@ public function test_filter_plugin_action_links() {
);
}

public function test_filter_network_admin_plugin_action_links() {

$base_file = 'akismet/akismet.php';

$action_links = $this->admin_page->filter_network_admin_plugin_action_links( array(), $base_file, array(), 'all' );
$this->assertEmpty( $action_links );

/** Administrator check */
$admin_user = self::factory()->user->create( array( 'role' => 'administrator' ) );

if ( is_multisite() ) {
grant_super_admin( $admin_user );
}
wp_set_current_user( $admin_user );
$action_links = $this->admin_page->filter_network_admin_plugin_action_links( array(), $base_file, array(), 'all' );

// In the Network Admin the link points to settings.php instead of tools.php.
$this->assertEquals(
sprintf(
'<a href="%1$s">%2$s</a>',
esc_url( network_admin_url( "settings.php?page=plugin-check&plugin={$base_file}" ) ),
esc_html__( 'Check this plugin', 'plugin-check' )
),
$action_links[0]
);
}

public function test_filter_plugin_action_links_for_plugin_checker_check_link() {
$base_file = 'plugin-check/plugin.php';

Expand Down
Loading