diff --git a/class/class-mainwp-backup.php b/class/class-mainwp-backup.php index 7e2db74..90f93e2 100644 --- a/class/class-mainwp-backup.php +++ b/class/class-mainwp-backup.php @@ -307,7 +307,7 @@ class MainWP_Backup { closedir( $fh ); // phpcs:enable - if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG ) { + if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) { $string = wp_json_encode( array( 'siteurl' => get_option( 'siteurl' ), @@ -447,7 +447,7 @@ class MainWP_Backup { if ( $addConfig ) { global $wpdb; - if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG ) { + if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) { $string = wp_json_encode( array( 'siteurl' => get_option( 'siteurl' ), diff --git a/class/class-mainwp-child-posts.php b/class/class-mainwp-child-posts.php index 816d5ed..76a1a40 100644 --- a/class/class-mainwp-child-posts.php +++ b/class/class-mainwp-child-posts.php @@ -264,16 +264,12 @@ class MainWP_Child_Posts { $post_featured_image = base64_decode( $_POST['post_featured_image'] ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. $upload_dir = maybe_unserialize( base64_decode( $_POST['mainwp_upload_dir'] ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - if ( isset( $_POST['_ezin_post_category'] ) ) { - $new_post['_ezin_post_category'] = maybe_unserialize( base64_decode( $_POST['_ezin_post_category'] ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - } - $others = array(); if ( isset( $_POST['featured_image_data'] ) && ! empty( $_POST['featured_image_data'] ) ) { $others['featured_image_data'] = unserialize( base64_decode( $_POST['featured_image_data'] ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. } - $res = MainWP_Helper::create_post( $new_post, $post_custom, $post_category, $post_featured_image, $upload_dir, $post_tags, $others ); + $res = $this->create_post( $new_post, $post_custom, $post_category, $post_featured_image, $upload_dir, $post_tags, $others ); if ( is_array( $res ) && isset( $res['error'] ) ) { MainWP_Helper::error( $res['error'] ); @@ -659,4 +655,539 @@ class MainWP_Child_Posts { return $allComments; } + + + private function create_post( $new_post, $post_custom, $post_category, $post_featured_image, $upload_dir, $post_tags, $others = array() ) { + + global $current_user; + + /** + * Hook: `mainwp_before_post_update` + * + * Runs before creating or updating a post via MainWP dashboard. + * + * @param array $new_post – Post data array. + * @param array $post_custom – Post custom meta data. + * @param string $post_category – Post categories. + * @param string $post_tags – Post tags. + */ + + do_action( 'mainwp_before_post_update', $new_post, $post_custom, $post_category, $post_tags ); + + $this->create_wp_rocket( $post_custom ); + + // current user may be connected admin or alternative admin. + $current_uid = $current_user->ID; + // Set up a new post (adding addition information). + + $post_author = isset( $new_post['post_author'] ) ? $new_post['post_author'] : $current_uid; + + if ( isset( $new_post['custom_post_author'] ) && ! empty( $new_post['custom_post_author'] ) ) { + $_author = get_user_by( 'login', $new_post['custom_post_author'] ); + if ( ! empty( $_author ) ) { + $new_post['post_author'] = $_author->ID; + } else { + $new_post['post_author'] = $current_uid; + } + unset( $new_post['custom_post_author'] ); + } + + $post_author = ! empty( $post_author ) ? $post_author : $current_uid; + $new_post['post_author'] = $post_author; + + unset( $new_post['_ezin_post_category'] ); + + // post plus extension process. + $is_post_plus = isset( $post_custom['_mainwp_post_plus'] ) ? true : false; + + $wp_error = null; + + if ( $is_post_plus ) { + if ( isset( $new_post['post_date_gmt'] ) && ! empty( $new_post['post_date_gmt'] ) && '0000-00-00 00:00:00' != $new_post['post_date_gmt'] ) { + $post_date_timestamp = strtotime( $new_post['post_date_gmt'] ) + get_option( 'gmt_offset' ) * 60 * 60; + $new_post['post_date'] = date( 'Y-m-d H:i:s', $post_date_timestamp ); // phpcs:ignore -- local time. + } + } + + $edit_post_id = 0; + + if ( isset( $post_custom['_mainwp_edit_post_id'] ) && $post_custom['_mainwp_edit_post_id'] ) { + $edit_post_id = current( $post_custom['_mainwp_edit_post_id'] ); + } elseif ( isset( $new_post['ID'] ) && $new_post['ID'] ) { + $edit_post_id = $new_post['ID']; + } + + require_once ABSPATH . 'wp-admin/includes/post.php'; + if ( $edit_post_id ) { + $user_id = wp_check_post_lock( $edit_post_id ); + if ( $user_id ) { + $user = get_userdata( $user_id ); + $error = sprintf( __( 'This content is currently locked. %s is currently editing.', 'mainwp-child' ), $user->display_name ); + return array( 'error' => $error ); + } + } + + $check_image_existed = false; + if ( $edit_post_id ) { + $check_image_existed = true; // if editing post then will check if image existed. + } + + $this->create_found_images( $new_post, $upload_dir, $check_image_existed ); + $this->create_has_shortcode_gallery( $new_post ); + + if ( $is_post_plus ) { + $this->create_post_plus( $new_post, $post_custom ); + } + + if ( isset( $post_tags ) && '' !== $post_tags ) { + $new_post['tags_input'] = $post_tags; + } + + // Save the post to the WP. + remove_filter( 'content_save_pre', 'wp_filter_post_kses' ); // to fix brake scripts or html. + $post_status = $new_post['post_status']; + $new_post['post_status'] = 'auto-draft'; // child reports: to logging as created post. + + // update post. + if ( $edit_post_id ) { + // check if post existed. + $current_post = get_post( $edit_post_id ); + if ( $current_post && ( ( ! isset( $new_post['post_type'] ) && 'post' == $current_post->post_type ) || ( isset( $new_post['post_type'] ) && $new_post['post_type'] == $current_post->post_type ) ) ) { + $new_post['ID'] = $edit_post_id; + } + $new_post['post_status'] = $post_status; // child reports: to logging as update post. + } + + $new_post_id = wp_insert_post( $new_post, $wp_error ); + + // Show errors if something went wrong. + if ( is_wp_error( $wp_error ) ) { + return $wp_error->get_error_message(); + } + if ( empty( $new_post_id ) ) { + return array( 'error' => 'Empty post id' ); + } + + if ( ! $edit_post_id ) { + wp_update_post( + array( + 'ID' => $new_post_id, + 'post_status' => $post_status, + ) + ); + } + + $permalink = get_permalink( $new_post_id ); + + $seo_ext_activated = false; + + if ( class_exists( 'WPSEO_Meta' ) && class_exists( 'WPSEO_Admin' ) ) { + $seo_ext_activated = true; + } + + $post_to_only_existing_categories = false; + + $this->create_set_custom_fields( $new_post_id, $post_custom, $seo_ext_activated, $post_to_only_existing_categories ); + + // yoast seo plugin activated. + if ( $seo_ext_activated ) { + $this->create_seo_extension_activated( $new_post_id, $post_custom ); + } + + $this->create_set_categories( $new_post_id, $post_category, $post_to_only_existing_categories ); + + $this->create_featured_image( $new_post_id, $post_featured_image, $check_image_existed ); + + // post plus extension process. + if ( $is_post_plus ) { + $this->create_post_plus_categories( $new_post_id, $post_custom ); + } + + // to support custom post author. + $custom_post_author = apply_filters( 'mainwp_create_post_custom_author', false, $new_post_id ); + if ( ! empty( $custom_post_author ) ) { + wp_update_post( + array( + 'ID' => $new_post_id, + 'post_author' => $custom_post_author, + ) + ); + } + + // unlock if edit post. + if ( $edit_post_id ) { + update_post_meta( $edit_post_id, '_edit_lock', '' ); + } + + $ret['success'] = true; + $ret['link'] = $permalink; + $ret['added_id'] = $new_post_id; + + return $ret; + } + + + private function create_wp_rocket( &$post_custom ) { + // Options fields. + $wprocket_fields = array( + 'lazyload', + 'lazyload_iframes', + 'minify_html', + 'minify_css', + 'minify_js', + 'cdn', + 'async_css', + 'defer_all_js', + ); + + $wprocket_activated = false; + if ( \MainWP_Child_WP_Rocket::instance()->is_activated() ) { + if ( function_exists( 'get_rocket_option' ) ) { + $wprocket_activated = true; + foreach ( $wprocket_fields as $field ) { + if ( ! isset( $post_custom[ '_rocket_exclude_' . $field ] ) ) { + if ( ! get_rocket_option( $field ) ) { + $post_custom[ '_rocket_exclude_' . $field ] = array( true ); + } + } + } + } + } + if ( ! $wprocket_activated ) { + foreach ( $wprocket_fields as $field ) { + if ( isset( $post_custom[ '_rocket_exclude_' . $field ] ) ) { + unset( $post_custom[ '_rocket_exclude_' . $field ] ); + } + } + } + } + + private function create_found_images( &$new_post, $upload_dir, $check_image_existed ) { + + // Search for all the images added to the new post. Some images have a href tag to click to navigate to the image.. we need to replace this too. + $foundMatches = preg_match_all( '/(]+href=\"(.*?)\"[^>]*>)?(\/]*src=\"((.*?)(png|gif|jpg|jpeg))\")/ix', $new_post['post_content'], $matches, PREG_SET_ORDER ); + if ( $foundMatches > 0 ) { + // We found images, now to download them so we can start balbal. + foreach ( $matches as $match ) { + $hrefLink = $match[2]; + $imgUrl = $match[4]; + + if ( ! isset( $upload_dir['baseurl'] ) || ( 0 !== strripos( $imgUrl, $upload_dir['baseurl'] ) ) ) { + continue; + } + + if ( preg_match( '/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $imgUrl, $imgMatches ) ) { + $search = $imgMatches[0]; + $replace = '.' . $match[6]; + $originalImgUrl = str_replace( $search, $replace, $imgUrl ); + } else { + $originalImgUrl = $imgUrl; + } + + try { + $downloadfile = MainWP_Helper::upload_image( $originalImgUrl, array(), $check_image_existed ); + $localUrl = $downloadfile['url']; + $linkToReplaceWith = dirname( $localUrl ); + if ( '' !== $hrefLink ) { + $server = get_option( 'mainwp_child_server' ); + $serverHost = wp_parse_url( $server, PHP_URL_HOST ); + if ( ! empty( $serverHost ) && strpos( $hrefLink, $serverHost ) !== false ) { + $serverHref = 'href="' . $serverHost; + $replaceServerHref = 'href="' . wp_parse_url( $localUrl, PHP_URL_SCHEME ) . '://' . wp_parse_url( $localUrl, PHP_URL_HOST ); + $new_post['post_content'] = str_replace( $serverHref, $replaceServerHref, $new_post['post_content'] ); + } + } + $lnkToReplace = dirname( $imgUrl ); + if ( 'http:' !== $lnkToReplace && 'https:' !== $lnkToReplace ) { + $new_post['post_content'] = str_replace( $lnkToReplace, $linkToReplaceWith, $new_post['post_content'] ); + } + } catch ( \Exception $e ) { + MainWP_Helper::log_debug( $e->getMessage() ); + } + } + } + + } + + private function create_has_shortcode_gallery( &$new_post ) { + + if ( has_shortcode( $new_post['post_content'], 'gallery' ) ) { + if ( preg_match_all( '/\[gallery[^\]]+ids=\"(.*?)\"[^\]]*\]/ix', $new_post['post_content'], $matches, PREG_SET_ORDER ) ) { + $replaceAttachedIds = array(); + if ( isset( $_POST['post_gallery_images'] ) ) { + $post_gallery_images = unserialize( base64_decode( $_POST['post_gallery_images'] ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. + if ( is_array( $post_gallery_images ) ) { + foreach ( $post_gallery_images as $gallery ) { + if ( isset( $gallery['src'] ) ) { + try { + $upload = MainWP_Helper::upload_image( $gallery['src'], $gallery ); // Upload image to WP. + if ( null !== $upload ) { + $replaceAttachedIds[ $gallery['id'] ] = $upload['id']; + } + } catch ( \Exception $e ) { + // ok! + } + } + } + } + } + if ( count( $replaceAttachedIds ) > 0 ) { + foreach ( $matches as $match ) { + $idsToReplace = $match[1]; + $idsToReplaceWith = ''; + $originalIds = explode( ',', $idsToReplace ); + foreach ( $originalIds as $attached_id ) { + if ( ! empty( $originalIds ) && isset( $replaceAttachedIds[ $attached_id ] ) ) { + $idsToReplaceWith .= $replaceAttachedIds[ $attached_id ] . ','; + } + } + $idsToReplaceWith = rtrim( $idsToReplaceWith, ',' ); + if ( ! empty( $idsToReplaceWith ) ) { + $new_post['post_content'] = str_replace( '"' . $idsToReplace . '"', '"' . $idsToReplaceWith . '"', $new_post['post_content'] ); + } + } + } + } + } + } + + private function create_post_plus( &$new_post, $post_custom ) { + $random_publish_date = isset( $post_custom['_saved_draft_random_publish_date'] ) ? $post_custom['_saved_draft_random_publish_date'] : false; + $random_publish_date = is_array( $random_publish_date ) ? current( $random_publish_date ) : null; + + if ( ! empty( $random_publish_date ) ) { + $random_date_from = isset( $post_custom['_saved_draft_publish_date_from'] ) ? $post_custom['_saved_draft_publish_date_from'] : 0; + $random_date_from = is_array( $random_date_from ) ? current( $random_date_from ) : 0; + + $random_date_to = isset( $post_custom['_saved_draft_publish_date_to'] ) ? $post_custom['_saved_draft_publish_date_to'] : 0; + $random_date_to = is_array( $random_date_to ) ? current( $random_date_to ) : 0; + + $now = time(); + + if ( empty( $random_date_from ) ) { + $random_date_from = $now; + } + + if ( empty( $random_date_to ) ) { + $random_date_to = $now; + } + + if ( $random_date_from === $now && $random_date_from === $random_date_to ) { + $random_date_to = $now + 7 * 24 * 3600; + } + + if ( $random_date_from > $random_date_to ) { + $tmp = $random_date_from; + $random_date_from = $random_date_to; + $random_date_to = $tmp; + } + + $random_timestamp = wp_rand( $random_date_from, $random_date_to ); + $new_post['post_date'] = date( 'Y-m-d H:i:s', $random_timestamp ); // phpcs:ignore -- local time. + } + } + + private function create_post_plus_categories( $new_post_id, $post_custom ) { + + $random_privelege = isset( $post_custom['_saved_draft_random_privelege'] ) ? $post_custom['_saved_draft_random_privelege'] : null; + $random_privelege = is_array( $random_privelege ) ? current( $random_privelege ) : null; + $random_privelege_base = base64_decode( $random_privelege ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. + $random_privelege = maybe_unserialize( $random_privelege_base ); + + if ( is_array( $random_privelege ) && count( $random_privelege ) > 0 ) { + $random_post_authors = array(); + foreach ( $random_privelege as $role ) { + $users = get_users( array( 'role' => $role ) ); + foreach ( $users as $user ) { + $random_post_authors[] = $user->ID; + } + } + if ( count( $random_post_authors ) > 0 ) { + shuffle( $random_post_authors ); + $key = array_rand( $random_post_authors ); + wp_update_post( + array( + 'ID' => $new_post_id, + 'post_author' => $random_post_authors[ $key ], + ) + ); + } + } + + $random_category = isset( $post_custom['_saved_draft_random_category'] ) ? $post_custom['_saved_draft_random_category'] : false; + $random_category = is_array( $random_category ) ? current( $random_category ) : null; + if ( ! empty( $random_category ) ) { + $cats = get_categories( + array( + 'type' => 'post', + 'hide_empty' => 0, + ) + ); + $random_cats = array(); + if ( is_array( $cats ) ) { + foreach ( $cats as $cat ) { + $random_cats[] = $cat->term_id; + } + } + if ( count( $random_cats ) > 0 ) { + shuffle( $random_cats ); + $key = array_rand( $random_cats ); + wp_set_post_categories( $new_post_id, array( $random_cats[ $key ] ), false ); + } + } + } + + private function create_set_categories ( $new_post_id, $post_category, $post_to_only ) { + + // If categories exist, create them (second parameter of wp_create_categories adds the categories to the post). + include_once ABSPATH . 'wp-admin/includes/taxonomy.php'; // Contains wp_create_categories. + if ( isset( $post_category ) && '' !== $post_category ) { + $categories = explode( ',', $post_category ); + if ( count( $categories ) > 0 ) { + if ( ! $post_to_only ) { + $post_category = wp_create_categories( $categories, $new_post_id ); + } else { + $cat_ids = array(); + foreach ( $categories as $cat ) { + $id = category_exists( $cat ); + if ( $id ) { + $cat_ids[] = $id; + } + } + if ( count( $cat_ids ) > 0 ) { + wp_set_post_categories( $new_post_id, $cat_ids ); + } + } + } + } + } + + private function create_set_custom_fields( $new_post_id, $post_custom, $seo_ext_activated, &$post_to_only ) { + + // Set custom fields. + $not_allowed = array( + '_slug', + '_tags', + '_edit_lock', + '_selected_sites', + '_selected_groups', + '_selected_by', + '_categories', + '_edit_last', + '_sticky', + '_mainwp_post_dripper', + '_bulkpost_do_not_del', + '_mainwp_spin_me', + ); + $not_allowed[] = '_mainwp_boilerplate_sites_posts'; + $not_allowed[] = '_ezine_post_keyword'; + $not_allowed[] = '_ezine_post_display_sig'; + $not_allowed[] = '_ezine_post_remove_link'; + $not_allowed[] = '_ezine_post_grab_image'; + $not_allowed[] = '_ezine_post_grab_image_placement'; + $not_allowed[] = '_ezine_post_template_id'; + + $not_allowed[] = '_mainwp_post_plus'; + $not_allowed[] = '_saved_as_draft'; + $not_allowed[] = '_saved_draft_categories'; + $not_allowed[] = '_saved_draft_tags'; + $not_allowed[] = '_saved_draft_random_privelege'; + $not_allowed[] = '_saved_draft_random_category'; + $not_allowed[] = '_saved_draft_random_publish_date'; + $not_allowed[] = '_saved_draft_publish_date_from'; + $not_allowed[] = '_saved_draft_publish_date_to'; + $not_allowed[] = '_post_to_only_existing_categories'; + $not_allowed[] = '_mainwp_edit_post_site_id'; + $not_allowed[] = '_mainwp_edit_post_id'; + $not_allowed[] = '_edit_post_status'; + + + if ( is_array( $post_custom ) ) { + foreach ( $post_custom as $meta_key => $meta_values ) { + if ( ! in_array( $meta_key, $not_allowed ) ) { + foreach ( $meta_values as $meta_value ) { + if ( 0 === strpos( $meta_key, '_mainwp_spinner_' ) ) { + continue; + } + + if ( ! $seo_ext_activated ) { + // if WordPress SEO plugin is not activated do not save yoast post meta. + if ( false === strpos( $meta_key, '_yoast_wpseo_' ) ) { + update_post_meta( $new_post_id, $meta_key, $meta_value ); + } + } else { + update_post_meta( $new_post_id, $meta_key, $meta_value ); + } + } + } elseif ( '_sticky' === $meta_key ) { + foreach ( $meta_values as $meta_value ) { + if ( 'sticky' === base64_decode( $meta_value ) ) { // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. + stick_post( $new_post_id ); + } + } + } elseif ( '_post_to_only_existing_categories' === $meta_key ) { + if ( isset( $meta_values[0] ) && $meta_values[0] ) { + $post_to_only = true; + } + } + } + } + } + + private function create_seo_extension_activated( $new_post_id, $post_custom ) { + + $_seo_opengraph_image = isset( $post_custom[ WPSEO_Meta::$meta_prefix . 'opengraph-image' ] ) ? $post_custom[ WPSEO_Meta::$meta_prefix . 'opengraph-image' ] : array(); + $_seo_opengraph_image = current( $_seo_opengraph_image ); + $_server_domain = ''; + $_server = get_option( 'mainwp_child_server' ); + if ( preg_match( '/(https?:\/\/[^\/]+\/).+/', $_server, $matchs ) ) { + $_server_domain = isset( $matchs[1] ) ? $matchs[1] : ''; + } + + // 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. + if ( null !== $upload ) { + update_post_meta( $new_post_id, WPSEO_Meta::$meta_prefix . 'opengraph-image', $upload['url'] ); // Add the image to the post! + } + } catch ( \Exception $e ) { + // ok! + } + } + } + + private function create_featured_image( $new_post_id, $post_featured_image, $check_image_existed ){ + + $featured_image_exist = false; + // 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. + if ( null !== $upload ) { + update_post_meta( $new_post_id, '_thumbnail_id', $upload['id'] ); // Add the thumbnail to the post! + $featured_image_exist = true; + if ( isset( $others['featured_image_data'] ) ) { + $_image_data = $others['featured_image_data']; + update_post_meta( $upload['id'], '_wp_attachment_image_alt', $_image_data['alt'] ); + wp_update_post( + array( + 'ID' => $upload['id'], + 'post_excerpt' => $_image_data['caption'], + 'post_content' => $_image_data['description'], + 'post_title' => $_image_data['title'], + ) + ); + } + } + } catch ( \Exception $e ) { + // ok! + } + } + + if ( ! $featured_image_exist ) { + delete_post_meta( $new_post_id, '_thumbnail_id' ); + } + } + } diff --git a/class/class-mainwp-child-stats.php b/class/class-mainwp-child-stats.php index cac8894..1e2f293 100644 --- a/class/class-mainwp-child-stats.php +++ b/class/class-mainwp-child-stats.php @@ -66,8 +66,7 @@ class MainWP_Child_Stats { // Show stats. public function get_site_stats( $information = array(), $exit = true ) { - global $wp_version; - + if ( $exit ) { $this->update_external_settings(); } @@ -78,33 +77,8 @@ class MainWP_Child_Stats { } MainWP_Child_Plugins_Check::may_outdate_number_change(); - - $information['version'] = MainWP_Child::$version; - $information['wpversion'] = $wp_version; - $information['siteurl'] = get_option( 'siteurl' ); - $information['wpe'] = MainWP_Helper::is_wp_engine() ? 1 : 0; - $theme_name = wp_get_theme()->get( 'Name' ); - $information['site_info'] = array( - 'wpversion' => $wp_version, - 'debug_mode' => ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) ? true : false, - 'phpversion' => phpversion(), - 'child_version' => MainWP_Child::$version, - 'memory_limit' => MainWP_Child_Server_Information::get_php_memory_limit(), - 'mysql_version' => MainWP_Child_Server_Information::get_my_sql_version(), - 'themeactivated' => $theme_name, - 'ip' => $_SERVER['SERVER_ADDR'], - ); - - // Try to switch to SSL if SSL is enabled in between! - $pubkey = get_option( 'mainwp_child_pubkey' ); - $nossl = get_option( 'mainwp_child_nossl' ); - if ( 1 == $nossl ) { - if ( isset( $pubkey ) && MainWP_Helper::is_ssl_enabled() ) { - MainWP_Helper::update_option( 'mainwp_child_nossl', 0, 'yes' ); - $nossl = 0; - } - } - $information['nossl'] = ( 1 == $nossl ? 1 : 0 ); + + $this->stats_get_info( $information ); include_once ABSPATH . '/wp-admin/includes/update.php'; @@ -113,55 +87,19 @@ class MainWP_Child_Stats { ini_set( 'max_execution_time', $timeout ); //phpcs:ignore -- to custom // Check for new versions. - if ( null !== $this->filterFunction ) { - add_filter( 'pre_site_transient_update_core', $this->filterFunction, 99 ); - } - if ( null !== $this->filterFunction ) { - add_filter( 'pre_transient_update_core', $this->filterFunction, 99 ); - } - wp_version_check(); - $core_updates = get_core_updates(); - if ( is_array( $core_updates ) && count( $core_updates ) > 0 ) { - foreach ( $core_updates as $core_update ) { - if ( 'latest' === $core_update->response ) { - break; - } - if ( 'upgrade' === $core_update->response && version_compare( $wp_version, $core_update->current, '<=' ) ) { - $information['wp_updates'] = $core_update->current; - } - } - } - if ( ! isset( $information['wp_updates'] ) ) { - $information['wp_updates'] = null; - } - if ( null !== $this->filterFunction ) { - remove_filter( 'pre_site_transient_update_core', $this->filterFunction, 99 ); - } - if ( null !== $this->filterFunction ) { - remove_filter( 'pre_transient_update_core', $this->filterFunction, 99 ); - } - + $information['wp_updates'] = $this->stats_wp_update(); + add_filter( 'default_option_active_plugins', array( &$this, 'default_option_active_plugins' ) ); add_filter( 'option_active_plugins', array( &$this, 'default_option_active_plugins' ) ); - + // First check for new premium updates. - $update_check = apply_filters( 'mwp_premium_update_check', array() ); - if ( ! empty( $update_check ) ) { - foreach ( $update_check as $updateFeedback ) { - if ( is_array( $updateFeedback['callback'] ) && isset( $updateFeedback['callback'][0] ) && isset( $updateFeedback['callback'][1] ) ) { - call_user_func( array( $updateFeedback['callback'][0], $updateFeedback['callback'][1] ) ); - } elseif ( is_string( $updateFeedback['callback'] ) ) { - call_user_func( $updateFeedback['callback'] ); - } - } - } - + $this->check_premium_updates(); + $informationPremiumUpdates = apply_filters( 'mwp_premium_update_notification', array() ); $premiumPlugins = array(); $premiumThemes = array(); if ( is_array( $informationPremiumUpdates ) ) { - $premiumUpdates = array(); - $information['premium_updates'] = array(); + $premiumUpdates = array(); $informationPremiumUpdatesLength = count( $informationPremiumUpdates ); for ( $i = 0; $i < $informationPremiumUpdatesLength; $i ++ ) { if ( ! isset( $informationPremiumUpdates[ $i ]['new_version'] ) ) { @@ -179,7 +117,11 @@ class MainWP_Child_Stats { unset( $informationPremiumUpdates[ $i ]['old_version'] ); unset( $informationPremiumUpdates[ $i ]['new_version'] ); - + + if ( ! isset( $information['premium_updates'] ) ) { + $information['premium_updates'] = array(); + } + $information['premium_updates'][ $slug ] = $informationPremiumUpdates[ $i ]; $information['premium_updates'][ $slug ]['update'] = (object) array( 'new_version' => $new_version, @@ -192,183 +134,33 @@ class MainWP_Child_Stats { } MainWP_Helper::update_option( 'mainwp_premium_updates', $premiumUpdates ); } - + remove_filter( 'default_option_active_plugins', array( &$this, 'default_option_active_plugins' ) ); remove_filter( 'option_active_plugins', array( &$this, 'default_option_active_plugins' ) ); - - if ( null !== $this->filterFunction ) { - add_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); - } - - global $wp_current_filter; - $wp_current_filter[] = 'load-plugins.php'; // phpcs:ignore -- to custom plugin installation. - - wp_update_plugins(); - include_once ABSPATH . '/wp-admin/includes/plugin.php'; - - $plugin_updates = get_plugin_updates(); - if ( is_array( $plugin_updates ) ) { - $information['plugin_updates'] = array(); - - foreach ( $plugin_updates as $slug => $plugin_update ) { - if ( in_array( $plugin_update->Name, $premiumPlugins ) ) { - continue; - } - - // to fix incorrect info. - if ( ! property_exists( $plugin_update, 'update' ) || ! property_exists( $plugin_update->update, 'new_version' ) || empty( $plugin_update->update->new_version ) ) { - continue; - } - - $information['plugin_updates'][ $slug ] = $plugin_update; - } - } - - if ( null !== $this->filterFunction ) { - remove_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); - } - - // to fix premium plugs update. - $cached_plugins_update = get_site_transient( 'mainwp_update_plugins_cached' ); - if ( is_array( $cached_plugins_update ) && ( count( $cached_plugins_update ) > 0 ) ) { - if ( ! isset( $information['plugin_updates'] ) ) { - $information['plugin_updates'] = array(); - } - foreach ( $cached_plugins_update as $slug => $plugin_update ) { - - // to fix incorrect info. - if ( ! property_exists( $plugin_update, 'new_version' ) || empty( $plugin_update->new_version ) ) { // may do not need to check this? - // to fix for some premiums update info. - if ( property_exists( $plugin_update, 'update' ) ) { - if ( ! property_exists( $plugin_update->update, 'new_version' ) || empty( $plugin_update->update->new_version ) ) { - continue; - } - } else { - continue; - } - } - - if ( ! isset( $information['plugin_updates'][ $slug ] ) ) { - $information['plugin_updates'][ $slug ] = $plugin_update; - } - } - } - - if ( null !== $this->filterFunction ) { - add_filter( 'pre_site_transient_update_themes', $this->filterFunction, 99 ); - } - wp_update_themes(); - include_once ABSPATH . '/wp-admin/includes/theme.php'; - $theme_updates = MainWP_Child_Updates::get_instance()->upgrade_get_theme_updates(); - if ( is_array( $theme_updates ) ) { - $information['theme_updates'] = array(); - - foreach ( $theme_updates as $slug => $theme_update ) { - $name = ( is_array( $theme_update ) ? $theme_update['Name'] : $theme_update->Name ); - if ( in_array( $name, $premiumThemes ) ) { - continue; - } - - $information['theme_updates'][ $slug ] = $theme_update; - } - } - if ( null !== $this->filterFunction ) { - remove_filter( 'pre_site_transient_update_themes', $this->filterFunction, 99 ); - } - - // to fix premium themes update. - $cached_themes_update = get_site_transient( 'mainwp_update_themes_cached' ); - if ( is_array( $cached_themes_update ) && ( count( $cached_themes_update ) > 0 ) ) { - if ( ! isset( $information['theme_updates'] ) ) { - $information['theme_updates'] = array(); - } - - foreach ( $cached_themes_update as $slug => $theme_update ) { - $name = ( is_array( $theme_update ) ? $theme_update['Name'] : $theme_update->Name ); - if ( in_array( $name, $premiumThemes ) ) { - continue; - } - if ( isset( $information['theme_updates'][ $slug ] ) ) { - continue; - } - $information['theme_updates'][ $slug ] = $theme_update; - } - } - - $translation_updates = wp_get_translation_updates(); - if ( ! empty( $translation_updates ) ) { - $information['translation_updates'] = array(); - foreach ( $translation_updates as $translation_update ) { - $new_translation_update = array( - 'type' => $translation_update->type, - 'slug' => $translation_update->slug, - 'language' => $translation_update->language, - 'version' => $translation_update->version, - ); - if ( 'plugin' === $translation_update->type ) { - $all_plugins = get_plugins(); - foreach ( $all_plugins as $file => $plugin ) { - $path = dirname( $file ); - if ( $path == $translation_update->slug ) { - $new_translation_update['name'] = $plugin['Name']; - break; - } - } - } elseif ( 'theme' === $translation_update->type ) { - $theme = wp_get_theme( $translation_update->slug ); - $new_translation_update['name'] = $theme->name; - } elseif ( ( 'core' === $translation_update->type ) && ( 'default' === $translation_update->slug ) ) { - $new_translation_update['name'] = 'WordPress core'; - } - $information['translation_updates'][] = $new_translation_update; - } - } - + + $information['plugin_updates'] = $this->stats_plugin_update( $premiumPlugins ); + + $information['theme_updates'] = $this->stats_theme_update( $premiumThemes ); + + $information['translation_updates'] = $this->stats_translation_updates(); + $information['recent_comments'] = MainWP_Child_Posts::get_instance()->get_recent_comments( array( 'approve', 'hold' ), 5 ); - $recent_number = 5; - - if ( isset( $_POST ) && isset( $_POST['recent_number'] ) ) { - $recent_number = $_POST['recent_number']; - if ( get_option( 'mainwp_child_recent_number', 5 ) != $recent_number ) { - update_option( 'mainwp_child_recent_number', $recent_number ); - } - } else { - $recent_number = get_option( 'mainwp_child_recent_number', 5 ); - } - - if ( $recent_number <= 0 || $recent_number > 30 ) { - $recent_number = 5; - } + $recent_number = $this->get_recent_number(); $information['recent_posts'] = MainWP_Child_Posts::get_instance()->get_recent_posts( array( 'publish', 'draft', 'pending', 'trash', 'future' ), $recent_number ); $information['recent_pages'] = MainWP_Child_Posts::get_instance()->get_recent_posts( array( 'publish', 'draft', 'pending', 'trash', 'future' ), $recent_number, 'page' ); $information['securityIssues'] = MainWP_Security::get_stats_security(); // Directory listings! - $information['directories'] = $this->scan_dir( ABSPATH, 3 ); - $cats = get_categories( - array( - 'hide_empty' => 0, - 'hierarchical' => true, - 'number' => 300, - ) - ); - $categories = array(); - foreach ( $cats as $cat ) { - $categories[] = $cat->name; - } - $information['categories'] = $categories; + $information['directories'] = $this->scan_dir( ABSPATH, 3 ); + $information['categories'] = $this->stats_get_categories(); - $get_file_size = apply_filters_deprecated( 'mainwp-child-get-total-size', array( true ), '4.0.7.1', 'mainwp_child_get_total_size' ); - $get_file_size = apply_filters( 'mainwp_child_get_total_size', $get_file_size ); - - if ( $get_file_size && isset( $_POST['cloneSites'] ) && ( '0' !== $_POST['cloneSites'] ) ) { - $max_exe = ini_get( 'max_execution_time' ); - if ( $max_exe > 20 ) { - $information['totalsize'] = $this->get_total_file_size(); - } + $totalsize = $this->stats_get_total_size(); + if ( ! empty( $totalsize ) ) { + $information['totalsize'] = $totalsize; } + $information['dbsize'] = MainWP_Child_DB::get_size(); global $mainWPChild; @@ -377,10 +169,8 @@ class MainWP_Child_Stats { $auths = get_option( 'mainwp_child_auth' ); $information['extauth'] = ( $auths && isset( $auths[ $max_his ] ) ? $auths[ $max_his ] : null ); - $plugins = $this->get_all_plugins_int( false ); - $themes = $this->get_all_themes_int( false ); - $information['plugins'] = $plugins; - $information['themes'] = $themes; + $information['plugins'] = $this->get_all_plugins_int( false ); + $information['themes'] = $this->get_all_themes_int( false ); if ( isset( $_POST['optimize'] ) && ( '1' === $_POST['optimize'] ) ) { $information['users'] = MainWP_Child_Users::get_instance()->get_all_users_int( 500 ); @@ -418,25 +208,7 @@ class MainWP_Child_Stats { } if ( isset( $_POST['othersData'] ) ) { - $othersData = json_decode( stripslashes( $_POST['othersData'] ), true ); - if ( ! is_array( $othersData ) ) { - $othersData = array(); - } - - if ( isset( $othersData['wpvulndbToken'] ) ) { - $wpvulndb_token = get_option( 'mainwp_child_wpvulndb_token', '' ); - if ( $wpvulndb_token != $othersData['wpvulndbToken'] ) { - MainWP_Helper::update_option( 'mainwp_child_wpvulndb_token', $othersData['wpvulndbToken'] ); - } - } - - try { - $information = apply_filters_deprecated( 'mainwp-site-sync-others-data', array( $information, $othersData ), '4.0.7.1', 'mainwp_site_sync_others_data' ); - $information = apply_filters( 'mainwp_site_sync_others_data', $information, $othersData ); - - } catch ( \Exception $e ) { - MainWP_Helper::log_debug( $e->getMessage() ); - } + $this->stats_others_data( $information ); } if ( $exit ) { @@ -446,6 +218,298 @@ class MainWP_Child_Stats { return $information; } + private function stats_others_data( &$information ){ + + $othersData = json_decode( stripslashes( $_POST['othersData'] ), true ); + if ( ! is_array( $othersData ) ) { + $othersData = array(); + } + + if ( isset( $othersData['wpvulndbToken'] ) ) { + $wpvulndb_token = get_option( 'mainwp_child_wpvulndb_token', '' ); + if ( $wpvulndb_token != $othersData['wpvulndbToken'] ) { + MainWP_Helper::update_option( 'mainwp_child_wpvulndb_token', $othersData['wpvulndbToken'] ); + } + } + + try { + $information = apply_filters_deprecated( 'mainwp-site-sync-others-data', array( $information, $othersData ), '4.0.7.1', 'mainwp_site_sync_others_data' ); + $information = apply_filters( 'mainwp_site_sync_others_data', $information, $othersData ); + + } catch ( \Exception $e ) { + MainWP_Helper::log_debug( $e->getMessage() ); + } + } + + private function stats_translation_updates() { + $results = array(); + + $translation_updates = wp_get_translation_updates(); + if ( ! empty( $translation_updates ) ) { + foreach ( $translation_updates as $translation_update ) { + $new_translation_update = array( + 'type' => $translation_update->type, + 'slug' => $translation_update->slug, + 'language' => $translation_update->language, + 'version' => $translation_update->version, + ); + if ( 'plugin' === $translation_update->type ) { + $all_plugins = get_plugins(); + foreach ( $all_plugins as $file => $plugin ) { + $path = dirname( $file ); + if ( $path == $translation_update->slug ) { + $new_translation_update['name'] = $plugin['Name']; + break; + } + } + } elseif ( 'theme' === $translation_update->type ) { + $theme = wp_get_theme( $translation_update->slug ); + $new_translation_update['name'] = $theme->name; + } elseif ( ( 'core' === $translation_update->type ) && ( 'default' === $translation_update->slug ) ) { + $new_translation_update['name'] = 'WordPress core'; + } + + $results[] = $new_translation_update; + } + } + return $results; + } + + private function stats_theme_update( $premiumThemes ) { + + $results = array(); + + if ( null !== $this->filterFunction ) { + add_filter( 'pre_site_transient_update_themes', $this->filterFunction, 99 ); + } + + wp_update_themes(); + include_once ABSPATH . '/wp-admin/includes/theme.php'; + $theme_updates = MainWP_Child_Updates::get_instance()->upgrade_get_theme_updates(); + if ( is_array( $theme_updates ) ) { + foreach ( $theme_updates as $slug => $theme_update ) { + $name = ( is_array( $theme_update ) ? $theme_update['Name'] : $theme_update->Name ); + if ( in_array( $name, $premiumThemes ) ) { + continue; + } + $results[ $slug ] = $theme_update; + } + } + if ( null !== $this->filterFunction ) { + remove_filter( 'pre_site_transient_update_themes', $this->filterFunction, 99 ); + } + + // to fix premium themes update. + $cached_themes_update = get_site_transient( 'mainwp_update_themes_cached' ); + if ( is_array( $cached_themes_update ) && ( count( $cached_themes_update ) > 0 ) ) { + + foreach ( $cached_themes_update as $slug => $theme_update ) { + $name = ( is_array( $theme_update ) ? $theme_update['Name'] : $theme_update->Name ); + if ( in_array( $name, $premiumThemes ) ) { + continue; + } + if ( isset( $results[ $slug ] ) ) { + continue; + } + $results[ $slug ] = $theme_update; + } + } + + return $results; + } + + private function stats_get_info( &$information ) { + + global $wp_version; + + $information['version'] = MainWP_Child::$version; + $information['wpversion'] = $wp_version; + $information['siteurl'] = get_option( 'siteurl' ); + $information['wpe'] = MainWP_Helper::is_wp_engine() ? 1 : 0; + $theme_name = wp_get_theme()->get( 'Name' ); + $information['site_info'] = array( + 'wpversion' => $wp_version, + 'debug_mode' => ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) ? true : false, + 'phpversion' => phpversion(), + 'child_version' => MainWP_Child::$version, + 'memory_limit' => MainWP_Child_Server_Information::get_php_memory_limit(), + 'mysql_version' => MainWP_Child_Server_Information::get_my_sql_version(), + 'themeactivated' => $theme_name, + 'ip' => $_SERVER['SERVER_ADDR'], + ); + + // Try to switch to SSL if SSL is enabled in between! + $pubkey = get_option( 'mainwp_child_pubkey' ); + $nossl = get_option( 'mainwp_child_nossl' ); + if ( 1 == $nossl ) { + if ( isset( $pubkey ) && MainWP_Helper::is_ssl_enabled() ) { + MainWP_Helper::update_option( 'mainwp_child_nossl', 0, 'yes' ); + $nossl = 0; + } + } + $information['nossl'] = ( 1 == $nossl ? 1 : 0 ); + } + + private function stats_wp_update() { + $result = null; + // Check for new versions. + if ( null !== $this->filterFunction ) { + add_filter( 'pre_site_transient_update_core', $this->filterFunction, 99 ); + } + if ( null !== $this->filterFunction ) { + add_filter( 'pre_transient_update_core', $this->filterFunction, 99 ); + } + wp_version_check(); + $core_updates = get_core_updates(); + if ( is_array( $core_updates ) && count( $core_updates ) > 0 ) { + foreach ( $core_updates as $core_update ) { + if ( 'latest' === $core_update->response ) { + break; + } + if ( 'upgrade' === $core_update->response && version_compare( $wp_version, $core_update->current, '<=' ) ) { + $result = $core_update->current; + } + } + } + + if ( null !== $this->filterFunction ) { + remove_filter( 'pre_site_transient_update_core', $this->filterFunction, 99 ); + } + if ( null !== $this->filterFunction ) { + remove_filter( 'pre_transient_update_core', $this->filterFunction, 99 ); + } + + } + + private function check_premium_updates() { + // First check for new premium updates. + $update_check = apply_filters( 'mwp_premium_update_check', array() ); + if ( ! empty( $update_check ) ) { + foreach ( $update_check as $updateFeedback ) { + if ( is_array( $updateFeedback['callback'] ) && isset( $updateFeedback['callback'][0] ) && isset( $updateFeedback['callback'][1] ) ) { + call_user_func( array( $updateFeedback['callback'][0], $updateFeedback['callback'][1] ) ); + } elseif ( is_string( $updateFeedback['callback'] ) ) { + call_user_func( $updateFeedback['callback'] ); + } + } + } + } + + private function stats_plugin_update( $premiumPlugins ) { + + $results = array(); + + if ( null !== $this->filterFunction ) { + add_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); + } + + global $wp_current_filter; + $wp_current_filter[] = 'load-plugins.php'; // phpcs:ignore -- to custom plugin installation. + + wp_update_plugins(); + include_once ABSPATH . '/wp-admin/includes/plugin.php'; + + $plugin_updates = get_plugin_updates(); + if ( is_array( $plugin_updates ) ) { + + foreach ( $plugin_updates as $slug => $plugin_update ) { + if ( in_array( $plugin_update->Name, $premiumPlugins ) ) { + continue; + } + + // to fix incorrect info. + if ( ! property_exists( $plugin_update, 'update' ) || ! property_exists( $plugin_update->update, 'new_version' ) || empty( $plugin_update->update->new_version ) ) { + continue; + } + + $results[ $slug ] = $plugin_update; + } + } + + if ( null !== $this->filterFunction ) { + remove_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); + } + + // to fix premium plugs update. + $cached_plugins_update = get_site_transient( 'mainwp_update_plugins_cached' ); + if ( is_array( $cached_plugins_update ) && ( count( $cached_plugins_update ) > 0 ) ) { + foreach ( $cached_plugins_update as $slug => $plugin_update ) { + + // to fix incorrect info. + if ( ! property_exists( $plugin_update, 'new_version' ) || empty( $plugin_update->new_version ) ) { // may do not need to check this? + // to fix for some premiums update info. + if ( property_exists( $plugin_update, 'update' ) ) { + if ( ! property_exists( $plugin_update->update, 'new_version' ) || empty( $plugin_update->update->new_version ) ) { + continue; + } + } else { + continue; + } + } + + if ( ! isset( $results[ $slug ] ) ) { + $results[ $slug ] = $plugin_update; + } + } + } + + return $results; + } + + private function stats_get_categories() { + + $cats = get_categories( + array( + 'hide_empty' => 0, + 'hierarchical' => true, + 'number' => 300, + ) + ); + $categories = array(); + foreach ( $cats as $cat ) { + $categories[] = $cat->name; + } + + return $categories; + } + + private function stats_get_total_size() { + $total = null; + + $get_file_size = apply_filters_deprecated( 'mainwp-child-get-total-size', array( true ), '4.0.7.1', 'mainwp_child_get_total_size' ); + $get_file_size = apply_filters( 'mainwp_child_get_total_size', $get_file_size ); + + if ( $get_file_size && isset( $_POST['cloneSites'] ) && ( '0' !== $_POST['cloneSites'] ) ) { + $max_exe = ini_get( 'max_execution_time' ); + if ( $max_exe > 20 ) { + $total = $this->get_total_file_size(); + } + } + + return $total; + } + + private function get_recent_number() { + + $recent_number = 5; + + if ( isset( $_POST ) && isset( $_POST['recent_number'] ) ) { + $recent_number = $_POST['recent_number']; + if ( get_option( 'mainwp_child_recent_number', 5 ) != $recent_number ) { + update_option( 'mainwp_child_recent_number', $recent_number ); + } + } else { + $recent_number = get_option( 'mainwp_child_recent_number', 5 ); + } + + if ( $recent_number <= 0 || $recent_number > 30 ) { + $recent_number = 5; + } + + return $recent_number; + } + + public function update_external_settings() { $update_htaccess = false; @@ -545,7 +609,7 @@ class MainWP_Child_Stats { return empty( $output ) ? null : $output; } $files = $this->int_scan_dir( $pDir ); - if ( $files ) { + if ( $files ) { foreach ( $files as $file ) { if ( ( '.' === $file ) || ( '..' === $file ) ) { continue; @@ -573,13 +637,16 @@ class MainWP_Child_Stats { while ( false !== $file ) { $newDir = $dir . $file . DIRECTORY_SEPARATOR; if ( ! is_dir( $newDir ) ) { + $file = readdir( $dh ); continue; } $out[] = $file; + $file = readdir( $dh ); + if ( $cnt ++ > 10 ) { - return $out; - } + break; + } } closedir( $dh ); @@ -588,7 +655,7 @@ class MainWP_Child_Stats { return false; } - + public function get_all_themes() { $keyword = $_POST['keyword']; $status = $_POST['status']; diff --git a/class/class-mainwp-child-updates.php b/class/class-mainwp-child-updates.php index 97db9df..f0980ab 100644 --- a/class/class-mainwp-child-updates.php +++ b/class/class-mainwp-child-updates.php @@ -66,7 +66,74 @@ class MainWP_Child_Updates { $information['upgrades'] = array(); $mwp_premium_updates_todo = array(); $mwp_premium_updates_todo_slugs = array(); - if ( isset( $_POST['type'] ) && 'plugin' === $_POST['type'] ) { + + if ( isset( $_POST['type'] ) && 'plugin' === $_POST['type'] ) { + $this->upgrade_plugin( $information, $mwp_premium_updates_todo, $mwp_premium_updates_todo_slugs ); + } elseif ( isset( $_POST['type'] ) && 'theme' === $_POST['type'] ) { + $this->upgrade_theme( $information, $mwp_premium_updates_todo, $mwp_premium_updates_todo_slugs ); + } else { + MainWP_Helper::error( __( 'Invalid request!', 'mainwp-child' ) ); + } + + if ( count( $mwp_premium_updates_todo ) > 0 ) { + // Upgrade via WP. + // @see wp-admin/update.php. + $result = $premiumUpgrader->bulk_upgrade( $mwp_premium_updates_todo_slugs ); + if ( ! empty( $result ) ) { + foreach ( $result as $plugin => $info ) { + if ( ! empty( $info ) ) { + $information['upgrades'][ $plugin ] = true; + + foreach ( $mwp_premium_updates_todo as $key => $update ) { + $slug = ( isset( $update['slug'] ) ? $update['slug'] : $update['Name'] ); + } + } + } + } + + // Upgrade via callback. + foreach ( $mwp_premium_updates_todo as $update ) { + $slug = ( isset( $update['slug'] ) ? $update['slug'] : $update['Name'] ); + + if ( isset( $update['url'] ) ) { + $installer = new WP_Upgrader(); + $result = $installer->run( + array( + 'package' => $update['url'], + 'destination' => ( 'plugin' === $update['type'] ? WP_PLUGIN_DIR : WP_CONTENT_DIR . '/themes' ), + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array(), + ) + ); + $information['upgrades'][ $slug ] = ( ! is_wp_error( $result ) && ! empty( $result ) ); + } elseif ( isset( $update['callback'] ) ) { + if ( is_array( $update['callback'] ) && isset( $update['callback'][0] ) && isset( $update['callback'][1] ) ) { + $update_result = call_user_func( + array( + $update['callback'][0], + $update['callback'][1], + ) + ); + $information['upgrades'][ $slug ] = $update_result && true; + } elseif ( is_string( $update['callback'] ) ) { + $update_result = call_user_func( $update['callback'] ); + $information['upgrades'][ $slug ] = $update_result && true; + } else { + $information['upgrades'][ $slug ] = false; + } + } else { + $information['upgrades'][ $slug ] = false; + } + } + } + + $information['sync'] = MainWP_Child_Stats::get_instance()->get_site_stats( array(), false ); + mainwp_child_helper()->write( $information ); + } + + private function upgrade_plugin( &$information, &$mwp_premium_updates_todo, &$mwp_premium_updates_todo_slugs ) { + include_once ABSPATH . '/wp-admin/includes/update.php'; if ( null !== $this->filterFunction ) { add_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); @@ -185,8 +252,11 @@ class MainWP_Child_Updates { if ( null !== $this->filterFunction ) { remove_filter( 'pre_site_transient_update_plugins', $this->filterFunction, 99 ); } - } elseif ( isset( $_POST['type'] ) && 'theme' === $_POST['type'] ) { + + } + private function upgrade_theme( &$information, &$mwp_premium_updates_todo, &$mwp_premium_updates_todo_slugs ) { + $last_update = get_site_transient( 'update_themes' ); include_once ABSPATH . '/wp-admin/includes/update.php'; @@ -295,66 +365,8 @@ class MainWP_Child_Updates { if ( null !== $this->filterFunction ) { remove_filter( 'pre_site_transient_update_themes', $this->filterFunction, 99 ); } - } else { - MainWP_Helper::error( __( 'Invalid request!', 'mainwp-child' ) ); - } - - if ( count( $mwp_premium_updates_todo ) > 0 ) { - // Upgrade via WP. - // @see wp-admin/update.php. - $result = $premiumUpgrader->bulk_upgrade( $mwp_premium_updates_todo_slugs ); - if ( ! empty( $result ) ) { - foreach ( $result as $plugin => $info ) { - if ( ! empty( $info ) ) { - $information['upgrades'][ $plugin ] = true; - - foreach ( $mwp_premium_updates_todo as $key => $update ) { - $slug = ( isset( $update['slug'] ) ? $update['slug'] : $update['Name'] ); - } - } - } - } - - // Upgrade via callback. - foreach ( $mwp_premium_updates_todo as $update ) { - $slug = ( isset( $update['slug'] ) ? $update['slug'] : $update['Name'] ); - - if ( isset( $update['url'] ) ) { - $installer = new WP_Upgrader(); - $result = $installer->run( - array( - 'package' => $update['url'], - 'destination' => ( 'plugin' === $update['type'] ? WP_PLUGIN_DIR : WP_CONTENT_DIR . '/themes' ), - 'clear_destination' => true, - 'clear_working' => true, - 'hook_extra' => array(), - ) - ); - $information['upgrades'][ $slug ] = ( ! is_wp_error( $result ) && ! empty( $result ) ); - } elseif ( isset( $update['callback'] ) ) { - if ( is_array( $update['callback'] ) && isset( $update['callback'][0] ) && isset( $update['callback'][1] ) ) { - $update_result = call_user_func( - array( - $update['callback'][0], - $update['callback'][1], - ) - ); - $information['upgrades'][ $slug ] = $update_result && true; - } elseif ( is_string( $update['callback'] ) ) { - $update_result = call_user_func( $update['callback'] ); - $information['upgrades'][ $slug ] = $update_result && true; - } else { - $information['upgrades'][ $slug ] = false; - } - } else { - $information['upgrades'][ $slug ] = false; - } - } - } - $information['sync'] = MainWP_Child_Stats::get_instance()->get_site_stats( array(), false ); - mainwp_child_helper()->write( $information ); } - + public function upgrade_get_theme_updates() { $themeUpdates = get_theme_updates(); $newThemeUpdates = array(); diff --git a/class/class-mainwp-child-updraft-plus-backups.php b/class/class-mainwp-child-updraft-plus-backups.php index 1032b96..a90a608 100644 --- a/class/class-mainwp-child-updraft-plus-backups.php +++ b/class/class-mainwp-child-updraft-plus-backups.php @@ -2099,7 +2099,7 @@ class MainWP_Child_Updraft_Plus_Backups { } - public function analyse_db_file( $timestamp, $res, $db_file = false, $header_only = false ) { + public function analyse_db_file( $timestamp, $res, $db_file = false, $header_only = false ) { // phpcs:ignore -- third party credit. global $updraftplus; $mess = array(); diff --git a/class/class-mainwp-child-wordfence.php b/class/class-mainwp-child-wordfence.php index 971003e..6dbf2d0 100644 --- a/class/class-mainwp-child-wordfence.php +++ b/class/class-mainwp-child-wordfence.php @@ -201,7 +201,7 @@ class MainWP_Child_Wordfence { } } - public function action() { + public function action() { // phpcs:ignore -- not quite complex method $information = array(); if ( ! $this->is_wordfence_installed ) { mainwp_child_helper()->write( array( 'error' => __( 'Please install the Wordfence plugin on the child site.', $this->plugin_translate ) ) ); diff --git a/class/class-mainwp-child.php b/class/class-mainwp-child.php index 565ac90..587d112 100644 --- a/class/class-mainwp-child.php +++ b/class/class-mainwp-child.php @@ -5,7 +5,7 @@ namespace MainWP\Child; // phpcs:disable -if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG === true ) { +if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG === true ) { error_reporting( E_ALL ); ini_set( 'display_errors', true ); ini_set( 'display_startup_errors', true ); @@ -21,6 +21,7 @@ require_once ABSPATH . '/wp-admin/includes/file.php'; require_once ABSPATH . '/wp-admin/includes/plugin.php'; class MainWP_Child { + public static $version = '4.0.7.1'; private $update_version = '1.5'; @@ -942,124 +943,16 @@ class MainWP_Child { } public function parse_init() { + if ( isset( $_REQUEST['cloneFunc'] ) ) { - if ( ! isset( $_REQUEST['key'] ) ) { + + // if not valid result then return. + $valid_clone = MainWP_Clone_Install::get()->request_clone_funct(); + // not valid clone. + if ( ! $valid_clone ) { return; - } - if ( ! isset( $_REQUEST['f'] ) || ( '' === $_REQUEST['f'] ) ) { - return; - } - if ( ! $this->is_valid_auth( $_REQUEST['key'] ) ) { - return; - } - - if ( 'dl' === $_REQUEST['cloneFunc'] ) { - $this->upload_file( $_REQUEST['f'] ); - exit; - } elseif ( 'deleteCloneBackup' === $_POST['cloneFunc'] ) { - $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); - $backupdir = $dirs[0]; - $result = glob( $backupdir . $_POST['f'] ); - if ( 0 === count( $result ) ) { - return; - } - - unlink( $result[0] ); - mainwp_child_helper()->write( array( 'result' => 'ok' ) ); - } elseif ( 'createCloneBackupPoll' === $_POST['cloneFunc'] ) { - $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); - $backupdir = $dirs[0]; - $result = glob( $backupdir . 'backup-' . $_POST['f'] . '-*' ); - $archiveFile = false; - foreach ( $result as $file ) { - if ( MainWP_Helper::is_archive( $file, 'backup-' . $_POST['f'] . '-' ) ) { - $archiveFile = $file; - break; - } - } - if ( false === $archiveFile ) { - return; - } - - mainwp_child_helper()->write( array( 'size' => filesize( $archiveFile ) ) ); - } elseif ( 'createCloneBackup' === $_POST['cloneFunc'] ) { - MainWP_Helper::end_session(); - - $files = glob( WP_CONTENT_DIR . '/dbBackup*.sql' ); - foreach ( $files as $file ) { - unlink( $file ); - } - if ( file_exists( ABSPATH . 'clone/config.txt' ) ) { - unlink( ABSPATH . 'clone/config.txt' ); - } - if ( MainWP_Helper::is_dir_empty( ABSPATH . 'clone' ) ) { - rmdir( ABSPATH . 'clone' ); - } - - $wpversion = $_POST['wpversion']; - global $wp_version; - $includeCoreFiles = ( $wpversion !== $wp_version ); - $excludes = ( isset( $_POST['exclude'] ) ? explode( ',', $_POST['exclude'] ) : array() ); - $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/uploads/mainwp'; - $uploadDir = MainWP_Helper::get_mainwp_dir(); - $uploadDir = $uploadDir[0]; - $excludes[] = str_replace( ABSPATH, '', $uploadDir ); - $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/object-cache.php'; - if ( version_compare( phpversion(), '5.3.0' ) >= 0 || ! ini_get( 'safe_mode' ) ) { - set_time_limit( 6000 ); - } - - $newExcludes = array(); - foreach ( $excludes as $exclude ) { - $newExcludes[] = rtrim( $exclude, '/' ); - } - - $method = ( ! isset( $_POST['zipmethod'] ) ? 'tar.gz' : $_POST['zipmethod'] ); - if ( 'tar.gz' === $method && ! function_exists( 'gzopen' ) ) { - $method = 'zip'; - } - - $res = MainWP_Backup::get()->create_full_backup( $newExcludes, ( isset( $_POST['f'] ) ? $_POST['f'] : $_POST['file'] ), true, $includeCoreFiles, 0, false, false, false, false, $method ); - if ( ! $res ) { - $information['backup'] = false; - } else { - $information['backup'] = $res['file']; - $information['size'] = $res['filesize']; - } - - $plugins = array(); - $dir = WP_CONTENT_DIR . '/plugins/'; - $fh = opendir( $dir ); - $entry = readdir( $fh ); - while ( $entry ) { - if ( ! is_dir( $dir . $entry ) ) { - continue; - } - if ( ( '.' === $entry ) || ( '..' === $entry ) ) { - continue; - } - $plugins[] = $entry; - } - closedir( $fh ); - $information['plugins'] = $plugins; - - $themes = array(); - $dir = WP_CONTENT_DIR . '/themes/'; - $fh = opendir( $dir ); - while ( $entry = readdir( $fh ) ) { - if ( ! is_dir( $dir . $entry ) ) { - continue; - } - if ( ( '.' === $entry ) || ( '..' === $entry ) ) { - continue; - } - $themes[] = $entry; - } - closedir( $fh ); - $information['themes'] = $themes; - - mainwp_child_helper()->write( $information ); - } + } + } global $wp_rewrite; @@ -1080,116 +973,16 @@ class MainWP_Child { } $this->update_htaccess(); - - global $current_user; - + + // if login required. if ( isset( $_REQUEST['login_required'] ) && ( '1' === $_REQUEST['login_required'] ) && isset( $_REQUEST['user'] ) ) { - $alter_login_required = false; - $username = rawurldecode( $_REQUEST['user'] ); - - if ( isset( $_REQUEST['alt_user'] ) && ! empty( $_REQUEST['alt_user'] ) ) { - $alter_login_required = $this->check_login_as( $_REQUEST['alt_user'] ); - - if ( $alter_login_required ) { - $username = rawurldecode( $_REQUEST['alt_user'] ); - } - } - - if ( is_user_logged_in() ) { - global $current_user; - if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { - do_action( 'wp_logout' ); - } - } - - $signature = rawurldecode( isset( $_REQUEST['mainwpsignature'] ) ? $_REQUEST['mainwpsignature'] : '' ); - $file = ''; - if ( isset( $_REQUEST['f'] ) ) { - $file = $_REQUEST['f']; - } elseif ( isset( $_REQUEST['file'] ) ) { - $file = $_REQUEST['file']; - } elseif ( isset( $_REQUEST['fdl'] ) ) { - $file = $_REQUEST['fdl']; - } - - $auth = $this->auth( $signature, rawurldecode( ( isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : $file ) ), isset( $_REQUEST['nonce'] ) ? $_REQUEST['nonce'] : '', isset( $_REQUEST['nossl'] ) ? $_REQUEST['nossl'] : 0 ); - if ( ! $auth ) { + $valid_login_required = $this->parse_login_required(); + // retunr parse init if login required are not valid. + if ( ! $valid_login_required ) { return; } - - if ( ! is_user_logged_in() || $username !== $current_user->user_login ) { - if ( ! $this->login( $username ) ) { - return; - } - - global $current_user; - if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { - // if is not alternative admin login. - // it is connected admin login. - if ( ! $alter_login_required ) { - // log out if connected admin is not admin level 10. - do_action( 'wp_logout' ); - - return; - } - } - } - - if ( isset( $_REQUEST['fdl'] ) ) { - if ( stristr( $_REQUEST['fdl'], '..' ) ) { - return; - } - - $this->upload_file( $_REQUEST['fdl'], isset( $_REQUEST['foffset'] ) ? $_REQUEST['foffset'] : 0 ); - exit; - } - - $where = isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : ''; - if ( isset( $_POST['f'] ) || isset( $_POST['file'] ) ) { - $file = ''; - if ( isset( $_POST['f'] ) ) { - $file = $_POST['f']; - } elseif ( isset( $_POST['file'] ) ) { - $file = $_POST['file']; - } - - $where = 'admin.php?page=mainwp_child_tab&tab=restore-clone'; - if ( '' === session_id() ) { - session_start(); - } - $_SESSION['file'] = $file; - $_SESSION['size'] = $_POST['size']; - } - - // to support open not wp-admin url. - $open_location = isset( $_REQUEST['open_location'] ) ? $_REQUEST['open_location'] : ''; - if ( ! empty( $open_location ) ) { - $open_location = base64_decode( $open_location ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - $_vars = MainWP_Helper::parse_query( $open_location ); - $_path = wp_parse_url( $open_location, PHP_URL_PATH ); - if ( isset( $_vars['_mwpNoneName'] ) && isset( $_vars['_mwpNoneValue'] ) ) { - $_vars[ $_vars['_mwpNoneName'] ] = wp_create_nonce( $_vars['_mwpNoneValue'] ); - unset( $_vars['_mwpNoneName'] ); - unset( $_vars['_mwpNoneValue'] ); - $open_url = ''; - foreach ( $_vars as $key => $value ) { - $open_url .= $key . '=' . $value . '&'; - } - $open_url = rtrim( $open_url, '&' ); - $open_location = '/wp-admin/' . $_path . '?' . $open_url; - } else { - if ( strpos( $open_location, 'nonce=child_temp_nonce' ) !== false ) { - $open_location = str_replace( 'nonce=child_temp_nonce', 'nonce=' . wp_create_nonce( 'wp-ajax' ), $open_location ); - } - } - wp_safe_redirect( site_url() . $open_location ); - exit(); - } - - wp_safe_redirect( admin_url( $where ) ); - exit(); } - + /** * Security */ @@ -1219,8 +1012,9 @@ class MainWP_Child { } } - $auth_user = false; - if ( $auth ) { + + if ( $auth ) { + $auth_user = false; // Check if the user exists & is an administrator. if ( isset( $_POST['function'] ) && isset( $_POST['user'] ) ) { @@ -1263,7 +1057,7 @@ class MainWP_Child { } } - // Redirect to the admin part if needed. + // Redirect to the admin side if needed. if ( isset( $_POST['admin'] ) && '1' === $_POST['admin'] ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/' ); die(); @@ -1271,37 +1065,141 @@ class MainWP_Child { } // Init extensions. - // Handle fatal errors for those init if needed. - \MainWP_Child_IThemes_Security::instance()->ithemes_init(); - \MainWP_Child_Updraft_Plus_Backups::instance()->updraftplus_init(); - \MainWP_Child_Back_Up_WordPress::instance()->init(); - \MainWP_Child_WP_Rocket::instance()->init(); - \MainWP_Child_Back_WP_Up::instance()->init(); - \MainWP_Child_Back_Up_Buddy::instance(); - \MainWP_Child_Wordfence::instance()->wordfence_init(); - \MainWP_Child_Timecapsule::instance()->init(); - MainWP_Child_Staging::instance()->init(); - MainWP_Child_Branding::instance()->branding_init(); - MainWP_Client_Report::instance()->creport_init(); - \MainWP_Child_Pagespeed::instance()->init(); - \MainWP_Child_Links_Checker::instance()->init(); - \MainWP_Child_WPvivid_BackupRestore::instance()->init(); - + $this->init_extensions(); + global $_wp_submenu_nopriv; if ( null === $_wp_submenu_nopriv ) { $_wp_submenu_nopriv = array(); // phpcs:ignore -- to fix warning. } + $this->parse_callable_functions( $auth ); + $this->parse_keyword_links(); + } + + + private function parse_login_required() { + + global $current_user; + + $alter_login_required = false; + $username = rawurldecode( $_REQUEST['user'] ); + + if ( isset( $_REQUEST['alt_user'] ) && ! empty( $_REQUEST['alt_user'] ) ) { + $alter_login_required = $this->check_login_as( $_REQUEST['alt_user'] ); + + if ( $alter_login_required ) { + $username = rawurldecode( $_REQUEST['alt_user'] ); + } + } + + if ( is_user_logged_in() ) { + global $current_user; + if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { + do_action( 'wp_logout' ); + } + } + + $signature = rawurldecode( isset( $_REQUEST['mainwpsignature'] ) ? $_REQUEST['mainwpsignature'] : '' ); + $file = ''; + if ( isset( $_REQUEST['f'] ) ) { + $file = $_REQUEST['f']; + } elseif ( isset( $_REQUEST['file'] ) ) { + $file = $_REQUEST['file']; + } elseif ( isset( $_REQUEST['fdl'] ) ) { + $file = $_REQUEST['fdl']; + } + + $auth = $this->auth( $signature, rawurldecode( ( isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : $file ) ), isset( $_REQUEST['nonce'] ) ? $_REQUEST['nonce'] : '', isset( $_REQUEST['nossl'] ) ? $_REQUEST['nossl'] : 0 ); + if ( ! $auth ) { + return; + } + + if ( ! is_user_logged_in() || $username !== $current_user->user_login ) { + if ( ! $this->login( $username ) ) { + return; + } + + global $current_user; + if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { + // if is not alternative admin login. + // it is connected admin login. + if ( ! $alter_login_required ) { + // log out if connected admin is not admin level 10. + do_action( 'wp_logout' ); + + return; + } + } + } + + if ( isset( $_REQUEST['fdl'] ) ) { + if ( stristr( $_REQUEST['fdl'], '..' ) ) { + return; + } + + $this->upload_file( $_REQUEST['fdl'], isset( $_REQUEST['foffset'] ) ? $_REQUEST['foffset'] : 0 ); + exit; + } + + $where = isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : ''; + if ( isset( $_POST['f'] ) || isset( $_POST['file'] ) ) { + $file = ''; + if ( isset( $_POST['f'] ) ) { + $file = $_POST['f']; + } elseif ( isset( $_POST['file'] ) ) { + $file = $_POST['file']; + } + + $where = 'admin.php?page=mainwp_child_tab&tab=restore-clone'; + if ( '' === session_id() ) { + session_start(); + } + $_SESSION['file'] = $file; + $_SESSION['size'] = $_POST['size']; + } + + // to support open not wp-admin url. + $open_location = isset( $_REQUEST['open_location'] ) ? $_REQUEST['open_location'] : ''; + if ( ! empty( $open_location ) ) { + $open_location = base64_decode( $open_location ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. + $_vars = MainWP_Helper::parse_query( $open_location ); + $_path = wp_parse_url( $open_location, PHP_URL_PATH ); + if ( isset( $_vars['_mwpNoneName'] ) && isset( $_vars['_mwpNoneValue'] ) ) { + $_vars[ $_vars['_mwpNoneName'] ] = wp_create_nonce( $_vars['_mwpNoneValue'] ); + unset( $_vars['_mwpNoneName'] ); + unset( $_vars['_mwpNoneValue'] ); + $open_url = ''; + foreach ( $_vars as $key => $value ) { + $open_url .= $key . '=' . $value . '&'; + } + $open_url = rtrim( $open_url, '&' ); + $open_location = '/wp-admin/' . $_path . '?' . $open_url; + } else { + if ( strpos( $open_location, 'nonce=child_temp_nonce' ) !== false ) { + $open_location = str_replace( 'nonce=child_temp_nonce', 'nonce=' . wp_create_nonce( 'wp-ajax' ), $open_location ); + } + } + wp_safe_redirect( site_url() . $open_location ); + exit(); + } + + wp_safe_redirect( admin_url( $where ) ); + + exit(); + + } + + + private function parse_callable_functions( $auth ){ $callable = false; $func_auth = false; $callable_no_auth = false; $func_no_auth = false; - if ( isset( $_POST['function'] ) ) { - + // check to execute mainwp child's callable functions. + if ( isset( $_POST['function'] ) ) { $func = $_POST['function']; - $callable = MainWP_Child_Callable::get_instance()->is_callable_function( $func ); if ( $callable ) { $func_auth = $func; @@ -1328,17 +1226,7 @@ class MainWP_Child { } 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' ) ); } - - if ( 1 === (int) get_option( 'mainwpKeywordLinks' ) ) { - new MainWP_Keyword_Links(); - if ( ! is_admin() ) { - add_filter( 'the_content', array( MainWP_Keyword_Links::instance(), 'filter_content' ), 100 ); - } - MainWP_Keyword_Links::instance()->update_htaccess(); - MainWP_Keyword_Links::instance()->redirect_cloak(); - } elseif ( 'yes' === get_option( 'mainwp_keyword_links_htaccess_set' ) ) { - MainWP_Keyword_Links::clear_htaccess(); - } + } // Check to support login by alternative admin. @@ -1485,6 +1373,40 @@ class MainWP_Child { MainWP_Child_Stats::get_instance()->get_site_stats( $information ); } + + + private function init_extensions() { + // Handle fatal errors for those init if needed. + \MainWP_Child_IThemes_Security::instance()->ithemes_init(); + \MainWP_Child_Updraft_Plus_Backups::instance()->updraftplus_init(); + \MainWP_Child_Back_Up_WordPress::instance()->init(); + \MainWP_Child_WP_Rocket::instance()->init(); + \MainWP_Child_Back_WP_Up::instance()->init(); + \MainWP_Child_Back_Up_Buddy::instance(); + \MainWP_Child_Wordfence::instance()->wordfence_init(); + \MainWP_Child_Timecapsule::instance()->init(); + MainWP_Child_Staging::instance()->init(); + MainWP_Child_Branding::instance()->branding_init(); + MainWP_Client_Report::instance()->creport_init(); + \MainWP_Child_Pagespeed::instance()->init(); + \MainWP_Child_Links_Checker::instance()->init(); + \MainWP_Child_WPvivid_BackupRestore::instance()->init(); + } + + private function parse_keyword_links() { + + if ( 1 === (int) get_option( 'mainwpKeywordLinks' ) ) { + new MainWP_Keyword_Links(); + if ( ! is_admin() ) { + add_filter( 'the_content', array( MainWP_Keyword_Links::instance(), 'filter_content' ), 100 ); + } + MainWP_Keyword_Links::instance()->update_htaccess(); + MainWP_Keyword_Links::instance()->redirect_cloak(); + } elseif ( 'yes' === get_option( 'mainwp_keyword_links_htaccess_set' ) ) { + MainWP_Keyword_Links::clear_htaccess(); + } + + } public function maintenance_alert_404() { if ( ! is_404() ) { diff --git a/class/class-mainwp-client-report.php b/class/class-mainwp-client-report.php index 91dce93..45d88bf 100644 --- a/class/class-mainwp-client-report.php +++ b/class/class-mainwp-client-report.php @@ -579,21 +579,9 @@ class MainWP_Client_Report { public function get_section_loop_data( $records, $tokens, $section, $skip_records = array() ) { - $maintenance_details = array( - 'revisions' => __( 'Delete all post revisions', 'mainwp-child' ), - 'revisions_max' => __( 'Delete all post revisions, except for the last:', 'mainwp-child' ), - 'autodraft' => __( 'Delete all auto draft posts', 'mainwp-child' ), - 'trashpost' => __( 'Delete trash posts', 'mainwp-child' ), - 'spam' => __( 'Delete spam comments', 'mainwp-child' ), - 'pending' => __( 'Delete pending comments', 'mainwp-child' ), - 'trashcomment' => __( 'Delete trash comments', 'mainwp-child' ), - 'tags' => __( 'Delete tags with 0 posts associated', 'mainwp-child' ), - 'categories' => __( 'Delete categories with 0 posts associated', 'mainwp-child' ), - 'optimize' => __( 'Optimize database tables', 'mainwp-child' ), - ); - $context = ''; $action = ''; + $str_tmp = str_replace( array( '[', ']' ), '', $section ); $array_tmp = explode( '.', $str_tmp ); if ( is_array( $array_tmp ) ) { @@ -617,10 +605,27 @@ class MainWP_Client_Report { $context = 'users'; // see class-connector-user.php. } } + + return $this->get_section_loop_records( $records, $tokens, $connector, $context, $action, $skip_records ); + } - $loops = array(); - $loop_count = 0; - + public function get_section_loop_records( $records, $tokens, $connector, $context, $action, $skip_records ) { + + $maintenance_details = array( + 'revisions' => __( 'Delete all post revisions', 'mainwp-child' ), + 'revisions_max' => __( 'Delete all post revisions, except for the last:', 'mainwp-child' ), + 'autodraft' => __( 'Delete all auto draft posts', 'mainwp-child' ), + 'trashpost' => __( 'Delete trash posts', 'mainwp-child' ), + 'spam' => __( 'Delete spam comments', 'mainwp-child' ), + 'pending' => __( 'Delete pending comments', 'mainwp-child' ), + 'trashcomment' => __( 'Delete trash comments', 'mainwp-child' ), + 'tags' => __( 'Delete tags with 0 posts associated', 'mainwp-child' ), + 'categories' => __( 'Delete categories with 0 posts associated', 'mainwp-child' ), + 'optimize' => __( 'Optimize database tables', 'mainwp-child' ), + ); + + $loops = array(); + $loop_count = 0; foreach ( $records as $record ) { if ( in_array( $record->ID, $skip_records ) ) { @@ -682,6 +687,7 @@ class MainWP_Client_Report { $token_values = array(); foreach ( $tokens as $token ) { + $data = ''; $token_name = str_replace( array( '[', ']' ), '', $token ); $array_tmp = explode( '.', $token_name ); @@ -710,162 +716,171 @@ class MainWP_Client_Report { $data = 'roles'; } - switch ( $data ) { - case 'ID': - $tok_value = $record->ID; - break; - case 'date': - $tok_value = MainWP_Helper::format_date( MainWP_Helper::get_timestamp( strtotime( $record->created ) ) ); - break; - case 'time': - $tok_value = MainWP_Helper::format_time( MainWP_Helper::get_timestamp( strtotime( $record->created ) ) ); - break; - case 'area': - $data = 'sidebar_name'; - $tok_value = $this->get_stream_meta_data( $record, $data ); - break; - case 'name': - case 'version': - case 'old_version': - case 'new_version': - case 'display_name': - case 'roles': - if ( 'name' == $data ) { - if ( 'profiles' == $context ) { - $data = 'display_name'; - } - } - $tok_value = $this->get_stream_meta_data( $record, $data ); - break; - case 'title': - if ( 'comments' === $context ) { - $tok_value = $record->summary; - } else { - if ( 'page' === $context || 'post' === $context ) { - $data = 'post_title'; - } elseif ( 'menus' === $record->connector ) { - $data = 'name'; - } - $tok_value = $this->get_stream_meta_data( $record, $data ); - } - break; - case 'author': - if ( 'comment' == $connector ) { - $data = 'user_name'; - } else { - $data = 'user_meta'; - } - - $value = $this->get_stream_meta_data( $record, $data ); - - if ( empty( $value ) && 'comments' === $context ) { - $value = __( 'Guest', 'mainwp-child' ); - } - - // check compatibility with old meta data. - if ( empty( $value ) ) { - $value = $this->get_stream_meta_data( $record, 'author_meta' ); - } - - $tok_value = $value; - break; - case 'status': - case 'webtrust': - if ( 'sucuri_scan' === $context ) { - $scan_data = $this->get_stream_meta_data( $record, 'scan_data' ); - if ( ! empty( $scan_data ) ) { - $scan_data = maybe_unserialize( base64_decode( $scan_data ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - if ( is_array( $scan_data ) ) { - - $blacklisted = $scan_data['blacklisted']; - $malware_exists = $scan_data['malware_exists']; - - $status = array(); - if ( $blacklisted ) { - $status[] = __( 'Site Blacklisted', 'mainwp-child' ); } - if ( $malware_exists ) { - $status[] = __( 'Site With Warnings', 'mainwp-child' ); } - - if ( 'status' == $data ) { - $tok_value = count( $status ) > 0 ? implode( ', ', $status ) : __( 'Verified Clear', 'mainwp-child' ); - } elseif ( 'webtrust' == $data ) { - $tok_value = $blacklisted ? __( 'Site Blacklisted', 'mainwp-child' ) : __( 'Trusted', 'mainwp-child' ); - } - } - } else { - $tok_value = $this->get_stream_meta_data( $record, $data ); - } - } else { - $tok_value = $value; - } - break; - case 'details': - case 'result': - if ( 'mainwp_maintenance' === $context && 'details' == $data ) { - - $meta_value = $this->get_stream_meta_data( $record, $data ); - $meta_value = explode( ',', $meta_value ); - - $details = array(); - - if ( is_array( $meta_value ) ) { - foreach ( $meta_value as $mt ) { - if ( isset( $maintenance_details[ $mt ] ) ) { - if ( 'revisions_max' == $mt ) { - $max_revisions = $this->get_stream_meta_data( $record, 'revisions' ); - $dtl = $maintenance_details['revisions_max'] . ' ' . $max_revisions; - } else { - $dtl = $maintenance_details[ $mt ]; - } - $details[] = $dtl; - } - } - } - $tok_value = implode( ', ', $details ); - - } elseif ( 'wordfence_scan' === $context || 'mainwp_maintenance' === $context ) { - $meta_value = $this->get_stream_meta_data( $record, $data ); - if ( 'wordfence_scan' === $context && 'result' == $data ) { - // SUM_FINAL:Scan complete. You have xxx new issues to fix. See below. - // SUM_FINAL:Scan complete. Congratulations, no new problems found. - if ( stripos( $meta_value, 'Congratulations' ) ) { - $meta_value = 'No issues detected'; - } elseif ( stripos( $meta_value, 'You have' ) ) { - $meta_value = 'Issues Detected'; - } else { - $meta_value = ''; - } - } - $tok_value = $meta_value; - } - break; - case 'type': - if ( 'backups' === $context ) { - $tok_value = $this->get_stream_meta_data( $record, $data ); - } else { - $tok_value = $token; - } - break; - default: - $tok_value = 'N/A'; - break; - } - + $tok_value = $this->get_section_loop_token_value( $record, $data, $context, $token ); + $token_values[ $token ] = $tok_value; if ( empty( $tok_value ) ) { - if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG === true ) { - error_log( 'MainWP Child Report:: skip empty value :: token :: ' . $token . ' :: record :: ' . print_r( $record, true ) ); // phpcs:ignore -- debug mode only. - } + $msg = 'MainWP Child Report:: skip empty value :: token :: ' . $token . ' :: record :: ' . print_r( $record, true ); // phpcs:ignore -- debug mode only. + MainWP_Helper::log_debug( $msg ); } + } if ( ! empty( $token_values ) ) { $loops[ $loop_count ] = $token_values; $loop_count ++; } + } + return $loops; + } + + public function get_section_loop_token_value( $record, $data, $context, $token ) { + + $tok_value = ''; + + switch ( $data ) { + case 'ID': + $tok_value = $record->ID; + break; + case 'date': + $tok_value = MainWP_Helper::format_date( MainWP_Helper::get_timestamp( strtotime( $record->created ) ) ); + break; + case 'time': + $tok_value = MainWP_Helper::format_time( MainWP_Helper::get_timestamp( strtotime( $record->created ) ) ); + break; + case 'area': + $data = 'sidebar_name'; + $tok_value = $this->get_stream_meta_data( $record, $data ); + break; + case 'name': + case 'version': + case 'old_version': + case 'new_version': + case 'display_name': + case 'roles': + if ( 'name' == $data ) { + if ( 'profiles' == $context ) { + $data = 'display_name'; + } + } + $tok_value = $this->get_stream_meta_data( $record, $data ); + break; + case 'title': + if ( 'comments' === $context ) { + $tok_value = $record->summary; + } else { + if ( 'page' === $context || 'post' === $context ) { + $data = 'post_title'; + } elseif ( 'menus' === $record->connector ) { + $data = 'name'; + } + $tok_value = $this->get_stream_meta_data( $record, $data ); + } + break; + case 'author': + if ( 'comment' == $connector ) { + $data = 'user_name'; + } else { + $data = 'user_meta'; + } + + $value = $this->get_stream_meta_data( $record, $data ); + + if ( empty( $value ) && 'comments' === $context ) { + $value = __( 'Guest', 'mainwp-child' ); + } + + // check compatibility with old meta data. + if ( empty( $value ) ) { + $value = $this->get_stream_meta_data( $record, 'author_meta' ); + } + + $tok_value = $value; + break; + case 'status': + case 'webtrust': + if ( 'sucuri_scan' === $context ) { + $scan_data = $this->get_stream_meta_data( $record, 'scan_data' ); + if ( ! empty( $scan_data ) ) { + $scan_data = maybe_unserialize( base64_decode( $scan_data ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. + if ( is_array( $scan_data ) ) { + + $blacklisted = $scan_data['blacklisted']; + $malware_exists = $scan_data['malware_exists']; + + $status = array(); + if ( $blacklisted ) { + $status[] = __( 'Site Blacklisted', 'mainwp-child' ); } + if ( $malware_exists ) { + $status[] = __( 'Site With Warnings', 'mainwp-child' ); } + + if ( 'status' == $data ) { + $tok_value = count( $status ) > 0 ? implode( ', ', $status ) : __( 'Verified Clear', 'mainwp-child' ); + } elseif ( 'webtrust' == $data ) { + $tok_value = $blacklisted ? __( 'Site Blacklisted', 'mainwp-child' ) : __( 'Trusted', 'mainwp-child' ); + } + } + } else { + $tok_value = $this->get_stream_meta_data( $record, $data ); + } + } else { + $tok_value = $value; + } + break; + case 'details': + case 'result': + if ( 'mainwp_maintenance' === $context && 'details' == $data ) { + + $meta_value = $this->get_stream_meta_data( $record, $data ); + $meta_value = explode( ',', $meta_value ); + + $details = array(); + + if ( is_array( $meta_value ) ) { + foreach ( $meta_value as $mt ) { + if ( isset( $maintenance_details[ $mt ] ) ) { + if ( 'revisions_max' == $mt ) { + $max_revisions = $this->get_stream_meta_data( $record, 'revisions' ); + $dtl = $maintenance_details['revisions_max'] . ' ' . $max_revisions; + } else { + $dtl = $maintenance_details[ $mt ]; + } + $details[] = $dtl; + } + } + } + $tok_value = implode( ', ', $details ); + + } elseif ( 'wordfence_scan' === $context || 'mainwp_maintenance' === $context ) { + $meta_value = $this->get_stream_meta_data( $record, $data ); + if ( 'wordfence_scan' === $context && 'result' == $data ) { + // SUM_FINAL:Scan complete. You have xxx new issues to fix. See below. + // SUM_FINAL:Scan complete. Congratulations, no new problems found. + if ( stripos( $meta_value, 'Congratulations' ) ) { + $meta_value = 'No issues detected'; + } elseif ( stripos( $meta_value, 'You have' ) ) { + $meta_value = 'Issues Detected'; + } else { + $meta_value = ''; + } + } + $tok_value = $meta_value; + } + break; + case 'type': + if ( 'backups' === $context ) { + $tok_value = $this->get_stream_meta_data( $record, $data ); + } else { + $tok_value = $token; + } + break; + default: + $tok_value = 'N/A'; + break; } - return $loops; + + return $tok_value; } public function get_stream_meta_data( $record, $data ) { diff --git a/class/class-mainwp-clone-install.php b/class/class-mainwp-clone-install.php index e88b5ee..fab6377 100644 --- a/class/class-mainwp-clone-install.php +++ b/class/class-mainwp-clone-install.php @@ -137,7 +137,7 @@ class MainWP_Clone_Install { if ( false === $configContents ) { throw new \Exception( __( 'Cant read configuration file from the backup.', 'mainwp-child' ) ); } - if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG ) { + if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) { $this->config = wp_json_decode( $configContents ); } else { $this->config = maybe_unserialize( base64_decode( $configContents ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- safe. @@ -602,4 +602,128 @@ class MainWP_Clone_Install { return $data; } + + public function request_clone_funct() { + + if ( ! isset( $_REQUEST['key'] ) ) { + return; + } + if ( ! isset( $_REQUEST['f'] ) || ( '' === $_REQUEST['f'] ) ) { + return; + } + if ( ! $this->is_valid_auth( $_REQUEST['key'] ) ) { + return; + } + + global $mainWPChild; + + if ( 'dl' === $_REQUEST['cloneFunc'] ) { + $mainWPChild->upload_file( $_REQUEST['f'] ); + exit; + } elseif ( 'deleteCloneBackup' === $_POST['cloneFunc'] ) { + $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); + $backupdir = $dirs[0]; + $result = glob( $backupdir . $_POST['f'] ); + if ( 0 === count( $result ) ) { + return; + } + + unlink( $result[0] ); + mainwp_child_helper()->write( array( 'result' => 'ok' ) ); + } elseif ( 'createCloneBackupPoll' === $_POST['cloneFunc'] ) { + $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); + $backupdir = $dirs[0]; + $result = glob( $backupdir . 'backup-' . $_POST['f'] . '-*' ); + $archiveFile = false; + foreach ( $result as $file ) { + if ( MainWP_Helper::is_archive( $file, 'backup-' . $_POST['f'] . '-' ) ) { + $archiveFile = $file; + break; + } + } + if ( false === $archiveFile ) { + return; + } + + mainwp_child_helper()->write( array( 'size' => filesize( $archiveFile ) ) ); + } elseif ( 'createCloneBackup' === $_POST['cloneFunc'] ) { + MainWP_Helper::end_session(); + + $files = glob( WP_CONTENT_DIR . '/dbBackup*.sql' ); + foreach ( $files as $file ) { + unlink( $file ); + } + if ( file_exists( ABSPATH . 'clone/config.txt' ) ) { + unlink( ABSPATH . 'clone/config.txt' ); + } + if ( MainWP_Helper::is_dir_empty( ABSPATH . 'clone' ) ) { + rmdir( ABSPATH . 'clone' ); + } + + $wpversion = $_POST['wpversion']; + global $wp_version; + $includeCoreFiles = ( $wpversion !== $wp_version ); + $excludes = ( isset( $_POST['exclude'] ) ? explode( ',', $_POST['exclude'] ) : array() ); + $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/uploads/mainwp'; + $uploadDir = MainWP_Helper::get_mainwp_dir(); + $uploadDir = $uploadDir[0]; + $excludes[] = str_replace( ABSPATH, '', $uploadDir ); + $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/object-cache.php'; + if ( version_compare( phpversion(), '5.3.0' ) >= 0 || ! ini_get( 'safe_mode' ) ) { + set_time_limit( 6000 ); + } + + $newExcludes = array(); + foreach ( $excludes as $exclude ) { + $newExcludes[] = rtrim( $exclude, '/' ); + } + + $method = ( ! isset( $_POST['zipmethod'] ) ? 'tar.gz' : $_POST['zipmethod'] ); + if ( 'tar.gz' === $method && ! function_exists( 'gzopen' ) ) { + $method = 'zip'; + } + + $res = MainWP_Backup::get()->create_full_backup( $newExcludes, ( isset( $_POST['f'] ) ? $_POST['f'] : $_POST['file'] ), true, $includeCoreFiles, 0, false, false, false, false, $method ); + if ( ! $res ) { + $information['backup'] = false; + } else { + $information['backup'] = $res['file']; + $information['size'] = $res['filesize']; + } + + $plugins = array(); + $dir = WP_CONTENT_DIR . '/plugins/'; + $fh = opendir( $dir ); + $entry = readdir( $fh ); + while ( $entry ) { + if ( ! is_dir( $dir . $entry ) ) { + continue; + } + if ( ( '.' === $entry ) || ( '..' === $entry ) ) { + continue; + } + $plugins[] = $entry; + } + closedir( $fh ); + $information['plugins'] = $plugins; + + $themes = array(); + $dir = WP_CONTENT_DIR . '/themes/'; + $fh = opendir( $dir ); + while ( $entry = readdir( $fh ) ) { + if ( ! is_dir( $dir . $entry ) ) { + continue; + } + if ( ( '.' === $entry ) || ( '..' === $entry ) ) { + continue; + } + $themes[] = $entry; + } + closedir( $fh ); + $information['themes'] = $themes; + + mainwp_child_helper()->write( $information ); + } + return true; + } } diff --git a/class/class-mainwp-debug.php b/class/class-mainwp-debug.php index c23fda8..49d1657 100644 --- a/class/class-mainwp-debug.php +++ b/class/class-mainwp-debug.php @@ -7,7 +7,7 @@ class MainWP_Debug { * @param $mainWPChild MainWP_Child */ public static function process( &$mainWPChild ) { - if ( ! isset( $_GET['mainwpdebug'] ) || ! defined( 'MAINWP_DEBUG' ) || ( MAINWP_DEBUG !== true ) ) { + if ( ! isset( $_GET['mainwpdebug'] ) || ! defined( 'MAINWP_CHILD_DEBUG' ) || ( MAINWP_CHILD_DEBUG !== true ) ) { return; } diff --git a/class/class-mainwp-helper.php b/class/class-mainwp-helper.php index 7f0409d..05f6efb 100644 --- a/class/class-mainwp-helper.php +++ b/class/class-mainwp-helper.php @@ -374,498 +374,6 @@ class MainWP_Helper { return array( 'path' => $full_file_name ); } - public static function create_post( $new_post, $post_custom, $post_category, $post_featured_image, $upload_dir, $post_tags, $others = array() ) { - global $current_user; - - /** - * Hook: `mainwp_before_post_update` - * - * Runs before creating or updating a post via MainWP dashboard. - * - * @param array $new_post – Post data array. - * @param array $post_custom – Post custom meta data. - * @param string $post_category – Post categories. - * @param string $post_tags – Post tags. - */ - - do_action( 'mainwp_before_post_update', $new_post, $post_custom, $post_category, $post_tags ); - - // Options fields. - $wprocket_fields = array( - 'lazyload', - 'lazyload_iframes', - 'minify_html', - 'minify_css', - 'minify_js', - 'cdn', - 'async_css', - 'defer_all_js', - ); - - $wprocket_activated = false; - if ( \MainWP_Child_WP_Rocket::instance()->is_activated() ) { - if ( function_exists( 'get_rocket_option' ) ) { - $wprocket_activated = true; - foreach ( $wprocket_fields as $field ) { - if ( ! isset( $post_custom[ '_rocket_exclude_' . $field ] ) ) { - if ( ! get_rocket_option( $field ) ) { - $post_custom[ '_rocket_exclude_' . $field ] = array( true ); - } - } - } - } - } - - if ( ! $wprocket_activated ) { - foreach ( $wprocket_fields as $field ) { - if ( isset( $post_custom[ '_rocket_exclude_' . $field ] ) ) { - unset( $post_custom[ '_rocket_exclude_' . $field ] ); - } - } - } - - // current user may be connected admin or alternative admin. - $current_uid = $current_user->ID; - // Set up a new post (adding addition information). - - $post_author = isset( $new_post['post_author'] ) ? $new_post['post_author'] : $current_uid; - - if ( isset( $new_post['custom_post_author'] ) && ! empty( $new_post['custom_post_author'] ) ) { - $_author = get_user_by( 'login', $new_post['custom_post_author'] ); - if ( ! empty( $_author ) ) { - $new_post['post_author'] = $_author->ID; - } else { - $new_post['post_author'] = $current_uid; - } - unset( $new_post['custom_post_author'] ); - } - - $post_author = ! empty( $post_author ) ? $post_author : $current_uid; - $new_post['post_author'] = $post_author; - - $terms = isset( $new_post['_ezin_post_category'] ) ? $new_post['_ezin_post_category'] : false; - unset( $new_post['_ezin_post_category'] ); - $is_post_plus = isset( $post_custom['_mainwp_post_plus'] ) ? true : false; - - $wp_error = null; - - if ( $is_post_plus ) { - if ( isset( $new_post['post_date_gmt'] ) && ! empty( $new_post['post_date_gmt'] ) && '0000-00-00 00:00:00' != $new_post['post_date_gmt'] ) { - $post_date_timestamp = strtotime( $new_post['post_date_gmt'] ) + get_option( 'gmt_offset' ) * 60 * 60; - $new_post['post_date'] = date( 'Y-m-d H:i:s', $post_date_timestamp ); // phpcs:ignore -- local time. - } - } - - $wpr_options = isset( $_POST['wpr_options'] ) ? $_POST['wpr_options'] : array(); - - $edit_post_id = 0; - - if ( isset( $post_custom['_mainwp_edit_post_id'] ) && $post_custom['_mainwp_edit_post_id'] ) { - $edit_post_id = current( $post_custom['_mainwp_edit_post_id'] ); - } elseif ( isset( $new_post['ID'] ) && $new_post['ID'] ) { - $edit_post_id = $new_post['ID']; - } - - require_once ABSPATH . 'wp-admin/includes/post.php'; - if ( $edit_post_id ) { - $user_id = wp_check_post_lock( $edit_post_id ); - if ( $user_id ) { - $user = get_userdata( $user_id ); - $error = sprintf( __( 'This content is currently locked. %s is currently editing.', 'mainwp-child' ), $user->display_name ); - return array( 'error' => $error ); - } - } - - $check_image_existed = false; - if ( $edit_post_id ) { - $check_image_existed = true; // if editing post then will check if image existed. - } - - // Search for all the images added to the new post. Some images have a href tag to click to navigate to the image.. we need to replace this too. - $foundMatches = preg_match_all( '/(]+href=\"(.*?)\"[^>]*>)?(\/]*src=\"((.*?)(png|gif|jpg|jpeg))\")/ix', $new_post['post_content'], $matches, PREG_SET_ORDER ); - if ( $foundMatches > 0 ) { - // We found images, now to download them so we can start balbal. - foreach ( $matches as $match ) { - $hrefLink = $match[2]; - $imgUrl = $match[4]; - - if ( ! isset( $upload_dir['baseurl'] ) || ( 0 !== strripos( $imgUrl, $upload_dir['baseurl'] ) ) ) { - continue; - } - - if ( preg_match( '/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $imgUrl, $imgMatches ) ) { - $search = $imgMatches[0]; - $replace = '.' . $match[6]; - $originalImgUrl = str_replace( $search, $replace, $imgUrl ); - } else { - $originalImgUrl = $imgUrl; - } - - try { - $downloadfile = self::upload_image( $originalImgUrl, array(), $check_image_existed ); - $localUrl = $downloadfile['url']; - $linkToReplaceWith = dirname( $localUrl ); - if ( '' !== $hrefLink ) { - $server = get_option( 'mainwp_child_server' ); - $serverHost = wp_parse_url( $server, PHP_URL_HOST ); - if ( ! empty( $serverHost ) && strpos( $hrefLink, $serverHost ) !== false ) { - $serverHref = 'href="' . $serverHost; - $replaceServerHref = 'href="' . wp_parse_url( $localUrl, PHP_URL_SCHEME ) . '://' . wp_parse_url( $localUrl, PHP_URL_HOST ); - $new_post['post_content'] = str_replace( $serverHref, $replaceServerHref, $new_post['post_content'] ); - } - } - $lnkToReplace = dirname( $imgUrl ); - if ( 'http:' !== $lnkToReplace && 'https:' !== $lnkToReplace ) { - $new_post['post_content'] = str_replace( $lnkToReplace, $linkToReplaceWith, $new_post['post_content'] ); - } - } catch ( \Exception $e ) { - self::log_debug( $e->getMessage() ); - } - } - } - - if ( has_shortcode( $new_post['post_content'], 'gallery' ) ) { - if ( preg_match_all( '/\[gallery[^\]]+ids=\"(.*?)\"[^\]]*\]/ix', $new_post['post_content'], $matches, PREG_SET_ORDER ) ) { - $replaceAttachedIds = array(); - if ( isset( $_POST['post_gallery_images'] ) ) { - $post_gallery_images = unserialize( base64_decode( $_POST['post_gallery_images'] ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - if ( is_array( $post_gallery_images ) ) { - foreach ( $post_gallery_images as $gallery ) { - if ( isset( $gallery['src'] ) ) { - try { - $upload = self::upload_image( $gallery['src'], $gallery ); // Upload image to WP. - if ( null !== $upload ) { - $replaceAttachedIds[ $gallery['id'] ] = $upload['id']; - } - } catch ( \Exception $e ) { - // ok! - } - } - } - } - } - if ( count( $replaceAttachedIds ) > 0 ) { - foreach ( $matches as $match ) { - $idsToReplace = $match[1]; - $idsToReplaceWith = ''; - $originalIds = explode( ',', $idsToReplace ); - foreach ( $originalIds as $attached_id ) { - if ( ! empty( $originalIds ) && isset( $replaceAttachedIds[ $attached_id ] ) ) { - $idsToReplaceWith .= $replaceAttachedIds[ $attached_id ] . ','; - } - } - $idsToReplaceWith = rtrim( $idsToReplaceWith, ',' ); - if ( ! empty( $idsToReplaceWith ) ) { - $new_post['post_content'] = str_replace( '"' . $idsToReplace . '"', '"' . $idsToReplaceWith . '"', $new_post['post_content'] ); - } - } - } - } - } - - if ( $is_post_plus ) { - $random_publish_date = isset( $post_custom['_saved_draft_random_publish_date'] ) ? $post_custom['_saved_draft_random_publish_date'] : false; - $random_publish_date = is_array( $random_publish_date ) ? current( $random_publish_date ) : null; - if ( ! empty( $random_publish_date ) ) { - $random_date_from = isset( $post_custom['_saved_draft_publish_date_from'] ) ? $post_custom['_saved_draft_publish_date_from'] : 0; - $random_date_from = is_array( $random_date_from ) ? current( $random_date_from ) : 0; - - $random_date_to = isset( $post_custom['_saved_draft_publish_date_to'] ) ? $post_custom['_saved_draft_publish_date_to'] : 0; - $random_date_to = is_array( $random_date_to ) ? current( $random_date_to ) : 0; - - $now = time(); - - if ( empty( $random_date_from ) ) { - $random_date_from = $now; - } - - if ( empty( $random_date_to ) ) { - $random_date_to = $now; - } - - if ( $random_date_from === $now && $random_date_from === $random_date_to ) { - $random_date_to = $now + 7 * 24 * 3600; - } - - if ( $random_date_from > $random_date_to ) { - $tmp = $random_date_from; - $random_date_from = $random_date_to; - $random_date_to = $tmp; - } - - $random_timestamp = wp_rand( $random_date_from, $random_date_to ); - $new_post['post_date'] = date( 'Y-m-d H:i:s', $random_timestamp ); // phpcs:ignore -- local time. - } - } - - if ( isset( $post_tags ) && '' !== $post_tags ) { - $new_post['tags_input'] = $post_tags; - } - - // Save the post to the WP. - remove_filter( 'content_save_pre', 'wp_filter_post_kses' ); // to fix brake scripts or html. - $post_status = $new_post['post_status']; - $new_post['post_status'] = 'auto-draft'; // child reports: to logging as created post. - - // update post. - if ( $edit_post_id ) { - // check if post existed. - $current_post = get_post( $edit_post_id ); - if ( $current_post && ( ( ! isset( $new_post['post_type'] ) && 'post' == $current_post->post_type ) || ( isset( $new_post['post_type'] ) && $new_post['post_type'] == $current_post->post_type ) ) ) { - $new_post['ID'] = $edit_post_id; - } - $new_post['post_status'] = $post_status; // child reports: to logging as update post. - } - - $new_post_id = wp_insert_post( $new_post, $wp_error ); - - // Show errors if something went wrong. - if ( is_wp_error( $wp_error ) ) { - return $wp_error->get_error_message(); - } - if ( empty( $new_post_id ) ) { - return array( 'error' => 'Empty post id' ); - } - - if ( ! $edit_post_id ) { - wp_update_post( - array( - 'ID' => $new_post_id, - 'post_status' => $post_status, - ) - ); - } - - if ( ! empty( $terms ) ) { - wp_set_object_terms( $new_post_id, array_map( intval, $terms ), 'category' ); - } - - $permalink = get_permalink( $new_post_id ); - - $seo_ext_activated = false; - - if ( class_exists( 'WPSEO_Meta' ) && class_exists( 'WPSEO_Admin' ) ) { - $seo_ext_activated = true; - } - - // Set custom fields. - $not_allowed = array( - '_slug', - '_tags', - '_edit_lock', - '_selected_sites', - '_selected_groups', - '_selected_by', - '_categories', - '_edit_last', - '_sticky', - '_mainwp_post_dripper', - '_bulkpost_do_not_del', - '_mainwp_spin_me', - ); - $not_allowed[] = '_mainwp_boilerplate_sites_posts'; - $not_allowed[] = '_ezine_post_keyword'; - $not_allowed[] = '_ezine_post_display_sig'; - $not_allowed[] = '_ezine_post_remove_link'; - $not_allowed[] = '_ezine_post_grab_image'; - $not_allowed[] = '_ezine_post_grab_image_placement'; - $not_allowed[] = '_ezine_post_template_id'; - - $not_allowed[] = '_mainwp_post_plus'; - $not_allowed[] = '_saved_as_draft'; - $not_allowed[] = '_saved_draft_categories'; - $not_allowed[] = '_saved_draft_tags'; - $not_allowed[] = '_saved_draft_random_privelege'; - $not_allowed[] = '_saved_draft_random_category'; - $not_allowed[] = '_saved_draft_random_publish_date'; - $not_allowed[] = '_saved_draft_publish_date_from'; - $not_allowed[] = '_saved_draft_publish_date_to'; - $not_allowed[] = '_post_to_only_existing_categories'; - $not_allowed[] = '_mainwp_edit_post_site_id'; - $not_allowed[] = '_mainwp_edit_post_id'; - $not_allowed[] = '_edit_post_status'; - - $post_to_only_existing_categories = false; - - if ( is_array( $post_custom ) ) { - foreach ( $post_custom as $meta_key => $meta_values ) { - if ( ! in_array( $meta_key, $not_allowed ) ) { - foreach ( $meta_values as $meta_value ) { - if ( 0 === strpos( $meta_key, '_mainwp_spinner_' ) ) { - continue; - } - - if ( ! $seo_ext_activated ) { - // if WordPress SEO plugin is not activated do not save yoast post meta. - if ( false === strpos( $meta_key, '_yoast_wpseo_' ) ) { - update_post_meta( $new_post_id, $meta_key, $meta_value ); - } - } else { - update_post_meta( $new_post_id, $meta_key, $meta_value ); - } - } - } elseif ( '_sticky' === $meta_key ) { - foreach ( $meta_values as $meta_value ) { - if ( 'sticky' === base64_decode( $meta_value ) ) { // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - stick_post( $new_post_id ); - } - } - } elseif ( '_post_to_only_existing_categories' === $meta_key ) { - if ( isset( $meta_values[0] ) && $meta_values[0] ) { - $post_to_only_existing_categories = true; - } - } - } - } - - // yoast seo extension. - if ( $seo_ext_activated ) { - $_seo_opengraph_image = isset( $post_custom[ WPSEO_Meta::$meta_prefix . 'opengraph-image' ] ) ? $post_custom[ WPSEO_Meta::$meta_prefix . 'opengraph-image' ] : array(); - $_seo_opengraph_image = current( $_seo_opengraph_image ); - $_server_domain = ''; - $_server = get_option( 'mainwp_child_server' ); - if ( preg_match( '/(https?:\/\/[^\/]+\/).+/', $_server, $matchs ) ) { - $_server_domain = isset( $matchs[1] ) ? $matchs[1] : ''; - } - - // upload image if it on the server. - if ( ! empty( $_seo_opengraph_image ) && false !== strpos( $_seo_opengraph_image, $_server_domain ) ) { - try { - $upload = self::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! - } - } catch ( \Exception $e ) { - // ok! - } - } - } - - // If categories exist, create them (second parameter of wp_create_categories adds the categories to the post). - include_once ABSPATH . 'wp-admin/includes/taxonomy.php'; // Contains wp_create_categories. - if ( isset( $post_category ) && '' !== $post_category ) { - $categories = explode( ',', $post_category ); - if ( count( $categories ) > 0 ) { - if ( ! $post_to_only_existing_categories ) { - $post_category = wp_create_categories( $categories, $new_post_id ); - } else { - $cat_ids = array(); - foreach ( $categories as $cat ) { - $id = category_exists( $cat ); - if ( $id ) { - $cat_ids[] = $id; - } - } - if ( count( $cat_ids ) > 0 ) { - wp_set_post_categories( $new_post_id, $cat_ids ); - } - } - } - } - - $featured_image_exist = false; - // If featured image exists - set it. - if ( null !== $post_featured_image ) { - try { - $upload = self::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; - if ( isset( $others['featured_image_data'] ) ) { - $_image_data = $others['featured_image_data']; - update_post_meta( $upload['id'], '_wp_attachment_image_alt', $_image_data['alt'] ); - wp_update_post( - array( - 'ID' => $upload['id'], - 'post_excerpt' => $_image_data['caption'], - 'post_content' => $_image_data['description'], - 'post_title' => $_image_data['title'], - ) - ); - } - } - } catch ( \Exception $e ) { - // ok! - } - } - - if ( ! $featured_image_exist ) { - delete_post_meta( $new_post_id, '_thumbnail_id' ); - } - - // post plus extension process. - if ( $is_post_plus ) { - $random_privelege = isset( $post_custom['_saved_draft_random_privelege'] ) ? $post_custom['_saved_draft_random_privelege'] : null; - $random_privelege = is_array( $random_privelege ) ? current( $random_privelege ) : null; - $random_privelege_base = base64_decode( $random_privelege ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. - $random_privelege = maybe_unserialize( $random_privelege_base ); - - if ( is_array( $random_privelege ) && count( $random_privelege ) > 0 ) { - $random_post_authors = array(); - foreach ( $random_privelege as $role ) { - $users = get_users( array( 'role' => $role ) ); - foreach ( $users as $user ) { - $random_post_authors[] = $user->ID; - } - } - if ( count( $random_post_authors ) > 0 ) { - shuffle( $random_post_authors ); - $key = array_rand( $random_post_authors ); - wp_update_post( - array( - 'ID' => $new_post_id, - 'post_author' => $random_post_authors[ $key ], - ) - ); - } - } - - $random_category = isset( $post_custom['_saved_draft_random_category'] ) ? $post_custom['_saved_draft_random_category'] : false; - $random_category = is_array( $random_category ) ? current( $random_category ) : null; - if ( ! empty( $random_category ) ) { - $cats = get_categories( - array( - 'type' => 'post', - 'hide_empty' => 0, - ) - ); - $random_cats = array(); - if ( is_array( $cats ) ) { - foreach ( $cats as $cat ) { - $random_cats[] = $cat->term_id; - } - } - if ( count( $random_cats ) > 0 ) { - shuffle( $random_cats ); - $key = array_rand( $random_cats ); - wp_set_post_categories( $new_post_id, array( $random_cats[ $key ] ), false ); - } - } - } // end of post plus. - - // to support custom post author. - $custom_post_author = apply_filters( 'mainwp_create_post_custom_author', false, $new_post_id ); - if ( ! empty( $custom_post_author ) ) { - wp_update_post( - array( - 'ID' => $new_post_id, - 'post_author' => $custom_post_author, - ) - ); - } - - // unlock if edit post. - if ( $edit_post_id ) { - update_post_meta( $edit_post_id, '_edit_lock', '' ); - } - - $ret['success'] = true; - $ret['link'] = $permalink; - $ret['added_id'] = $new_post_id; - - return $ret; - } - public static function get_mainwp_dir( $what = null, $dieOnError = true ) { $upload_dir = wp_upload_dir(); $dir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'mainwp' . DIRECTORY_SEPARATOR; @@ -1789,7 +1297,7 @@ class MainWP_Helper { } public static function log_debug( $msg ) { - if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG ) { + if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) { error_log( $msg ); // phpcs:ignore -- debug mode only. } } diff --git a/class/class-tar-archiver.php b/class/class-tar-archiver.php index cf0f62c..3f6c02b 100644 --- a/class/class-tar-archiver.php +++ b/class/class-tar-archiver.php @@ -241,7 +241,7 @@ class Tar_Archiver { } closedir( $fh ); - if ( defined( 'MAINWP_DEBUG' ) && MAINWP_DEBUG ) { + if ( defined( 'MAINWP_CHILD_DEBUG' ) && MAINWP_CHILD_DEBUG ) { $string = wp_json_encode( array( 'siteurl' => get_option( 'siteurl' ), diff --git a/mainwp-child.php b/mainwp-child.php index 693d53b..0a3e98b 100644 --- a/mainwp-child.php +++ b/mainwp-child.php @@ -10,7 +10,7 @@ */ require_once ABSPATH . 'wp-includes' . DIRECTORY_SEPARATOR . 'version.php'; // Version information from WordPress. -define( 'MAINWP_DEBUG', true ); +define( 'MAINWP_CHILD_DEBUG', true ); if ( ! defined( 'MAINWP_CHILD_FILE' ) ) { define( 'MAINWP_CHILD_FILE', __FILE__ );