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.
357 lines
8.8 KiB
PHTML
357 lines
8.8 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Version Control internal module.
|
||
|
*
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Version_Control
|
||
|
*/
|
||
|
|
||
|
namespace RankMath;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Helpers\Param;
|
||
|
use RankMath\Traits\Hooker;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Version_Control class.
|
||
|
*/
|
||
|
class Version_Control {
|
||
|
|
||
|
use Hooker;
|
||
|
|
||
|
/**
|
||
|
* Module ID.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $id = '';
|
||
|
|
||
|
/**
|
||
|
* Module directory.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $directory = '';
|
||
|
|
||
|
/**
|
||
|
* Plugin info transient key.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
const TRANSIENT = 'rank_math_wporg_plugin_info';
|
||
|
|
||
|
/**
|
||
|
* WordPress.org plugins API URL.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
const API_URL = 'https://api.wordpress.org/plugins/info/1.0/seo-by-rank-math.json';
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
if ( Helper::is_heartbeat() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( Helper::is_rest() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$directory = dirname( __FILE__ );
|
||
|
$this->config(
|
||
|
[
|
||
|
'id' => 'status',
|
||
|
'directory' => $directory,
|
||
|
]
|
||
|
);
|
||
|
|
||
|
$this->hooks();
|
||
|
|
||
|
$this->maybe_save_beta_optin();
|
||
|
$this->maybe_save_auto_update();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Change beta_optin setting.
|
||
|
*
|
||
|
* @return bool Change successful.
|
||
|
*/
|
||
|
public function maybe_save_beta_optin() {
|
||
|
if ( ! Param::post( 'beta_optin' ) || ! Param::post( '_wpnonce' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! current_user_can( 'manage_options' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'rank-math-beta-optin' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Sanitize input.
|
||
|
$new_value = Param::post( 'beta_optin' ) === 'on' ? 'on' : 'off';
|
||
|
|
||
|
$settings = get_option( 'rank-math-options-general', [] );
|
||
|
$settings['beta_optin'] = $new_value;
|
||
|
rank_math()->settings->set( 'general', 'beta_optin', 'on' === $new_value ? true : false );
|
||
|
update_option( 'rank-math-options-general', $settings );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Change enable_auto_update setting.
|
||
|
*
|
||
|
* @return bool Change successful.
|
||
|
*/
|
||
|
public function maybe_save_auto_update() {
|
||
|
if ( ! ( Param::post( 'enable_auto_update' ) || Param::post( 'enable_update_notification_email' ) ) && ! Param::post( '_wpnonce' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! current_user_can( 'manage_options' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'rank-math-auto-update' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( Param::post( 'enable_auto_update' ) ) {
|
||
|
$new_value = Param::post( 'enable_auto_update' ) === 'on' ? 'on' : 'off';
|
||
|
Helper::toggle_auto_update_setting( $new_value );
|
||
|
}
|
||
|
|
||
|
if ( Param::post( 'enable_update_notification_email' ) ) {
|
||
|
$enable_notifications = Param::post( 'enable_update_notification_email' ) === 'on' ? 'on' : 'off';
|
||
|
$settings = get_option( 'rank-math-options-general', [] );
|
||
|
|
||
|
$settings['update_notification_email'] = $enable_notifications;
|
||
|
rank_math()->settings->set( 'general', 'update_notification_email', 'on' === $enable_notifications ? true : false );
|
||
|
update_option( 'rank-math-options-general', $settings );
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register version control hooks.
|
||
|
*/
|
||
|
public function hooks() {
|
||
|
if ( Helper::get_settings( 'general.beta_optin' ) ) {
|
||
|
$beta_optin = new Beta_Optin();
|
||
|
$beta_optin->hooks();
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
Helper::is_advanced_mode() && (
|
||
|
! Helper::is_plugin_active_for_network() ||
|
||
|
current_user_can( 'setup_network' )
|
||
|
)
|
||
|
) {
|
||
|
$this->filter( 'rank_math/tools/pages', 'add_status_page' );
|
||
|
$this->filter( 'rank_math/tools/default_tab', 'change_default_tab' );
|
||
|
}
|
||
|
|
||
|
$this->filter( 'rank_math/admin/dashboard_view', 'network_admin_view', 10, 2 );
|
||
|
$this->filter( 'rank_math/admin/dashboard_nav_links', 'network_admin_dashboard_tabs' );
|
||
|
$this->action( 'admin_enqueue_scripts', 'enqueue', 20 );
|
||
|
|
||
|
if ( $this->should_add_json() ) {
|
||
|
/* translators: Placeholder is version number. */
|
||
|
Helper::add_json( 'rollbackConfirm', esc_html__( 'Are you sure you want to install version %s?', 'rank-math' ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if JSON for confirmation l10n needs to be added.
|
||
|
*
|
||
|
* @return bool Whether the data needs to be added.
|
||
|
*/
|
||
|
private function should_add_json() {
|
||
|
if ( ! is_admin() ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( is_network_admin() && Helper::is_plugin_active_for_network() ) {
|
||
|
return Param::get( 'page' ) === 'rank-math';
|
||
|
}
|
||
|
|
||
|
return Param::get( 'page' ) === 'rank-math-status';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if assets should be enqueued on current admin page.
|
||
|
*
|
||
|
* @param string $hook Page hook name.
|
||
|
* @return bool Whether we should proceed with the enqueue functions.
|
||
|
*/
|
||
|
private function should_enqueue( $hook ) {
|
||
|
if ( is_network_admin() && Helper::is_plugin_active_for_network() ) {
|
||
|
return 'toplevel_page_rank-math' === $hook;
|
||
|
}
|
||
|
|
||
|
return 'rank-math_page_rank-math-status' === $hook;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Replace Admin_Helper::get_view() output for the network admin tab.
|
||
|
*
|
||
|
* @param string $file File path.
|
||
|
* @param string $view Requested view.
|
||
|
* @return string New file path.
|
||
|
*/
|
||
|
public function network_admin_view( $file, $view ) {
|
||
|
if ( 'version_control' === Param::get( 'view' ) && is_network_admin() && Helper::is_plugin_active_for_network() ) {
|
||
|
return dirname( __FILE__ ) . '/display.php';
|
||
|
}
|
||
|
|
||
|
return $file;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter top nav links in the dashboard.
|
||
|
*
|
||
|
* @param array $nav_links Nav links.
|
||
|
* @return array New nav links.
|
||
|
*/
|
||
|
public function network_admin_dashboard_tabs( $nav_links ) {
|
||
|
if ( ! is_network_admin() ) {
|
||
|
return $nav_links;
|
||
|
}
|
||
|
|
||
|
if ( empty( $nav_links ) ) {
|
||
|
$nav_links = [
|
||
|
'help' => [
|
||
|
'id' => 'help',
|
||
|
'url' => '',
|
||
|
'args' => '',
|
||
|
'cap' => 'manage_options',
|
||
|
'title' => esc_html__( 'Dashboard', 'rank-math' ),
|
||
|
],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$nav_links['version_control'] = [
|
||
|
'id' => 'version_control',
|
||
|
'url' => '',
|
||
|
'args' => 'view=version_control',
|
||
|
'cap' => 'manage_options',
|
||
|
'title' => esc_html__( 'Version Control', 'rank-math' ),
|
||
|
];
|
||
|
return $nav_links;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add subpage to Status & Tools screen.
|
||
|
*
|
||
|
* @param array $pages Pages.
|
||
|
* @return array New pages.
|
||
|
*/
|
||
|
public function add_status_page( $pages ) {
|
||
|
$pages['version_control'] = [
|
||
|
'url' => 'status',
|
||
|
'args' => 'view=version_control',
|
||
|
'cap' => 'install_plugins',
|
||
|
'title' => __( 'Version Control', 'rank-math' ),
|
||
|
'class' => '\\RankMath\\Version_Control',
|
||
|
];
|
||
|
|
||
|
return $pages;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Change default tab on the Status & Tools screen.
|
||
|
*
|
||
|
* @param string $default Default tab.
|
||
|
* @return string New default tab.
|
||
|
*/
|
||
|
public function change_default_tab( $default ) {
|
||
|
if ( is_multisite() && ! current_user_can( 'setup_network' ) ) {
|
||
|
return $default;
|
||
|
}
|
||
|
return 'version_control';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enqueue CSS & JS.
|
||
|
*
|
||
|
* @param string $hook Page hook name.
|
||
|
* @return void
|
||
|
*/
|
||
|
public function enqueue( $hook ) {
|
||
|
if ( ! $this->should_enqueue( $hook ) ) {
|
||
|
return;
|
||
|
}
|
||
|
$uri = untrailingslashit( plugin_dir_url( __FILE__ ) );
|
||
|
wp_enqueue_style( 'rank-math-cmb2' );
|
||
|
wp_enqueue_style( 'rank-math-version-control', $uri . '/assets/css/version-control.css', [], rank_math()->version );
|
||
|
wp_enqueue_script( 'rank-math-version-control', $uri . '/assets/js/version-control.js', [ 'jquery' ], rank_math()->version, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Rank Math plugin information.
|
||
|
*
|
||
|
* @return mixed Plugin information array or false on fail.
|
||
|
*/
|
||
|
public static function get_plugin_info() {
|
||
|
$cache = get_transient( self::TRANSIENT );
|
||
|
if ( $cache ) {
|
||
|
return $cache;
|
||
|
}
|
||
|
|
||
|
$request = wp_remote_get( self::API_URL, [ 'timeout' => 20 ] );
|
||
|
if ( ! is_wp_error( $request ) && is_array( $request ) ) {
|
||
|
$response = json_decode( $request['body'], true );
|
||
|
set_transient( self::TRANSIENT, $response, ( 12 * HOUR_IN_SECONDS ) );
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get plugin data to use in the `update_plugins` transient.
|
||
|
*
|
||
|
* @param string $version New version.
|
||
|
* @param string $package New version download URL.
|
||
|
* @return array An array of plugin metadata.
|
||
|
*/
|
||
|
public static function get_plugin_data( $version, $package ) {
|
||
|
return [
|
||
|
'id' => 'w.org/plugins/seo-by-rank-math',
|
||
|
'slug' => 'seo-by-rank-math',
|
||
|
'plugin' => 'seo-by-rank-math/rank-math.php',
|
||
|
'new_version' => $version,
|
||
|
'url' => 'https://wordpress.org/plugins/seo-by-rank-math/',
|
||
|
'package' => $package,
|
||
|
'icons' =>
|
||
|
[
|
||
|
'2x' => 'https://ps.w.org/seo-by-rank-math/assets/icon-256x256.png?rev=2034417',
|
||
|
'1x' => 'https://ps.w.org/seo-by-rank-math/assets/icon.svg?rev=2034417',
|
||
|
'svg' => 'https://ps.w.org/seo-by-rank-math/assets/icon.svg?rev=2034417',
|
||
|
],
|
||
|
'banners' =>
|
||
|
[
|
||
|
'2x' => 'https://ps.w.org/seo-by-rank-math/assets/banner-1544x500.png?rev=2034417',
|
||
|
'1x' => 'https://ps.w.org/seo-by-rank-math/assets/banner-772x250.png?rev=2034417',
|
||
|
],
|
||
|
'banners_rtl' => [],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display forms.
|
||
|
*/
|
||
|
public function display() {
|
||
|
$directory = dirname( __FILE__ );
|
||
|
include_once $directory . '/display.php';
|
||
|
}
|
||
|
|
||
|
}
|