path = OPALESTATE_PLUGIN_DIR; // $this->cfg = json_decode( file get contents( $this->path.'project.json' ) ); $this->cfg = json_decode( wp_remote_get( $this->path.'project.json' ) ); $this->server = $this->cfg->server; $this->oldurl = $this->cfg->oldurl; $this->theme = $this->cfg->theme; $this->name = $this->cfg->name; $this->subpath = $this->cfg->subpath; } /** * Write data in file */ private function output_file_content( $file_path, $output ) { $fp = fopen( $file_path, 'w+' ); fwrite( $fp, $output ); fclose( $fp ); } /** * Get more options */ public function get_more_options(){ $data = array( 'header' => 'header-1', 'footer' => 'footer-1', 'page' => 'home-1' ); if( isset($this->cfg->active) && $this->cfg->active ) { $data = (array) $this->cfg->active; } return array( 'active' => $data, 'oldurl' => $this->oldurl, 'server' => $this->server, "samples" => array( 'post' => array(), 'product' => array() ) ); } /** * Export theme options in customizer */ public function options(){ return array(); $thememods = get_option( 'theme_mods_' . $this->theme ); $file = $this->path.'/sample/thememods.json'; $ids = array(); foreach( $thememods as $key => $mod ){ if( is_string($mod) ){ // $thememods[$key] = $this->_replace_uri( $mod, $this->oldurl, "SITE_URL_HERE"); if( preg_match( "#jpg|png|gif|svg#", $mod) && $mod ){ $ids[$key] = $this->find_image_id_byguid( $mod ); } } if( isset($thememods['wpopal_customize_css']) ){ unset( $thememods['wpopal_customize_css'] ); } if( isset($thememods['osf_theme_custom_style']) ){ unset( $thememods['osf_theme_custom_style'] ); } if( isset($thememods['sidebars_widgets']) ){ unset( $thememods['sidebars_widgets'] ); } /// if( $key == 'custom_logo' && $mod ){ $ids[$key] = $mod; } } $attachments = array(); if( $ids ){ foreach( $ids as $id ) { $post = get_post( $id ); if( $post ) { $attachments[$post->ID] = array( 'id' => $post->ID, 'guid' => wp_get_attachment_url( $post->ID ), 'post_parent' => $post->post_parent, 'post_name' => $post->post_name, 'post_date' => $post->post_date ); } } } $options = array( 'woocommerce_single_image_width' => '', 'woocommerce_thumbnail_image_width' => '', 'woocommerce_thumbnail_cropping' => '', 'woocommerce_thumbnail_cropping_custom_height' => '', 'woocommerce_thumbnail_cropping_custom_width' => '', "woocommerce_shop_page_id" => '', "woocommerce_cart_page_id" => '', 'woocommerce_checkout_page_id' => '', 'woocommerce_myaccount_page_id' => '', 'woocommerce_terms_page_id' => '', 'yith_wcwl_wishlist_page_id' => '' ); foreach( $options as $key => $value ){ $value = get_option( $key ); if( empty($value) ) { unset( $options[$key] ); continue; } $options[$key] = $value; } $options['page_for_posts'] = 'Blog'; if( function_exists( 'wp_get_custom_css_post' ) ) { $options['wp_css'] = wp_get_custom_css(); } $data = array( 'thememods' => $thememods, 'attachments' => $attachments, "options" => $options ); // $this->output_file_content( $file, wp_json_encode($data ,JSON_PRETTY_PRINT ) ); return $data; } /** * Replace URI in xml */ public function _replace_uri( $str, $oldurl, $server ){ $str = str_replace( str_replace("/","\/", $oldurl ), str_replace("/","\/", $server ), $str ); $str = str_replace( $oldurl, $server, $str ); $str = str_replace( str_replace("/","\\\\\\/", $oldurl ), str_replace("/","\\\\\\/", $server ), $str ); return $str; } /** * Export config samples */ public function config_samples( $dev=0 ){ $data['samples'] = array(); $file = $this->path.$this->cfg->folder_source.'/samples.json'; $niches = $this->cfg->niches; $single = $this->cfg->single; $key = 0; $data['samples'][] = array( "name" => isset($single->name)?$single->name:"Sample", "key" => "niche-".$key, "url" => isset($single->url)?$single->url:"", "demo" => isset($single->demo)?$single->demo:"", "preview" => $this->cfg->server_source.'/screenshot.png', "sample" => $this->cfg->server_source.'/data.zip' ); $this->output_file_content( $file, wp_json_encode($data ) ); /// //$file = $this->path.'/wp-content/themes/'.$this->cfg->theme.'/project.json'; //$data = $this->cfg->themeinfo; //$this->output_file_content( $file, json_encode($data , JSON_PRETTY_PRINT ) ); } /** * Export all pages */ public function pages(){ return array(); $excludes = array(); global $wpdb; $post_type = 'page'; /// items $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s and {$wpdb->posts}.post_content LIKE '%opalestate_%'", $post_type ); // grab a snapshot of post IDs, just in case it changes during the export $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" ); $data = $this->export_json_ids( $post_ids, $excludes, $isattachement ); echo '
' . print_r( $data ,1 );die; //$file = $this->path.'sample/pages.json'; // $this->output_file_content( $file, wp_json_encode($data ) ); return $data; } /** * Export all pages */ public function data_posttypes(){ $excludes = array(); $data = $this->export_posttype( array( 'opalestate_agent', 'opalestate_agency', 'opalestate_agent_ft', 'opalestate_agency_ft', 'opalestate_rating_ft', 'opalestate_property' ), $excludes ); // $file = ABSPATH.'src/json/elementor.json'; // $this->output_file_content( $file, wp_json_encode($data ) ); return $data; } /** * get all attachments by post ids */ protected function get_attachment( $post_ids ) { $attachments = array(); foreach ( $post_ids as $post_id) { $value = get_post_meta($post_id, '_thumbnail_id', true); if ( $value ) { $attachments = array_merge( $attachments, array($value) ); } $attachArgs = array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'numberposts' => -1, 'post__not_in' => $attachments, //To skip duplicates ); $attachList = get_children($attachArgs, ARRAY_A); $attachments = array_merge($attachments, array_keys($attachList)); } $ids = $this->get_images_posts( $post_ids ); if( $ids ){ $attachments = array_merge( $ids, $attachments ); } return $attachments; } /** * Export data posts by post type with attachments */ protected function export_posttype( $post_type, $excludes=array(), $isattachement=true ) { global $wpdb; /// items if( is_array($post_type) ){ $tmp = "'".implode( "','", $post_type )."'"; $where = "{$wpdb->posts}.post_type IN( ".$tmp ." )"; } else { $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $post_type ); } // grab a snapshot of post IDs, just in case it changes during the export $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" ); return $this->export_json_ids( $post_ids, $excludes, $isattachement ); } public function aa(){ global $wpdb; $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", 240) ); $exls = array( '_edit_last', '_edit_lock', '_elementor_version', '_menu_item_type', '_menu_item_menu_item_parent', '_menu_item_object_id', '_menu_item_object', '_menu_item_target', '_menu_item_classes', '_menu_item_xfn', '_menu_item_url', '_elementor_css' ); $tmp = array(); foreach( $postmeta as $key => $meta ){ unset( $postmeta[$key]->post_id ); unset( $postmeta[$key]->meta_id ); foreach( $exls as $exl ){ if( $meta->meta_key == $exl ){ unset( $postmeta[$key] ); } } } foreach( $postmeta as $key => $meta ){ $tmp[$meta->meta_key] = $meta->meta_value; } } /** * export json data by ids */ protected function export_json_ids( $post_ids , $excludes, $isattachement ){ global $wpdb; $output = array(); $export = array(); if( $isattachement ){ $ids = $this->get_attachment( $post_ids ); if( $ids ){ $where = 'WHERE ID IN (' . join( ',', $ids ) . ')'; $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); $export['attachments'] = array(); foreach( $posts as $post ) { $export['attachments'][$post->ID] = array( 'id' => $post->ID, 'guid'=> wp_get_attachment_url( $post->ID ), 'post_parent' => $post->post_parent, 'post_name' => $post->post_name, 'post_date' => $post->post_date ); } } } while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { $where = 'ID IN (' . join( ',', $next_posts ) . ')'; $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE post_status='publish' and $where" ); // Begin Loop. foreach ( $posts as $post ) { if( in_array($post->ID , $excludes) ){ continue; } setup_postdata( $post ); $data = array(); if ( get_post_meta( $post->ID, '_elementor_edit_mode', true ) === 'builder' ) { $post->post_content = ""; } $post->guid = $this->_replace_uri( $post->guid, $this->oldurl, "SITE_URL_HERE" ); $excludes = array( 'guid', 'to_ping', 'pinged', 'post_content_filtered', 'post_mime_type', 'comment_count', 'filter', 'post_modified', 'post_modified_gmt' ); foreach( $excludes as $exl ){ if( isset($post->$exl) ){ unset( $post->$exl ); } } $data['post'] = $post; // meta data $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); $exls = array( '_edit_last', '_edit_lock', '_elementor_version', '_menu_item_type', '_menu_item_menu_item_parent', '_menu_item_object_id', '_menu_item_object', '_menu_item_target', '_menu_item_classes', '_menu_item_xfn', '_menu_item_url', '_elementor_css' ); $tmp = array(); foreach( $postmeta as $key => $meta ){ unset( $postmeta[$key]->post_id ); unset( $postmeta[$key]->meta_id ); foreach( $exls as $exl ){ if( $meta->meta_key == $exl ){ unset( $postmeta[$key] ); } } } foreach( $postmeta as $key => $meta ){ $tmp[$meta->meta_key] = $meta->meta_value; } $data['postmeta'] = $tmp; if ( $post->post_type == 'attachment' ){ $data['attachment_url'] = wp_get_attachment_url( $post->ID ); } $data['thumbnail_id'] = get_post_meta( $post->ID, '_thumbnail_id', true ); // taxonomy $taxonomies = get_object_taxonomies( $post->post_type ); if ( !empty( $taxonomies ) ) { $data['taxonomy'] = array(); $terms = wp_get_object_terms( $post->ID, $taxonomies ); foreach ( (array) $terms as $term ) { if( $term->taxonomy == 'nav_menu' ){ continue; } $t = array( $term->taxonomy => array ( $term->slug => $term->name ) ); $data['taxonomy'][] = $t; } } $output [] = $data; } } $export['posts'] = $output; return $export; } /** * find attachment post id by guid */ private function find_image_id_byguid( $image_url ) { global $wpdb; $attachment = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE guid LIKE '%".$image_url."%';" ); return isset($attachment[0])?$attachment[0]:0; } /** * find all images:svg,git,png,jpg in data setting of elementor */ private function get_images_posts( $ids ){ $mids = array(); $images = array(); foreach( $ids as $id ){ if ( get_post_meta( $id, '_elementor_edit_mode', true ) === 'builder' ) { $data = json_decode( get_post_meta( $id, '_elementor_data', true ), ARRAY_A ); if( $data ){ $string = "start".print_r( $data , true )."end"; $pattern = '~(http.*\.)(jpe?g|png|svg|gif|[tg]iff?|svg)~i'; $m = preg_match_all($pattern,$string,$matches); if( $matches[0] ){ foreach( $matches[0] as $img ){ $pattern = '#(/\d+/\d+/(.*))$#'; $a = preg_match( $pattern , $img, $m ); if( isset($m[1]) ){ ///echo '' . print_r( $data, 1 );die; $_id = $this->find_image_id_byguid( $m[1] ); if( $_id ) { $mids[$_id] = $_id; } else { $images[] = $img; } } } } } } } echo 'Missing Images:' . print_r( $images , 1 ); //die; return $mids; } public function sample(){ $data = array(); return $data; } public function download_images( $attachments, $jcontent ){ $folder = $this->path .'/'.$this->cfg->folder_source.'/images'; if( is_dir($folder) ){ $file = new Filesystem(); $file->deleteDirectory( $folder ); } if( !is_dir($folder) ){ mkdir( $folder ); } $url = $this->cfg->server_source.'/images/'; $replaces = array(); foreach( $attachments as $attachment ){ $guid = str_replace( $this->server , $this->oldurl, $attachment['guid'] ) ; // $image = file get contents( $guid ); $image = wp_remote_get( $guid ); $name = basename( $attachment['guid'] ); $path = $folder.'/'.$name; file_put_contents( $path, $image ); $guid = $attachment['guid']; $newurl = $url.$name; $replaces[$guid] = $newurl; } foreach( $replaces as $key => $replace ){ $jcontent = $this->_replace_uri( $jcontent, $key, $replace); } return $jcontent; } /** * export all sample data */ public function source(){ // $content = file get contents( $this->path.'/sample/data.json' ); $content = wp_remote_get( $this->path.'/sample/data.json' ); $data = json_decode( $content, true ); $file = new Filesystem(); $content = $this->download_images( $data['attachments'], $content ); $file = $this->path.'/'.$this->cfg->folder_source.'/data.json'; $this->output_file_content( $file, $content ); $zip = new ZipArchive; if ($zip->open( $this->path.'/'.$this->cfg->folder_source .'/data.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) { $zip->addFile( $file, 'data.json'); $zip->close(); echo 'ok'; } else { echo 'failed'; } } /** * export all sample data */ public function data(){ $this->fix_images_parents(); $data = $this->pages(); $data = array_merge_recursive( $data, $this->data_posttypes(), $this->options(), $this->get_more_options(), $this->sample() ); $data = apply_filters( 'opaltools_single_wp_cli_exporter', $data , $this->cfg ); $file = $this->path.'sample/data.json'; /// $attachments = array(); foreach ( $data['attachments'] as $key => $value ) { $attachments[$value['id']] = $value; } $data['attachments'] = $attachments; $content = $this->_replace_uri( json_encode($data , JSON_PRETTY_PRINT ), $this->oldurl, $this->server ); $content = str_replace( $this->cfg->theme, $this->cfg->domain, $content ); $this->output_file_content( $file, $content ); $this->config_samples(); $this->source(); } public function fix_images_parents(){ global $wpdb; $fixs = array( 'product-', 'bg-slider', 'slide-', 'bg-slide' ); foreach( $fixs as $fix ) { $wpdb->query( "UPDATE wp_posts SET post_parent=0 WHERE post_title LIKE '".$fix."%'" ); } } } WP_CLI::add_command( 'opalestate', new OpalEstate_Command ); ?>