diff --git a/class/class-mainwp-backup.php b/class/class-mainwp-backup.php index e5d77af..6fe6f31 100644 --- a/class/class-mainwp-backup.php +++ b/class/class-mainwp-backup.php @@ -90,12 +90,8 @@ class MainWP_Backup { $this->timeout = 20 * 60 * 60; $mem = '512M'; - // phpcs:disable - ini_set( 'memory_limit', $mem ); - set_time_limit( $this->timeout ); - ini_set( 'max_execution_time', $this->timeout ); - // phpcs:enable - + MainWP_Helper::set_limit( $this->timeout, $mem ); + if ( null !== $this->archiver ) { $success = $this->archiver->create_full_backup( $filepath, $excludes, $addConfig, $includeCoreFiles, $excludezip, $excludenonwp, $append ); } elseif ( $this->check_zip_support() ) { @@ -116,12 +112,8 @@ class MainWP_Backup { public function zip_file( $files, $archive ) { $this->timeout = 20 * 60 * 60; $mem = '512M'; - // phpcs:disable - ini_set( 'memory_limit', $mem ); - set_time_limit( $this->timeout ); - ini_set( 'max_execution_time', $this->timeout ); - // phpcs:enable - + MainWP_Helper::set_limit( $this->timeout, $mem ); + if ( ! is_array( $files ) ) { $files = array( $files ); } @@ -630,14 +622,11 @@ class MainWP_Backup { } public function create_backup_db( $filepath_prefix, $archiveExt = false, &$archiver = null ) { - // phpcs:disable + $timeout = 20 * 60 * 60; - set_time_limit( $timeout ); - ini_set( 'max_execution_time', $timeout ); $mem = '512M'; - ini_set( 'memory_limit', $mem ); - // phpcs:enable - + MainWP_Helper::set_limit( $timeout, $mem ); + /** @var $wpdb wpdb */ global $wpdb; diff --git a/class/class-mainwp-child-callable.php b/class/class-mainwp-child-callable.php index 8373565..cc4eb53 100644 --- a/class/class-mainwp-child-callable.php +++ b/class/class-mainwp-child-callable.php @@ -2,6 +2,8 @@ namespace MainWP\Child; +// phpcs:disable WordPress.WP.AlternativeFunctions -- root namespace to use external code. + class MainWP_Child_Callable { protected static $instance = null; @@ -71,12 +73,10 @@ class MainWP_Child_Callable { 'wpvivid_backuprestore' => 'wpvivid_backuprestore', ); - private $callableFunctionsNoAuth = array( 'stats' => 'get_site_stats_no_auth', ); - /** * Method get_class_name() * @@ -98,39 +98,28 @@ class MainWP_Child_Callable { return self::$instance; } - public function init_call_functions( $auth ) { + public function init_call_functions( $auth = false ) { $callable = false; - $func_auth = false; - $callable_no_auth = false; - $func_no_auth = false; + $call_func = false; // check to execute mainwp child's callable functions. - if ( isset( $_POST['function'] ) ) { - $func = $_POST['function']; - $callable = $this->is_callable_function( $func ); - if ( $callable ) { - $func_auth = $func; - } - - if ( ! $callable ) { - $callable_no_auth = $this->is_callable_function_no_auth( $func ); - if ( $callable_no_auth ) { - $func_no_auth = $func; - } - } + if ( isset( $_POST['function'] ) ) { + $call_func = $_POST['function']; + $callable = $this->is_callable_function( $call_func ); // check callable func. + $callable_no_auth = $this->is_callable_function_no_auth( $call_func ); // check callable no auth func. } // Call the function required. if ( $auth && isset( $_POST['function'] ) && $callable ) { define( 'DOING_CRON', true ); - MainWP_Helper::handle_fatal_error(); + MainWP_Utility::handle_fatal_error(); MainWP_Utility::fix_for_custom_themes(); - $this->call_function( $func_auth ); + $this->call_function( $call_func ); } elseif ( isset( $_POST['function'] ) && $callable_no_auth ) { define( 'DOING_CRON', true ); MainWP_Utility::fix_for_custom_themes(); - $this->call_function_no_auth( $func_no_auth ); + $this->call_function_no_auth( $call_func ); } elseif ( isset( $_POST['function'] ) && isset( $_POST['mainwpsignature'] ) && ! $callable && ! $callable_no_auth ) { MainWP_Helper::error( __( 'Required version has not been detected. Please, make sure that you are using the latest version of the MainWP Child plugin on your site.', 'mainwp-child' ) ); } @@ -312,7 +301,7 @@ class MainWP_Child_Callable { $output['cron'] = ob_get_contents(); ob_end_clean(); ob_start(); - MainWP_Child_Server_Information::render_error_log_page(); + MainWP_Child_Server_Information::render_error_page(); $output['error'] = ob_get_contents(); ob_end_clean(); ob_start(); @@ -591,9 +580,9 @@ class MainWP_Child_Callable { public function backup( $pWrite = true ) { - $timeout = 20 * 60 * 60; - set_time_limit( $timeout ); - ini_set( 'max_execution_time', $timeout ); // phpcs:ignore + $timeout = 20 * 60 * 60; + MainWP_Helper::set_limit( $timeout ); + MainWP_Helper::end_session(); // Cleanup pid files! diff --git a/class/class-mainwp-child-posts.php b/class/class-mainwp-child-posts.php index 6f38b7d..79ca72e 100644 --- a/class/class-mainwp-child-posts.php +++ b/class/class-mainwp-child-posts.php @@ -885,7 +885,7 @@ class MainWP_Child_Posts { } try { - $downloadfile = MainWP_Helper::upload_image( $originalImgUrl, array(), $check_image_existed ); + $downloadfile = MainWP_Utility::upload_image( $originalImgUrl, array(), $check_image_existed ); $localUrl = $downloadfile['url']; $linkToReplaceWith = dirname( $localUrl ); if ( '' !== $hrefLink ) { @@ -919,7 +919,7 @@ class MainWP_Child_Posts { foreach ( $post_gallery_images as $gallery ) { if ( isset( $gallery['src'] ) ) { try { - $upload = MainWP_Helper::upload_image( $gallery['src'], $gallery ); // Upload image to WP. + $upload = MainWP_Utility::upload_image( $gallery['src'], $gallery ); // Upload image to WP. if ( null !== $upload ) { $replaceAttachedIds[ $gallery['id'] ] = $upload['id']; } @@ -1145,7 +1145,7 @@ class MainWP_Child_Posts { // upload image if it on the server. if ( ! empty( $_seo_opengraph_image ) && false !== strpos( $_seo_opengraph_image, $_server_domain ) ) { try { - $upload = MainWP_Helper::upload_image( $_seo_opengraph_image ); // Upload image to WP. + $upload = MainWP_Utility::upload_image( $_seo_opengraph_image ); // Upload image to WP. if ( null !== $upload ) { update_post_meta( $new_post_id, WPSEO_Meta::$meta_prefix . 'opengraph-image', $upload['url'] ); // Add the image to the post! } @@ -1161,7 +1161,7 @@ class MainWP_Child_Posts { // If featured image exists - set it. if ( null !== $post_featured_image ) { try { - $upload = MainWP_Helper::upload_image( $post_featured_image, array(), $check_image_existed, $new_post_id ); // Upload image to WP. + $upload = MainWP_Utility::upload_image( $post_featured_image, array(), $check_image_existed, $new_post_id ); // Upload image to WP. if ( null !== $upload ) { update_post_meta( $new_post_id, '_thumbnail_id', $upload['id'] ); // Add the thumbnail to the post! $featured_image_exist = true; diff --git a/class/class-mainwp-child-server-information.php b/class/class-mainwp-child-server-information.php index d01c246..d7cf668 100644 --- a/class/class-mainwp-child-server-information.php +++ b/class/class-mainwp-child-server-information.php @@ -472,7 +472,7 @@ class MainWP_Child_Server_Information {

- + diff --git a/class/class-mainwp-child-stats.php b/class/class-mainwp-child-stats.php index c346c6b..ff545f8 100644 --- a/class/class-mainwp-child-stats.php +++ b/class/class-mainwp-child-stats.php @@ -86,8 +86,7 @@ class MainWP_Child_Stats { include_once ABSPATH . '/wp-admin/includes/update.php'; $timeout = 3 * 60 * 60; - set_time_limit( $timeout ); - ini_set( 'max_execution_time', $timeout ); //phpcs:ignore -- to custom + MainWP_Helper::set_limit( $timeout ); // Check for new versions. $information['wp_updates'] = $this->stats_wp_update(); @@ -352,6 +351,7 @@ class MainWP_Child_Stats { } private function stats_wp_update() { + global $wp_version; $result = null; // Check for new versions. if ( null !== $this->filterFunction ) { @@ -535,7 +535,7 @@ class MainWP_Child_Stats { public function get_total_file_size( $directory = WP_CONTENT_DIR ) { try { - if ( MainWP_Helper::function_exists( 'popen' ) ) { + if ( MainWP_Helper::funct_exists( 'popen' ) ) { $uploadDir = MainWP_Helper::get_mainwp_dir(); $uploadDir = $uploadDir[0]; $popenHandle = popen( 'du -s ' . $directory . ' --exclude "' . str_replace( ABSPATH, '', $uploadDir ) . '"', 'r' ); // phpcs:ignore -- run if enabled. @@ -549,7 +549,7 @@ class MainWP_Child_Stats { } } - if ( MainWP_Helper::function_exists( 'shell_exec' ) ) { + if ( MainWP_Helper::funct_exists( 'shell_exec' ) ) { $uploadDir = MainWP_Helper::get_mainwp_dir(); $uploadDir = $uploadDir[0]; $size = shell_exec( 'du -s ' . $directory . ' --exclude "' . str_replace( ABSPATH, '', $uploadDir ) . '"' ); // phpcs:ignore -- run if enabled. diff --git a/class/class-mainwp-child-updraft-plus-backups.php b/class/class-mainwp-child-updraft-plus-backups.php index ce51434..4553d1a 100644 --- a/class/class-mainwp-child-updraft-plus-backups.php +++ b/class/class-mainwp-child-updraft-plus-backups.php @@ -3508,12 +3508,39 @@ ENDHERE; foreach ( $remove_hooks as $hook_name => $hooks ) { foreach ( $hooks as $class_name => $methods ) { foreach ( $methods as $method => $priority ) { - MainWP_Helper::remove_filters_for_anonymous_class( $hook_name, $class_name, $method, $priority ); + self::remove_filters_for_anonymous_class( $hook_name, $class_name, $method, $priority ); } } } } + + /** + * Allow to remove method for an hook when, it's a class method used and class don't have variable, but you know the class name :) + * Credit to the : wp-filters-extras + */ + public static function remove_filters_for_anonymous_class( $hook_name = '', $class_name = '', $method_name = '', $priority = 0 ) { + global $wp_filter; + + // Take only filters on right hook name and priority. + if ( ! isset( $wp_filter[ $hook_name ] ) || ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) { + return false; + } + + // Loop on filters registered. + foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) { + // Test if filter is an array ! (always for class/method). + if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) ) { + // Test if object is a class, class and method is equal to param ! + if ( is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) === $class_name && $filter_array['function'][1] === $method_name ) { + unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] ); + } + } + } + + return false; + } + public function wp_before_admin_bar_render() { global $wp_admin_bar; diff --git a/class/class-mainwp-child-wp-rocket.php b/class/class-mainwp-child-wp-rocket.php index 2a144e5..0f2c3ab 100644 --- a/class/class-mainwp-child-wp-rocket.php +++ b/class/class-mainwp-child-wp-rocket.php @@ -153,11 +153,39 @@ class MainWP_Child_WP_Rocket { ); foreach ( $remove_hooks as $hook_name => $hooks ) { foreach ( $hooks as $method => $priority ) { - MainWP_Helper::remove_filters_with_method_name( $hook_name, $method, $priority ); + self::remove_filters_with_method_name( $hook_name, $method, $priority ); } } } + + /** + * Credit to the : wp-filters-extras + */ + public static function remove_filters_with_method_name( $hook_name = '', $method_name = '', $priority = 0 ) { + + global $wp_filter; + // Take only filters on right hook name and priority. + if ( ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) { + return false; + } + // Loop on filters registered. + foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) { + // Test if filter is an array ! (always for class/method). + if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) ) { + // Test if object is a class and method is equal to param ! + if ( is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && $filter_array['function'][1] == $method_name ) { + // Test for WordPress >= 4.7 WP_Hook class. + if ( is_a( $wp_filter[ $hook_name ], 'WP_Hook' ) ) { + unset( $wp_filter[ $hook_name ]->callbacks[ $priority ][ $unique_id ] ); + } else { + unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] ); + } + } + } + } + return false; + } public function wp_before_admin_bar_render() { global $wp_admin_bar; diff --git a/class/class-mainwp-child.php b/class/class-mainwp-child.php index 56d062f..bddf09f 100644 --- a/class/class-mainwp-child.php +++ b/class/class-mainwp-child.php @@ -27,12 +27,6 @@ class MainWP_Child { public $plugin_slug; private $plugin_dir; - - public static $brandingTitle = null; - - public static $subPages; - public static $subPagesLoaded = false; - public function __construct( $plugin_file ) { $this->update(); $this->load_all_options(); @@ -42,13 +36,13 @@ class MainWP_Child { add_action( 'template_redirect', array( $this, 'template_redirect' ) ); add_action( 'init', array( &$this, 'check_login' ), 1 ); - add_action( 'init', array( &$this, 'parse_init' ), 9999 ); - add_action( 'admin_menu', array( &$this, 'admin_menu' ) ); - add_action( 'admin_init', array( &$this, 'admin_init' ) ); - add_action( 'admin_head', array( &$this, 'admin_head' ) ); + add_action( 'init', array( &$this, 'parse_init' ), 9999 ); add_action( 'init', array( &$this, 'localization' ), 33 ); + add_action( 'admin_init', array( &$this, 'admin_init' ) ); add_action( 'pre_current_active_plugins', array( MainWP_Child_Updates::get_instance(), 'detect_premium_themesplugins_updates' ) ); // to support detect premium plugins update. add_action( 'core_upgrade_preamble', array( MainWP_Child_Updates::get_instance(), 'detect_premium_themesplugins_updates' ) ); // to support detect premium themes. + + MainWP_Pages::get_instance()->init(); if ( is_admin() ) { MainWP_Helper::update_option( 'mainwp_child_plugin_version', self::$version, 'yes' ); @@ -56,20 +50,18 @@ class MainWP_Child { MainWP_Connect::instance()->check_other_auth(); + // init functions. MainWP_Clone::get()->init(); MainWP_Child_Server_Information::init(); MainWP_Client_Report::instance()->init(); MainWP_Child_Plugins_Check::instance(); MainWP_Child_Themes_Check::instance(); MainWP_Utility::instance()->run_saved_snippets(); - + if ( ! get_option( 'mainwp_child_pubkey' ) ) { MainWP_Child_Branding::instance()->save_branding_options( 'branding_disconnected', 'yes' ); } - add_action( 'admin_notices', array( &$this, 'admin_notice' ) ); - add_filter( 'plugin_row_meta', array( &$this, 'plugin_row_meta' ), 10, 2 ); - if ( defined( 'DOING_CRON' ) && DOING_CRON ) { if ( isset( $_GET['mainwp_child_run'] ) && ! empty( $_GET['mainwp_child_run'] ) ) { add_action( 'init', array( MainWP_Utility::get_class_name(), 'cron_active' ), PHP_INT_MAX ); @@ -295,33 +287,6 @@ class MainWP_Child { MainWP_Helper::update_option( 'mainwp_child_update_version', $this->update_version, 'yes' ); } - - public function admin_notice() { - // Admin Notice... - if ( ! get_option( 'mainwp_child_pubkey' ) && MainWP_Helper::is_admin() && is_admin() ) { - $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); - $child_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Child' : $branding_opts['branding_preserve_title']; - $dashboard_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Dashboard' : $branding_opts['branding_preserve_title'] . ' Dashboard'; - - $msg = '

'; - $msg .= __( 'Attention!', 'mainwp-child' ); - $msg .= '

'; - $msg .= __( 'Please add this site to your ', 'mainwp-child' ) . $dashboard_name . ' ' . __( 'NOW or deactivate the ', 'mainwp-child' ) . $child_name . __( ' plugin until you are ready to connect this site to your Dashboard in order to avoid unexpected security issues.', 'mainwp-child' ); - $msg .= '

'; - $msg .= '

'; - $msg .= __( 'If you are not sure how to add this site to your Dashboard, please review these instructions.', 'mainwp-child' ); - $msg .= '

'; - if ( ! MainWP_Child_Branding::instance()->is_branding() ) { - $msg .= '

'; - $msg .= __( 'You can also turn on the unique security ID option in ', 'mainwp-child' ) . $child_name . __( ' settings if you would like extra security and additional time to add this site to your Dashboard.
Find out more in this help document How do I use the child unique security ID?', 'mainwp-child' ); - $msg .= '

'; - } - $msg .= '
'; - echo wp_kses_post( $msg ); - } - MainWP_Child_Server_Information::show_warnings(); - } - public function localization() { load_plugin_textdomain( 'mainwp-child', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' ); } @@ -330,432 +295,6 @@ class MainWP_Child { MainWP_Utility::instance()->maintenance_alert(); } - public function plugin_row_meta( $plugin_meta, $plugin_file ) { - if ( $this->plugin_slug !== $plugin_file ) { - return $plugin_meta; - } - - return apply_filters( 'mainwp_child_plugin_row_meta', $plugin_meta, $plugin_file, $this->plugin_slug ); - } - - public function admin_menu() { - $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); - $is_hide = isset( $branding_opts['hide'] ) ? $branding_opts['hide'] : ''; - $cancelled_branding = $branding_opts['cancelled_branding']; - - if ( isset( $branding_opts['remove_wp_tools'] ) && $branding_opts['remove_wp_tools'] && ! $cancelled_branding ) { - remove_menu_page( 'tools.php' ); - $pos = stripos( $_SERVER['REQUEST_URI'], 'tools.php' ) || stripos( $_SERVER['REQUEST_URI'], 'import.php' ) || stripos( $_SERVER['REQUEST_URI'], 'export.php' ); - if ( false !== $pos ) { - wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); - } - } - // if preserve branding and do not remove menus. - if ( isset( $branding_opts['remove_wp_setting'] ) && $branding_opts['remove_wp_setting'] && ! $cancelled_branding ) { - remove_menu_page( 'options-general.php' ); - $pos = stripos( $_SERVER['REQUEST_URI'], 'options-general.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-writing.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-reading.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-discussion.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-media.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); - if ( false !== $pos ) { - wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); - exit(); - } - } - - if ( isset( $branding_opts['remove_permalink'] ) && $branding_opts['remove_permalink'] && ! $cancelled_branding ) { - remove_submenu_page( 'options-general.php', 'options-permalink.php' ); - $pos = stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); - if ( false !== $pos ) { - wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); - exit(); - } - } - - $remove_all_child_menu = false; - if ( isset( $branding_opts['remove_setting'] ) && isset( $branding_opts['remove_restore'] ) && isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_setting'] && $branding_opts['remove_restore'] && $branding_opts['remove_server_info'] ) { - $remove_all_child_menu = true; - } - - // if preserve branding and do not hide menus. - if ( ( ! $remove_all_child_menu && 'T' !== $is_hide ) || $cancelled_branding ) { - $branding_header = isset( $branding_opts['branding_header'] ) ? $branding_opts['branding_header'] : array(); - if ( ( is_array( $branding_header ) && ! empty( $branding_header['name'] ) ) && ! $cancelled_branding ) { - self::$brandingTitle = stripslashes( $branding_header['name'] ); - $child_menu_title = stripslashes( $branding_header['name'] ); - $child_page_title = $child_menu_title . ' Settings'; - } else { - $child_menu_title = 'MainWP Child'; - $child_page_title = 'MainWPSettings'; - } - - $settingsPage = add_submenu_page( 'options-general.php', $child_menu_title, $child_menu_title, 'manage_options', 'mainwp_child_tab', array( &$this, 'render_pages' ) ); - - add_action( 'admin_print_scripts-' . $settingsPage, array( MainWP_Clone::get_class_name(), 'print_scripts' ) ); - $subpageargs = array( - 'child_slug' => 'options-general.php', - 'branding' => ( null === self::$brandingTitle ) ? 'MainWP' : self::$brandingTitle, - 'parent_menu' => $settingsPage, - ); - - do_action_deprecated( 'mainwp-child-subpages', array( $subpageargs ), '4.0.7.1', 'mainwp_child_subpages' ); - do_action( 'mainwp_child_subpages', $subpageargs ); - - $sub_pages = array(); - - $all_subpages = apply_filters_deprecated( 'mainwp-child-init-subpages', array( array() ), '4.0.7.1', 'mainwp_child_init_subpages' ); - $all_subpages = apply_filters( 'mainwp_child_init_subpages', $all_subpages ); - - if ( ! is_array( $all_subpages ) ) { - $all_subpages = array(); - } - - if ( ! self::$subPagesLoaded ) { - foreach ( $all_subpages as $page ) { - $slug = isset( $page['slug'] ) ? $page['slug'] : ''; - if ( empty( $slug ) ) { - continue; - } - $subpage = array(); - $subpage['slug'] = $slug; - $subpage['title'] = $page['title']; - $subpage['page'] = 'mainwp-' . str_replace( ' ', '-', strtolower( str_replace( '-', ' ', $slug ) ) ); - if ( isset( $page['callback'] ) ) { - $subpage['callback'] = $page['callback']; - $created_page = add_submenu_page( 'options-general.php', $subpage['title'], '
' . $subpage['title'] . '
', 'manage_options', $subpage['page'], $subpage['callback'] ); - if ( isset( $page['load_callback'] ) ) { - $subpage['load_callback'] = $page['load_callback']; - add_action( 'load-' . $created_page, $subpage['load_callback'] ); - } - } - $sub_pages[] = $subpage; - } - self::$subPages = $sub_pages; - self::$subPagesLoaded = true; - } - add_action( 'mainwp-child-pageheader', array( __CLASS__, 'render_header' ) ); - add_action( 'mainwp-child-pagefooter', array( __CLASS__, 'render_footer' ) ); - - global $submenu; - if ( isset( $submenu['options-general.php'] ) ) { - foreach ( $submenu['options-general.php'] as $index => $item ) { - if ( 'mainwp-reports-page' === $item[2] || 'mainwp-reports-settings' === $item[2] ) { - unset( $submenu['options-general.php'][ $index ] ); - } - } - } - } - } - - public function render_pages( $shownPage ) { - $shownPage = ''; - if ( isset( $_GET['tab'] ) ) { - $shownPage = $_GET['tab']; - } - $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); - - $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; - $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; - $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; - $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; - - $hide_style = 'style="display:none"'; - - if ( '' == $shownPage ) { - if ( ! $hide_settings ) { - $shownPage = 'settings'; - } elseif ( ! $hide_restore ) { - $shownPage = 'restore-clone'; - } elseif ( ! $hide_server_info ) { - $shownPage = 'server-info'; - } elseif ( ! $hide_connection_detail ) { - $shownPage = 'connection-detail'; - } - } - - if ( ! $hide_restore ) { - if ( '' === session_id() ) { - session_start(); - } - } - - self::render_header( $shownPage, false ); - ?> - -
> - render_settings(); ?> -
- - - -
> - -
- - - -
> - -
- - - -
> - -
- - - - - get_branding_options(); - - $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; - $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; - $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; - $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; - - $sitesToClone = get_option( 'mainwp_child_clone_sites' ); - - ?> - - -
-

-

-
- - - - - - - - - - - - - - - -
-
-
- - -
- - -
-
- init_ajax(); - } - } - - public function admin_head() { - if ( isset( $_GET['page'] ) && 'mainwp_child_tab' == $_GET['page'] ) { - ?> - - -
-

-
-
-
-
- - /> - -
-
- ' . esc_html__( 'Your unique security ID is:', 'mainwp-child' ) . ' ' . esc_html( get_option( 'mainwp_child_uniqueId' ) ) . ''; - } - ?> -
-

- -

- - -
-
- - register_site(); // register the site. + MainWP_Connect::instance()->register_site(); // register the site and exit. } - // if auth connect are not valid then exit or return. - if ( ! MainWP_Connect::instance()->parse_init_auth() ) { + // auth here. + $auth = MainWP_Connect::instance()->auth( isset( $_POST['mainwpsignature'] ) ? $_POST['mainwpsignature'] : '', isset( $_POST['function'] ) ? $_POST['function'] : '', isset( $_POST['nonce'] ) ? $_POST['nonce'] : '', isset( $_POST['nossl'] ) ? $_POST['nossl'] : 0 ); + + // parse auth, if it is not correct actions then exit with message or return. + if ( ! MainWP_Connect::instance()->parse_init_auth( $auth ) ) { return; } - - $auth = MainWP_Connect::instance()->auth( isset( $_POST['mainwpsignature'] ) ? $_POST['mainwpsignature'] : '', isset( $_POST['function'] ) ? $_POST['function'] : '', isset( $_POST['nonce'] ) ? $_POST['nonce'] : '', isset( $_POST['nossl'] ) ? $_POST['nossl'] : 0 ); - - if ( ! $auth && isset( $_POST['mainwpsignature'] ) ) { - MainWP_Helper::error( __( 'Authentication failed! Please deactivate & re-activate the MainWP Child plugin on this site and try again.', 'mainwp-child' ) ); - } - - if ( ! $auth && isset( $_POST['function'] ) ) { - $func = $_POST['function']; - $callable = MainWP_Child_Callable::get_instance()->is_callable_function( $func ); - $callable_no_auth = MainWP_Child_Callable::get_instance()->is_callable_function_no_auth( $func ); - - if ( $callable && ! $callable_no_auth ) { - MainWP_Helper::error( __( 'Authentication failed! Please deactivate & re-activate the MainWP Child plugin on this site and try again.', 'mainwp-child' ) ); - } - } - - if ( $auth ) { - $auth_user = false; - // Check if the user exists & is an administrator. - if ( isset( $_POST['function'] ) && isset( $_POST['user'] ) ) { - - $user = null; - if ( isset( $_POST['alt_user'] ) && ! empty( $_POST['alt_user'] ) ) { - if ( MainWP_Connect::instance()->check_login_as( $_POST['alt_user'] ) ) { - $auth_user = $_POST['alt_user']; - $user = get_user_by( 'login', $auth_user ); - } - } - - // if alternative admin not existed. - if ( ! $user ) { - // check connected admin existed. - $user = get_user_by( 'login', $_POST['user'] ); - $auth_user = $_POST['user']; - } - - if ( ! $user ) { - MainWP_Helper::error( __( 'Unexising administrator username. Please verify that it is an existing administrator.', 'mainwp-child' ) ); - } - - if ( 10 != $user->wp_user_level && ( ! isset( $user->user_level ) || 10 != $user->user_level ) && ! $user->has_cap( 'level_10' ) ) { - MainWP_Helper::error( __( 'Invalid user. Please verify that the user has administrator privileges.', 'mainwp-child' ) ); - } - - MainWP_Connect::instance()->login( $auth_user ); - } - - if ( isset( $_POST['function'] ) && 'visitPermalink' === $_POST['function'] ) { - - if ( empty( $auth_user ) ) { - $auth_user = $_POST['user']; - } - - if ( MainWP_Connect::instance()->login( $auth_user, true ) ) { - return; - } else { - exit(); - } - } - - // Redirect to the admin side if needed. - if ( isset( $_POST['admin'] ) && '1' === $_POST['admin'] ) { - wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/' ); - die(); - } - } - - // Init extensions. - MainWP_Clone::get()->init(); - MainWP_Child_Server_Information::init(); - MainWP_Client_Report::instance()->init(); - MainWP_Child_Plugins_Check::instance(); - MainWP_Child_Themes_Check::instance(); - MainWP_Utility::instance()->run_saved_snippets(); - + + $this->parse_init_extensions(); + global $_wp_submenu_nopriv; if ( null === $_wp_submenu_nopriv ) { $_wp_submenu_nopriv = array(); // phpcs:ignore -- to fix warning. } + // execute callable functions here. MainWP_Child_Callable::get_instance()->init_call_functions( $auth ); MainWP_Keyword_Links::instance()->parse_init_keyword_links(); @@ -900,7 +370,13 @@ class MainWP_Child { public function check_login() { MainWP_Connect::instance()->check_login(); } - + + public function admin_init() { + if ( MainWP_Helper::is_admin() && is_admin() ) { + MainWP_Clone::get()->init_ajax(); + } + } + private function parse_init_extensions() { // Handle fatal errors for those init if needed. MainWP_Child_Branding::instance()->branding_init(); diff --git a/class/class-mainwp-connect.php b/class/class-mainwp-connect.php index a82752a..67f2ece 100644 --- a/class/class-mainwp-connect.php +++ b/class/class-mainwp-connect.php @@ -86,15 +86,13 @@ class MainWP_Connect { $information['uniqueId'] = get_option( 'mainwp_child_uniqueId', '' ); $information['user'] = $_POST['user']; - MainWP_Child_Stats::get_instance()->get_site_stats( $information ); + MainWP_Child_Stats::get_instance()->get_site_stats( $information ); // get stats and exit. } - public function parse_init_auth() { - - $auth = $this->auth( isset( $_POST['mainwpsignature'] ) ? $_POST['mainwpsignature'] : '', isset( $_POST['function'] ) ? $_POST['function'] : '', isset( $_POST['nonce'] ) ? $_POST['nonce'] : '', isset( $_POST['nossl'] ) ? $_POST['nossl'] : 0 ); - - if ( ! $auth && isset( $_POST['mainwpsignature'] ) ) { + public function parse_init_auth( $auth = false ) { + + if ( ! $auth && isset( $_POST['mainwpsignature'] ) ) { // with 'mainwpsignature' then need to callable functions. MainWP_Helper::error( __( 'Authentication failed! Please deactivate & re-activate the MainWP Child plugin on this site and try again.', 'mainwp-child' ) ); } @@ -117,6 +115,7 @@ class MainWP_Connect { if ( isset( $_POST['alt_user'] ) && ! empty( $_POST['alt_user'] ) ) { if ( $this->check_login_as( $_POST['alt_user'] ) ) { $auth_user = $_POST['alt_user']; + // get alternative admin user. $user = get_user_by( 'login', $auth_user ); } } @@ -136,6 +135,7 @@ class MainWP_Connect { MainWP_Helper::error( __( 'Invalid user. Please verify that the user has administrator privileges.', 'mainwp-child' ) ); } + // try to login. $this->login( $auth_user ); } @@ -144,7 +144,7 @@ class MainWP_Connect { if ( empty( $auth_user ) ) { $auth_user = $_POST['user']; } - + // try to login. if ( $this->login( $auth_user, true ) ) { return false; } else { @@ -297,6 +297,7 @@ class MainWP_Connect { public function check_login() { + // to login requires 'mainwpsignature'. if ( ! isset( $_POST['mainwpsignature'] ) || empty( $_POST['mainwpsignature'] ) ) { return false; } diff --git a/class/class-mainwp-custom-post-type.php b/class/class-mainwp-custom-post-type.php index 3693516..293e122 100755 --- a/class/class-mainwp-custom-post-type.php +++ b/class/class-mainwp-custom-post-type.php @@ -101,7 +101,7 @@ class MainWP_Custom_Post_Type { } try { - $downloadfile = MainWP_Helper::upload_image( $originalImgUrl, array(), $check_image ); + $downloadfile = MainWP_Utility::upload_image( $originalImgUrl, array(), $check_image ); $localUrl = $downloadfile['url']; $linkToReplaceWith = dirname( $localUrl ); if ( '' !== $hrefLink ) { @@ -230,7 +230,7 @@ class MainWP_Custom_Post_Type { if ( isset( $data['extras']['woocommerce']['product_images'] ) ) { foreach ( $data['extras']['woocommerce']['product_images'] as $product_image ) { try { - $upload_featured_image = MainWP_Helper::upload_image( $product_image, array(), $check_image_existed ); + $upload_featured_image = MainWP_Utility::upload_image( $product_image, array(), $check_image_existed ); if ( null !== $upload_featured_image ) { $product_image_gallery[] = $upload_featured_image['id']; @@ -251,7 +251,7 @@ class MainWP_Custom_Post_Type { if ( '_thumbnail_id' == $key['meta_key'] ) { if ( isset( $data['extras']['featured_image'] ) ) { try { - $upload_featured_image = MainWP_Helper::upload_image( $data['extras']['featured_image'], array(), $check_image_existed ); + $upload_featured_image = MainWP_Utility::upload_image( $data['extras']['featured_image'], array(), $check_image_existed ); if ( null !== $upload_featured_image ) { $key['meta_value'] = $upload_featured_image['id']; diff --git a/class/class-mainwp-helper.php b/class/class-mainwp-helper.php index a4c2ade..f70e485 100644 --- a/class/class-mainwp-helper.php +++ b/class/class-mainwp-helper.php @@ -64,7 +64,7 @@ class MainWP_Helper { if ( null !== $code ) { $information['error_code'] = $code; } - self::instance()->write( $information ); + mainwp_child_helper()->write( $information ); } /** @@ -158,135 +158,6 @@ class MainWP_Helper { return $output; } - // $check_file_existed: to support checking if file existed. - // $parent_id: optional. - public static function upload_image( $img_url, $img_data = array(), $check_file_existed = false, $parent_id = 0 ) { - if ( ! is_array( $img_data ) ) { - $img_data = array(); - } - - /** @var $wp_filesystem WP_Filesystem_Base */ - global $wp_filesystem; - self::get_wp_filesystem(); - - include_once ABSPATH . 'wp-admin/includes/file.php'; - $upload_dir = wp_upload_dir(); - add_filter( 'http_request_args', array( self::get_class_name(), 'reject_unsafe_urls' ), 99, 2 ); - $temporary_file = download_url( $img_url ); - remove_filter( 'http_request_args', array( self::get_class_name(), 'reject_unsafe_urls' ), 99, 2 ); - - if ( is_wp_error( $temporary_file ) ) { - throw new \Exception( 'Error: ' . $temporary_file->get_error_message() ); - } else { - $filename = basename( $img_url ); - $local_img_path = $upload_dir['path'] . DIRECTORY_SEPARATOR . $filename; - $local_img_url = $upload_dir['url'] . '/' . basename( $local_img_path ); - - // to fix issue re-create new attachment. - if ( $check_file_existed ) { - $result = self::check_media_file_existed( $upload_dir, $filename, $temporary_file, $local_img_path, $local_img_url ); - if ( ! empty( $result ) ) { - return $result; - } - } - - // file exists, do not overwrite, generate unique file name. - // this may causing of issue incorrect source of image in post content. - if ( $wp_filesystem->exists( $local_img_path ) ) { - $local_img_path = dirname( $local_img_path ) . '/' . wp_unique_filename( dirname( $local_img_path ), basename( $local_img_path ) ); - $local_img_url = $upload_dir['url'] . '/' . basename( $local_img_path ); - } - - $moved = $wp_filesystem->move( $temporary_file, $local_img_path ); - if ( $moved ) { - return self::insert_attachment_media( $img_data, $img_url, $parent_id, $local_img_path, $local_img_url ); - } - } - - if ( $wp_filesystem->exists( $temporary_file ) ) { - $wp_filesystem->delete( $temporary_file ); - } - return null; - } - - private static function check_media_file_existed( $upload_dir, $filename, $temporary_file, &$local_img_path, $local_img_url ) { - global $wp_filesystem; - if ( $wp_filesystem->exists( $local_img_path ) ) { - if ( filesize( $local_img_path ) == filesize( $temporary_file ) ) { - $result = self::get_maybe_existed_attached_id( $local_img_url ); - if ( is_array( $result ) ) { - $attach = current( $result ); - if ( is_object( $attach ) ) { - if ( $wp_filesystem->exists( $temporary_file ) ) { - $wp_filesystem->delete( $temporary_file ); - } - return array( - 'id' => $attach->ID, - 'url' => $local_img_url, - ); - } - } - } - } else { - $result = self::get_maybe_existed_attached_id( $filename, false ); - if ( is_array( $result ) ) { - $attach = current( $result ); - if ( is_object( $attach ) ) { - $basedir = $upload_dir['basedir']; - $baseurl = $upload_dir['baseurl']; - $local_img_path = str_replace( $baseurl, $basedir, $attach->guid ); - if ( $wp_filesystem->exists( $local_img_path ) && ( $wp_filesystem->size( $local_img_path ) == $wp_filesystem->size( $temporary_file ) ) ) { - if ( $wp_filesystem->exists( $temporary_file ) ) { - $wp_filesystem->delete( $temporary_file ); - } - return array( - 'id' => $attach->ID, - 'url' => $attach->guid, - ); - } - } - } - } - } - - private static function insert_attachment_media( $img_data, $img_url, $parent_id, $local_img_path, $local_img_url ) { - - $wp_filetype = wp_check_filetype( basename( $img_url ), null ); // Get the filetype to set the mimetype. - $attachment = array( - 'post_mime_type' => $wp_filetype['type'], - 'post_title' => isset( $img_data['title'] ) && ! empty( $img_data['title'] ) ? $img_data['title'] : preg_replace( '/\.[^.]+$/', '', basename( $img_url ) ), - 'post_content' => isset( $img_data['description'] ) && ! empty( $img_data['description'] ) ? $img_data['description'] : '', - 'post_excerpt' => isset( $img_data['caption'] ) && ! empty( $img_data['caption'] ) ? $img_data['caption'] : '', - 'post_status' => 'inherit', - 'guid' => $local_img_url, - ); - - // for post attachments, thumbnail. - if ( $parent_id ) { - $attachment['post_parent'] = $parent_id; - } - - $attach_id = wp_insert_attachment( $attachment, $local_img_path ); // Insert the image in the database. - require_once ABSPATH . 'wp-admin/includes/image.php'; - $attach_data = wp_generate_attachment_metadata( $attach_id, $local_img_path ); - wp_update_attachment_metadata( $attach_id, $attach_data ); // Update generated metadata. - if ( isset( $img_data['alt'] ) && ! empty( $img_data['alt'] ) ) { - update_post_meta( $attach_id, '_wp_attachment_image_alt', $img_data['alt'] ); - } - return array( - 'id' => $attach_id, - 'url' => $local_img_url, - ); - } - - public static function get_maybe_existed_attached_id( $filename, $full_guid = true ) { - global $wpdb; - if ( $full_guid ) { - return $wpdb->get_results( $wpdb->prepare( "SELECT ID,guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid = %s", $filename ) ); - } - return $wpdb->get_results( $wpdb->prepare( "SELECT ID,guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid LIKE %s", '%/' . $wpdb->esc_like( $filename ) ) ); - } - public static function get_mainwp_dir( $what = null, $dieOnError = true ) { /** @var $wp_filesystem WP_Filesystem_Base */ global $wp_filesystem; @@ -633,7 +504,7 @@ class MainWP_Helper { rmdir( $dir ); } - public static function function_exists( $func ) { + public static function funct_exists( $func ) { if ( ! function_exists( $func ) ) { return false; } @@ -884,62 +755,6 @@ class MainWP_Helper { return $arr; } - /** - * Allow to remove method for an hook when, it's a class method used and class don't have variable, but you know the class name :) - * Credit to the : wp-filters-extras - */ - - public static function remove_filters_for_anonymous_class( $hook_name = '', $class_name = '', $method_name = '', $priority = 0 ) { - global $wp_filter; - - // Take only filters on right hook name and priority. - if ( ! isset( $wp_filter[ $hook_name ] ) || ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) { - return false; - } - - // Loop on filters registered. - foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) { - // Test if filter is an array ! (always for class/method). - if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) ) { - // Test if object is a class, class and method is equal to param ! - if ( is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) === $class_name && $filter_array['function'][1] === $method_name ) { - unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] ); - } - } - } - - return false; - } - - /** - * Credit to the : wp-filters-extras - */ - - public static function remove_filters_with_method_name( $hook_name = '', $method_name = '', $priority = 0 ) { - - global $wp_filter; - // Take only filters on right hook name and priority. - if ( ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) { - return false; - } - // Loop on filters registered. - foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) { - // Test if filter is an array ! (always for class/method). - if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) ) { - // Test if object is a class and method is equal to param ! - if ( is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && $filter_array['function'][1] == $method_name ) { - // Test for WordPress >= 4.7 WP_Hook class. - if ( is_a( $wp_filter[ $hook_name ], 'WP_Hook' ) ) { - unset( $wp_filter[ $hook_name ]->callbacks[ $priority ][ $unique_id ] ); - } else { - unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] ); - } - } - } - } - return false; - } - public static function sanitize_filename( $filename ) { if ( ! function_exists( 'mb_ereg_replace' ) ) { return sanitize_file_name( $filename ); @@ -1168,28 +983,6 @@ class MainWP_Helper { return true; } - - /** - * Handle fatal error for requests from the dashboard - * mwp_action requests - * wordpress_seo requests - * This will do not handle fatal error for sync request from the dashboard - */ - public static function handle_fatal_error() { - - function handle_shutdown() { - // handle fatal errors and compile errors. - $error = error_get_last(); - if ( isset( $error['type'] ) && isset( $error['message'] ) && ( E_ERROR === $error['type'] || E_COMPILE_ERROR === $error['type'] ) ) { - self::instance()->write( array( 'error' => 'MainWP_Child fatal error : ' . $error['message'] . ' Line: ' . $error['line'] . ' File: ' . $error['file'] ) ); - } - } - - if ( isset( $_POST['function'] ) && isset( $_POST['mainwpsignature'] ) && ( isset( $_POST['mwp_action'] ) || 'wordpress_seo' == $_POST['function'] ) ) { - register_shutdown_function( 'handle_shutdown' ); - } - } - /** * Method execute_snippet() * @@ -1221,4 +1014,14 @@ class MainWP_Helper { error_log( $msg ); // phpcs:ignore -- debug mode only. } } + + public static function set_limit( $timeout, $mem = false ){ + // phpcs:disable + if ( ! empty( $mem ) ) { + ini_set( 'memory_limit', $mem ); + } + set_time_limit( $timeout ); + ini_set( 'max_execution_time', $timeout ); + // phpcs:enable + } } diff --git a/class/class-mainwp-pages.php b/class/class-mainwp-pages.php new file mode 100644 index 0000000..5f11750 --- /dev/null +++ b/class/class-mainwp-pages.php @@ -0,0 +1,493 @@ +get_branding_options(); + $child_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Child' : $branding_opts['branding_preserve_title']; + $dashboard_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Dashboard' : $branding_opts['branding_preserve_title'] . ' Dashboard'; + + $msg = '

'; + $msg .= __( 'Attention!', 'mainwp-child' ); + $msg .= '

'; + $msg .= __( 'Please add this site to your ', 'mainwp-child' ) . $dashboard_name . ' ' . __( 'NOW or deactivate the ', 'mainwp-child' ) . $child_name . __( ' plugin until you are ready to connect this site to your Dashboard in order to avoid unexpected security issues.', 'mainwp-child' ); + $msg .= '

'; + $msg .= '

'; + $msg .= __( 'If you are not sure how to add this site to your Dashboard, please review these instructions.', 'mainwp-child' ); + $msg .= '

'; + if ( ! MainWP_Child_Branding::instance()->is_branding() ) { + $msg .= '

'; + $msg .= __( 'You can also turn on the unique security ID option in ', 'mainwp-child' ) . $child_name . __( ' settings if you would like extra security and additional time to add this site to your Dashboard.
Find out more in this help document How do I use the child unique security ID?', 'mainwp-child' ); + $msg .= '

'; + } + $msg .= '
'; + echo wp_kses_post( $msg ); + } + MainWP_Child_Server_Information::show_warnings(); + } + + public function admin_menu() { + $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); + $is_hide = isset( $branding_opts['hide'] ) ? $branding_opts['hide'] : ''; + $cancelled_branding = $branding_opts['cancelled_branding']; + + if ( isset( $branding_opts['remove_wp_tools'] ) && $branding_opts['remove_wp_tools'] && ! $cancelled_branding ) { + remove_menu_page( 'tools.php' ); + $pos = stripos( $_SERVER['REQUEST_URI'], 'tools.php' ) || stripos( $_SERVER['REQUEST_URI'], 'import.php' ) || stripos( $_SERVER['REQUEST_URI'], 'export.php' ); + if ( false !== $pos ) { + wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); + } + } + // if preserve branding and do not remove menus. + if ( isset( $branding_opts['remove_wp_setting'] ) && $branding_opts['remove_wp_setting'] && ! $cancelled_branding ) { + remove_menu_page( 'options-general.php' ); + $pos = stripos( $_SERVER['REQUEST_URI'], 'options-general.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-writing.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-reading.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-discussion.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-media.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); + if ( false !== $pos ) { + wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); + exit(); + } + } + + if ( isset( $branding_opts['remove_permalink'] ) && $branding_opts['remove_permalink'] && ! $cancelled_branding ) { + remove_submenu_page( 'options-general.php', 'options-permalink.php' ); + $pos = stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); + if ( false !== $pos ) { + wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); + exit(); + } + } + + $remove_all_child_menu = false; + if ( isset( $branding_opts['remove_setting'] ) && isset( $branding_opts['remove_restore'] ) && isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_setting'] && $branding_opts['remove_restore'] && $branding_opts['remove_server_info'] ) { + $remove_all_child_menu = true; + } + + // if preserve branding and do not hide menus. + if ( ( ! $remove_all_child_menu && 'T' !== $is_hide ) || $cancelled_branding ) { + $branding_header = isset( $branding_opts['branding_header'] ) ? $branding_opts['branding_header'] : array(); + if ( ( is_array( $branding_header ) && ! empty( $branding_header['name'] ) ) && ! $cancelled_branding ) { + self::$brandingTitle = stripslashes( $branding_header['name'] ); + $child_menu_title = stripslashes( $branding_header['name'] ); + $child_page_title = $child_menu_title . ' Settings'; + } else { + $child_menu_title = 'MainWP Child'; + $child_page_title = 'MainWPSettings'; + } + + $settingsPage = add_submenu_page( 'options-general.php', $child_menu_title, $child_menu_title, 'manage_options', 'mainwp_child_tab', array( &$this, 'render_pages' ) ); + + add_action( 'admin_print_scripts-' . $settingsPage, array( MainWP_Clone::get_class_name(), 'print_scripts' ) ); + $subpageargs = array( + 'child_slug' => 'options-general.php', + 'branding' => ( null === self::$brandingTitle ) ? 'MainWP' : self::$brandingTitle, + 'parent_menu' => $settingsPage, + ); + + do_action_deprecated( 'mainwp-child-subpages', array( $subpageargs ), '4.0.7.1', 'mainwp_child_subpages' ); + do_action( 'mainwp_child_subpages', $subpageargs ); + + $sub_pages = array(); + + $all_subpages = apply_filters_deprecated( 'mainwp-child-init-subpages', array( array() ), '4.0.7.1', 'mainwp_child_init_subpages' ); + $all_subpages = apply_filters( 'mainwp_child_init_subpages', $all_subpages ); + + if ( ! is_array( $all_subpages ) ) { + $all_subpages = array(); + } + + if ( ! self::$subPagesLoaded ) { + foreach ( $all_subpages as $page ) { + $slug = isset( $page['slug'] ) ? $page['slug'] : ''; + if ( empty( $slug ) ) { + continue; + } + $subpage = array(); + $subpage['slug'] = $slug; + $subpage['title'] = $page['title']; + $subpage['page'] = 'mainwp-' . str_replace( ' ', '-', strtolower( str_replace( '-', ' ', $slug ) ) ); + if ( isset( $page['callback'] ) ) { + $subpage['callback'] = $page['callback']; + $created_page = add_submenu_page( 'options-general.php', $subpage['title'], '
' . $subpage['title'] . '
', 'manage_options', $subpage['page'], $subpage['callback'] ); + if ( isset( $page['load_callback'] ) ) { + $subpage['load_callback'] = $page['load_callback']; + add_action( 'load-' . $created_page, $subpage['load_callback'] ); + } + } + $sub_pages[] = $subpage; + } + self::$subPages = $sub_pages; + self::$subPagesLoaded = true; + } + add_action( 'mainwp-child-pageheader', array( __CLASS__, 'render_header' ) ); + add_action( 'mainwp-child-pagefooter', array( __CLASS__, 'render_footer' ) ); + + global $submenu; + if ( isset( $submenu['options-general.php'] ) ) { + foreach ( $submenu['options-general.php'] as $index => $item ) { + if ( 'mainwp-reports-page' === $item[2] || 'mainwp-reports-settings' === $item[2] ) { + unset( $submenu['options-general.php'][ $index ] ); + } + } + } + } + } + + public function plugin_row_meta( $plugin_meta, $plugin_file ) { + global $mainWPChild; + if ( $mainWPChild->plugin_slug !== $plugin_file ) { + return $plugin_meta; + } + return apply_filters( 'mainwp_child_plugin_row_meta', $plugin_meta, $plugin_file, $mainWPChild->plugin_slug ); + } + + public function render_pages( $shownPage ) { + $shownPage = ''; + if ( isset( $_GET['tab'] ) ) { + $shownPage = $_GET['tab']; + } + $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); + + $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; + $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; + $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; + $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; + + $hide_style = 'style="display:none"'; + + if ( '' == $shownPage ) { + if ( ! $hide_settings ) { + $shownPage = 'settings'; + } elseif ( ! $hide_restore ) { + $shownPage = 'restore-clone'; + } elseif ( ! $hide_server_info ) { + $shownPage = 'server-info'; + } elseif ( ! $hide_connection_detail ) { + $shownPage = 'connection-detail'; + } + } + + if ( ! $hide_restore ) { + if ( '' === session_id() ) { + session_start(); + } + } + + self::render_header( $shownPage, false ); + ?> + +
> + render_settings(); ?> +
+ + + +
> + +
+ + + +
> + +
+ + + +
> + +
+ + + + + get_branding_options(); + + $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; + $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; + $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; + $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; + + $sitesToClone = get_option( 'mainwp_child_clone_sites' ); + + ?> + + +
+

+

+
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+
+ + + +
+

+
+
+
+
+ + /> + +
+
+ ' . esc_html__( 'Your unique security ID is:', 'mainwp-child' ) . ' ' . esc_html( get_option( 'mainwp_child_uniqueId' ) ) . ''; + } + ?> +
+

+ +

+ + +
+
+ + write( array( 'error' => 'MainWP_Child fatal error : ' . $error['message'] . ' Line: ' . $error['line'] . ' File: ' . $error['file'] ) ); + } + } + + if ( isset( $_POST['function'] ) && isset( $_POST['mainwpsignature'] ) && ( isset( $_POST['mwp_action'] ) || 'wordpress_seo' == $_POST['function'] ) ) { + register_shutdown_function( 'handle_shutdown' ); + } + } + public function cron_active() { if ( ! defined( 'DOING_CRON' ) || ! DOING_CRON ) { return; @@ -207,5 +229,134 @@ class MainWP_Utility { return fclose( $handle ); } + + // $check_file_existed: to support checking if file existed. + // $parent_id: optional. + public static function upload_image( $img_url, $img_data = array(), $check_file_existed = false, $parent_id = 0 ) { + if ( ! is_array( $img_data ) ) { + $img_data = array(); + } + + /** @var $wp_filesystem WP_Filesystem_Base */ + global $wp_filesystem; + MainWP_Helper::get_wp_filesystem(); + + include_once ABSPATH . 'wp-admin/includes/file.php'; + $upload_dir = wp_upload_dir(); + add_filter( 'http_request_args', array( MainWP_Helper::get_class_name(), 'reject_unsafe_urls' ), 99, 2 ); + $temporary_file = download_url( $img_url ); + remove_filter( 'http_request_args', array( MainWP_Helper::get_class_name(), 'reject_unsafe_urls' ), 99, 2 ); + + if ( is_wp_error( $temporary_file ) ) { + throw new \Exception( 'Error: ' . $temporary_file->get_error_message() ); + } else { + $filename = basename( $img_url ); + $local_img_path = $upload_dir['path'] . DIRECTORY_SEPARATOR . $filename; + $local_img_url = $upload_dir['url'] . '/' . basename( $local_img_path ); + + // to fix issue re-create new attachment. + if ( $check_file_existed ) { + $result = self::check_media_file_existed( $upload_dir, $filename, $temporary_file, $local_img_path, $local_img_url ); + if ( ! empty( $result ) ) { + return $result; + } + } + + // file exists, do not overwrite, generate unique file name. + // this may causing of issue incorrect source of image in post content. + if ( $wp_filesystem->exists( $local_img_path ) ) { + $local_img_path = dirname( $local_img_path ) . '/' . wp_unique_filename( dirname( $local_img_path ), basename( $local_img_path ) ); + $local_img_url = $upload_dir['url'] . '/' . basename( $local_img_path ); + } + + $moved = $wp_filesystem->move( $temporary_file, $local_img_path ); + if ( $moved ) { + return self::insert_attachment_media( $img_data, $img_url, $parent_id, $local_img_path, $local_img_url ); + } + } + + if ( $wp_filesystem->exists( $temporary_file ) ) { + $wp_filesystem->delete( $temporary_file ); + } + return null; + } + + private static function check_media_file_existed( $upload_dir, $filename, $temporary_file, &$local_img_path, $local_img_url ) { + global $wp_filesystem; + if ( $wp_filesystem->exists( $local_img_path ) ) { + if ( filesize( $local_img_path ) == filesize( $temporary_file ) ) { + $result = self::get_maybe_existed_attached_id( $local_img_url ); + if ( is_array( $result ) ) { + $attach = current( $result ); + if ( is_object( $attach ) ) { + if ( $wp_filesystem->exists( $temporary_file ) ) { + $wp_filesystem->delete( $temporary_file ); + } + return array( + 'id' => $attach->ID, + 'url' => $local_img_url, + ); + } + } + } + } else { + $result = self::get_maybe_existed_attached_id( $filename, false ); + if ( is_array( $result ) ) { + $attach = current( $result ); + if ( is_object( $attach ) ) { + $basedir = $upload_dir['basedir']; + $baseurl = $upload_dir['baseurl']; + $local_img_path = str_replace( $baseurl, $basedir, $attach->guid ); + if ( $wp_filesystem->exists( $local_img_path ) && ( $wp_filesystem->size( $local_img_path ) == $wp_filesystem->size( $temporary_file ) ) ) { + if ( $wp_filesystem->exists( $temporary_file ) ) { + $wp_filesystem->delete( $temporary_file ); + } + return array( + 'id' => $attach->ID, + 'url' => $attach->guid, + ); + } + } + } + } + } + + private static function insert_attachment_media( $img_data, $img_url, $parent_id, $local_img_path, $local_img_url ) { + + $wp_filetype = wp_check_filetype( basename( $img_url ), null ); // Get the filetype to set the mimetype. + $attachment = array( + 'post_mime_type' => $wp_filetype['type'], + 'post_title' => isset( $img_data['title'] ) && ! empty( $img_data['title'] ) ? $img_data['title'] : preg_replace( '/\.[^.]+$/', '', basename( $img_url ) ), + 'post_content' => isset( $img_data['description'] ) && ! empty( $img_data['description'] ) ? $img_data['description'] : '', + 'post_excerpt' => isset( $img_data['caption'] ) && ! empty( $img_data['caption'] ) ? $img_data['caption'] : '', + 'post_status' => 'inherit', + 'guid' => $local_img_url, + ); + + // for post attachments, thumbnail. + if ( $parent_id ) { + $attachment['post_parent'] = $parent_id; + } + + $attach_id = wp_insert_attachment( $attachment, $local_img_path ); // Insert the image in the database. + require_once ABSPATH . 'wp-admin/includes/image.php'; + $attach_data = wp_generate_attachment_metadata( $attach_id, $local_img_path ); + wp_update_attachment_metadata( $attach_id, $attach_data ); // Update generated metadata. + if ( isset( $img_data['alt'] ) && ! empty( $img_data['alt'] ) ) { + update_post_meta( $attach_id, '_wp_attachment_image_alt', $img_data['alt'] ); + } + return array( + 'id' => $attach_id, + 'url' => $local_img_url, + ); + } + + public static function get_maybe_existed_attached_id( $filename, $full_guid = true ) { + global $wpdb; + if ( $full_guid ) { + return $wpdb->get_results( $wpdb->prepare( "SELECT ID,guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid = %s", $filename ) ); + } + return $wpdb->get_results( $wpdb->prepare( "SELECT ID,guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid LIKE %s", '%/' . $wpdb->esc_like( $filename ) ) ); + } }