You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
6.2 KiB
PHP
327 lines
6.2 KiB
PHP
<?php
|
|
/**
|
|
* The admin-page functionality.
|
|
*
|
|
* @since 1.0.0
|
|
* @package RankMath
|
|
* @subpackage RankMath\Admin
|
|
* @author RankMath <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Admin;
|
|
|
|
use RankMath\Helpers\Param;
|
|
|
|
/**
|
|
* Page class.
|
|
*/
|
|
class Page {
|
|
|
|
/**
|
|
* Unique ID used for menu_slug.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $id = null;
|
|
|
|
/**
|
|
* The text to be displayed in the title tags of the page.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $title = null;
|
|
|
|
/**
|
|
* The slug name for the parent menu.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $parent = null;
|
|
|
|
/**
|
|
* The The on-screen name text for the menu.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $menu_title = null;
|
|
|
|
/**
|
|
* The capability required for this menu to be displayed to the user.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $capability = 'manage_options';
|
|
|
|
/**
|
|
* The icon for this menu.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $icon = 'dashicons-art';
|
|
|
|
/**
|
|
* The position in the menu order this menu should appear.
|
|
*
|
|
* @var int
|
|
*/
|
|
public $position = -1;
|
|
|
|
/**
|
|
* The function/file that displays the page content for the menu page.
|
|
*
|
|
* @var string|callable
|
|
*/
|
|
public $render = null;
|
|
|
|
/**
|
|
* The function that run on page POST to save data.
|
|
*
|
|
* @var callable
|
|
*/
|
|
public $onsave = null;
|
|
|
|
/**
|
|
* Hold contextual help tabs.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $help = null;
|
|
|
|
/**
|
|
* Hold scripts and styles.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $assets = null;
|
|
|
|
/**
|
|
* Check if plugin is network active.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $is_network = false;
|
|
|
|
/**
|
|
* Hold classes for body tag.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $classes = null;
|
|
|
|
/**
|
|
* The Constructor.
|
|
*
|
|
* @param string $id Admin page unique id.
|
|
* @param string $title Title of the admin page.
|
|
* @param array $config Optional. Override page settings.
|
|
*/
|
|
public function __construct( $id, $title, $config = [] ) {
|
|
|
|
// Early bail!
|
|
if ( ! $id ) {
|
|
wp_die( esc_html__( '$id variable required', 'rank-math' ), esc_html__( 'Variable Required', 'rank-math' ) );
|
|
}
|
|
|
|
if ( ! $title ) {
|
|
wp_die( esc_html__( '$title variable required', 'rank-math' ), esc_html__( 'Variable Required', 'rank-math' ) );
|
|
}
|
|
|
|
$this->id = $id;
|
|
$this->title = $title;
|
|
foreach ( $config as $key => $value ) {
|
|
$this->$key = $value;
|
|
}
|
|
|
|
if ( ! $this->menu_title ) {
|
|
$this->menu_title = $title;
|
|
}
|
|
|
|
add_action( 'init', [ $this, 'init' ], 25 );
|
|
}
|
|
|
|
/**
|
|
* Init admin page when WordPress Initialises.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function init() {
|
|
$priority = $this->parent ? intval( $this->position ) : -1;
|
|
add_action( $this->is_network ? 'network_admin_menu' : 'admin_menu', [ $this, 'register_menu' ], $priority );
|
|
|
|
// If not the page is not this page stop here.
|
|
if ( ! $this->is_current_page() ) {
|
|
return;
|
|
}
|
|
|
|
$hooks = [
|
|
'admin_init' => [
|
|
'callback' => 'save',
|
|
'condition' => ! is_null( $this->onsave ) && is_callable( $this->onsave ),
|
|
],
|
|
'admin_enqueue_scripts' => [
|
|
'callback' => 'enqueue',
|
|
'condition' => ! empty( $this->assets ),
|
|
],
|
|
'admin_head' => [
|
|
'callback' => 'contextual_help',
|
|
'condition' => ! empty( $this->help ),
|
|
],
|
|
'admin_body_class' => [
|
|
'callback' => 'body_class',
|
|
'condition' => ! empty( $this->classes ),
|
|
],
|
|
];
|
|
|
|
foreach ( $hooks as $hook => $data ) {
|
|
if ( true === $data['condition'] ) {
|
|
add_action( $hook, [ $this, $data['callback'] ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register Admin Menu.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function register_menu() {
|
|
if ( ! $this->parent ) {
|
|
add_menu_page( $this->title, $this->menu_title, $this->capability, $this->id, [ $this, 'display' ], $this->icon, $this->position );
|
|
return;
|
|
}
|
|
|
|
add_submenu_page( $this->parent, $this->title, $this->menu_title, $this->capability, $this->id, [ $this, 'display' ] );
|
|
}
|
|
|
|
/**
|
|
* Enqueue styles and scripts.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function enqueue() {
|
|
$this->enqueue_styles();
|
|
$this->enqueue_scripts();
|
|
}
|
|
|
|
/**
|
|
* Add classes to <body> of WordPress admin.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*
|
|
* @param string $classes Space-separated list of CSS classes.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function body_class( $classes = '' ) {
|
|
return $classes . ' ' . join( ' ', $this->classes );
|
|
}
|
|
|
|
/**
|
|
* Save anything you want using onsave function.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function save() {
|
|
call_user_func( $this->onsave, $this );
|
|
}
|
|
|
|
/**
|
|
* Contextual Help.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function contextual_help() {
|
|
$screen = get_current_screen();
|
|
|
|
foreach ( $this->help as $tab_id => $tab ) {
|
|
$tab['id'] = $tab_id;
|
|
$tab['content'] = $this->get_help_content( $tab );
|
|
$screen->add_help_tab( $tab );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render admin page content using render function you passed in config.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function display() {
|
|
if ( is_null( $this->render ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( is_callable( $this->render ) ) {
|
|
call_user_func( $this->render, $this );
|
|
return;
|
|
}
|
|
|
|
if ( is_string( $this->render ) ) {
|
|
include_once $this->render;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Is the page is currrent page.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_current_page() {
|
|
return Param::get( 'page' ) === $this->id;
|
|
}
|
|
|
|
/**
|
|
* Enqueue styles
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
private function enqueue_styles() {
|
|
if ( ! isset( $this->assets['styles'] ) || empty( $this->assets['styles'] ) ) {
|
|
return;
|
|
}
|
|
|
|
foreach ( $this->assets['styles'] as $handle => $src ) {
|
|
wp_enqueue_style( $handle, $src, null, rank_math()->version );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enqueue scripts.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
private function enqueue_scripts() {
|
|
if ( ! isset( $this->assets['scripts'] ) || empty( $this->assets['scripts'] ) ) {
|
|
return;
|
|
}
|
|
|
|
foreach ( $this->assets['scripts'] as $handle => $src ) {
|
|
wp_enqueue_script( $handle, $src, null, rank_math()->version, true );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get tab content
|
|
*
|
|
* @codeCoverageIgnore
|
|
*
|
|
* @param array $tab Tab to get content for.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function get_help_content( $tab ) {
|
|
ob_start();
|
|
|
|
// If it is a function.
|
|
if ( isset( $tab['content'] ) && is_callable( $tab['content'] ) ) {
|
|
call_user_func( $tab['content'] );
|
|
}
|
|
|
|
// If it is a file.
|
|
if ( isset( $tab['view'] ) && $tab['view'] ) {
|
|
require $tab['view'];
|
|
}
|
|
|
|
return ob_get_clean();
|
|
}
|
|
}
|