init_globals(); $this->init_actions(); } /** * Get the default style. Can be overriden by theme init scripts. * * @see Envato_Theme_Setup_Wizard::instance() * * @since 1.1.9 * @access public */ public function get_header_logo_width() { return '150px'; } /** * Get the default style. Can be overriden by theme init scripts. * * @see Envato_Theme_Setup_Wizard::instance() * * @since 1.1.9 * @access public */ public function get_logo_image() { $image_url = get_theme_mod( 'logo_header_image', UPSTUDY_URI . 'assets/images/logo.png' ); return apply_filters( 'envato_setup_logo_image', $image_url ); } /** * Setup the class globals. * * @since 1.1.1 * @access public */ public function init_globals() { $current_theme = wp_get_theme(); $this->theme_name = strtolower( preg_replace( '#[^a-zA-Z]#', '', $current_theme->get( 'Name' ) ) ); $this->envato_username = apply_filters( $this->theme_name . '_theme_setup_wizard_username', 'devthrow' ); $this->oauth_script = apply_filters( $this->theme_name . '_theme_setup_wizard_oauth_script', '//www.thepixelcurve.com/envato/api/server-script.php' ); $this->page_slug = apply_filters( $this->theme_name . '_theme_setup_wizard_page_slug', $this->theme_name . '-setup' ); $this->parent_slug = apply_filters( $this->theme_name . '_theme_setup_wizard_parent_slug', '' ); //If we have parent slug - set correct url if ( $this->parent_slug !== '' ) { $this->page_url = 'admin.php?page=' . $this->page_slug; } else { $this->page_url = 'admin.php?page=' . $this->page_slug; } $this->page_url = apply_filters( $this->theme_name . '_theme_setup_wizard_page_url', $this->page_url ); //set relative plugin path url $this->plugin_path = trailingslashit( $this->cleanFilePath( dirname( __FILE__ ) ) ); $relative_url = str_replace( $this->cleanFilePath( get_template_directory() ), '', $this->plugin_path ); $this->plugin_url = trailingslashit( UPSTUDY_URI . $relative_url ); } /** * Setup the hooks, actions and filters. * * @uses add_action() To add actions. * @uses add_filter() To add filters. * * @since 1.1.1 * @access public */ public function init_actions() { if ( apply_filters( $this->theme_name . '_enable_setup_wizard', true ) && current_user_can( 'manage_options' ) ) { add_action( 'after_switch_theme', array( $this, 'switch_theme' ) ); if ( class_exists( 'TGM_Plugin_Activation' ) && isset( $GLOBALS['tgmpa'] ) ) { add_action( 'init', array( $this, 'get_tgmpa_instanse' ), 30 ); add_action( 'init', array( $this, 'set_tgmpa_url' ), 40 ); } add_action( 'admin_menu', array( $this, 'admin_menus' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'admin_init', array( $this, 'admin_redirects' ), 30 ); add_action( 'admin_init', array( $this, 'init_wizard_steps' ), 30 ); add_action( 'admin_init', array( $this, 'setup_wizard' ), 30 ); add_filter( 'tgmpa_load', array( $this, 'tgmpa_load' ), 10, 1 ); add_action( 'wp_ajax_envato_setup_plugins', array( $this, 'ajax_plugins' ) ); add_action( 'wp_ajax_envato_setup_content', array( $this, 'ajax_content' ) ); } if ( function_exists( 'envato_market' ) ) { add_action( 'admin_init', array( $this, 'envato_market_admin_init' ), 20 ); add_filter( 'http_request_args', array( $this, 'envato_market_http_request_args' ), 10, 2 ); add_action( 'wp_ajax_dtbwp_update_notice_handler', array($this,'ajax_notice_handler') ); add_action( 'admin_notices', array($this,'admin_theme_auth_notice') ); } add_action( 'upgrader_post_install', array( $this, 'upgrader_post_install' ), 10, 2 ); } /** * After a theme update we clear the setup_complete option. This prompts the user to visit the update page again. * * @since 1.1.8 * @access public */ public function upgrader_post_install( $return, $theme ) { if ( is_wp_error( $return ) ) { return $return; } if ( $theme != get_stylesheet() ) { return $return; } update_option( 'envato_setup_complete', false ); return $return; } /** * We determine if the user already has theme content installed. This can happen if swapping from a previous theme or updated the current theme. We change the UI a bit when updating / swapping to a new theme. * * @since 1.1.8 * @access public */ public function is_possible_upgrade() { return false; } public function enqueue_scripts() { } public function tgmpa_load( $status ) { return is_admin() || current_user_can( 'install_themes' ); } public function switch_theme() { set_transient( '_' . $this->theme_name . '_activation_redirect', 1 ); } public function admin_redirects() { if ( ! get_transient( '_' . $this->theme_name . '_activation_redirect' ) || get_option( 'envato_setup_complete', false ) ) { return; } delete_transient( '_' . $this->theme_name . '_activation_redirect' ); wp_safe_redirect( admin_url( $this->page_url ) ); exit; } /** * Get configured TGMPA instance * * @access public * @since 1.1.2 */ public function get_tgmpa_instanse() { $this->tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); } /** * Update $tgmpa_menu_slug and $tgmpa_parent_slug from TGMPA instance * * @access public * @since 1.1.2 */ public function set_tgmpa_url() { $this->tgmpa_menu_slug = ( property_exists( $this->tgmpa_instance, 'menu' ) ) ? $this->tgmpa_instance->menu : $this->tgmpa_menu_slug; $this->tgmpa_menu_slug = apply_filters( $this->theme_name . '_theme_setup_wizard_tgmpa_menu_slug', $this->tgmpa_menu_slug ); $tgmpa_parent_slug = ( property_exists( $this->tgmpa_instance, 'parent_slug' ) && $this->tgmpa_instance->parent_slug !== 'themes.php' ) ? 'admin.php' : 'themes.php'; $this->tgmpa_url = apply_filters( $this->theme_name . '_theme_setup_wizard_tgmpa_url', $tgmpa_parent_slug . '?page=' . $this->tgmpa_menu_slug ); } /** * Add admin menus/screens. */ public function admin_menus() { add_submenu_page('upstudy-admin-menu', esc_html__( 'Setup Wizard','upstudy' ), esc_html__( 'Setup Wizard','upstudy' ), 'manage_options', $this->page_slug, array( $this, $this->page_slug) ); } /** * Setup steps. * * @since 1.1.1 * @access public * @return array */ public function init_wizard_steps() { $this->steps = array( 'introduction' => array( 'name' => esc_html__( 'Introduction','upstudy' ), 'view' => array( $this, 'envato_setup_introduction' ), 'handler' => array( $this, 'envato_setup_introduction_save' ), ), ); if ( class_exists( 'TGM_Plugin_Activation' ) && isset( $GLOBALS['tgmpa'] ) ) { $this->steps['default_plugins'] = array( 'name' => esc_html__( 'Plugins','upstudy' ), 'view' => array( $this, 'envato_setup_default_plugins' ), 'handler' => '', ); } $this->steps['updates'] = array( 'name' => esc_html__( 'Updates','upstudy' ), 'view' => array( $this, 'envato_setup_updates' ), 'handler' => array( $this, 'envato_setup_updates_save' ), ); // $this->steps['customize'] = array( // 'name' => esc_html__( 'Customize','upstudy' ), // 'view' => array( $this, 'envato_setup_customize' ), // 'handler' => '', // ); $this->steps['help_support'] = array( 'name' => esc_html__( 'Support','upstudy' ), 'view' => array( $this, 'envato_setup_help_support' ), 'handler' => '', ); $this->steps['next_steps'] = array( 'name' => esc_html__( 'Ready!','upstudy' ), 'view' => array( $this, 'envato_setup_ready' ), 'handler' => '', ); $this->steps = apply_filters( $this->theme_name . '_theme_setup_wizard_steps', $this->steps ); } /** * Show the setup wizard */ public function setup_wizard() { if ( empty( $_GET['page'] ) || $this->page_slug !== $_GET['page'] ) { return; } if (ob_get_length() > 0 ) { ob_end_clean(); } $this->step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : current( array_keys( $this->steps ) ); wp_register_script( 'jquery-blockui', $this->plugin_url . 'js/jquery.blockUI.js', array( 'jquery' ), '2.70', true ); wp_register_script( 'envato-setup', $this->plugin_url . 'js/envato-setup.js', array( 'jquery', 'jquery-blockui', ), $this->version ); wp_localize_script( 'envato-setup', 'envato_setup_params', array( 'tgm_plugin_nonce' => array( 'update' => wp_create_nonce( 'tgmpa-update' ), 'install' => wp_create_nonce( 'tgmpa-install' ), ), 'tgm_bulk_url' => admin_url( $this->tgmpa_url ), 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'wpnonce' => wp_create_nonce( 'envato_setup_nonce' ), 'verify_text' => esc_html__( '...verifying','upstudy' ), ) ); //wp_enqueue_style( 'envato_wizard_admin_styles', $this->plugin_url . '/css/admin.css', array(), $this->version ); wp_enqueue_style( 'envato-setup', $this->plugin_url . 'css/envato-setup.css', array( 'wp-admin', 'dashicons', 'install', ), $this->version ); //enqueue style for admin notices wp_enqueue_style( 'wp-admin' ); wp_enqueue_media(); wp_enqueue_script( 'media' ); ob_start(); $this->setup_wizard_header(); $this->setup_wizard_steps(); $show_content = true; echo '
';
// debug inserting a particular post so we can see what's going on
$post_type = 'nav_menu_item';
$post_id = 239; // debug this particular import post id.
$all_data = $this->_get_json( 'default.json' );
if ( ! $post_type || ! isset( $all_data[ $post_type ] ) ) {
echo "Post type $post_type not found.";
} else {
echo "Looking for post id $post_id \n";
foreach ( $all_data[ $post_type ] as $post_data ) {
if ( $post_data['post_id'] == $post_id ) {
//print_r( $post_data );
$this->_process_post_data( $post_type, $post_data, 0, true );
}
}
}
$this->_handle_delayed_posts();
print_r( $this->logs );
echo '';
} else if ( isset( $_REQUEST['export'] ) ) {
} else if ( $this->is_possible_upgrade() ) {
?>
';
printf(
__( 'Simply follow these steps to install of Upstudy theme by Devthrow. If you need any help, please do not hesitate to contact our support desk.', 'upstudy' ),
esc_url( 'https://devthrow.com/support/' )
);
echo '';
$anchor_url = 'https://www.youtube.com/watch?v=LPyrRBf6NlQ';
$image_url = get_template_directory_uri() . '/assets/images/watch-video.png'; // Update with the correct path to your image
$text = 'Click Here'; // Update with the correct text for the anchor link
echo ''; // echo '' . esc_html($text) . ''; // echo ' to watch the video tutorial on installing the Upstudy theme.
'; echo 'Customize in the WordPress backend.','upstudy' ); ?>
array(), // Meaning: all plugins which still have open actions. 'install' => array(), 'update' => array(), 'activate' => array(), ); foreach ( $instance->plugins as $slug => $plugin ) { if ( !$instance->can_plugin_activate( $slug ) && false === $instance->does_plugin_have_update( $slug ) ) { // No need to display plugins if they are installed, up-to-date and active. continue; } else { $plugins['all'][ $slug ] = $plugin; if ( ! $instance->is_plugin_installed( $slug ) ) { $plugins['install'][ $slug ] = $plugin; } else { if ( false !== $instance->does_plugin_have_update( $slug ) ) { $plugins['update'][ $slug ] = $plugin; } if ( $instance->can_plugin_activate( $slug ) ) { $plugins['activate'][ $slug ] = $plugin; } } } } return $plugins; } /** * Page setup */ public function envato_setup_default_plugins() { tgmpa_load_bulk_installer(); // install plugins with TGM. if ( ! class_exists( 'TGM_Plugin_Activation' ) || ! isset( $GLOBALS['tgmpa'] ) ) { die( 'Failed to find TGM' ); } $url = wp_nonce_url( add_query_arg( array( 'plugins' => 'go' ) ), 'envato-setup' ); $plugins = $this->_get_plugins(); // copied from TGM $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. $fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem. if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) { return true; // Stop the normal page form from displaying, credential request form will be shown. } // Now we have some credentials, setup WP_Filesystem. if ( ! WP_Filesystem( $creds ) ) { // Our credentials were no good, ask the user for them again. request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields ); return true; } /* If we arrive here, we have the filesystem */ ?> 1, 'message' => __( 'No Slug Found','upstudy' ) ) ); } $json = array(); // send back some json we use to hit up TGM $plugins = $this->_get_plugins(); // what are we doing with this plugin? foreach ( $plugins['activate'] as $slug => $plugin ) { if ( $_POST['slug'] == $slug ) { $json = array( 'url' => admin_url( $this->tgmpa_url ), 'plugin' => array( $slug ), 'tgmpa-page' => $this->tgmpa_menu_slug, 'plugin_status' => 'all', '_wpnonce' => wp_create_nonce( 'bulk-plugins' ), 'action' => 'tgmpa-bulk-activate', 'action2' => - 1, 'message' => esc_html__( 'Activating Plugin','upstudy' ), ); break; } } foreach ( $plugins['update'] as $slug => $plugin ) { if ( $_POST['slug'] == $slug ) { $json = array( 'url' => admin_url( $this->tgmpa_url ), 'plugin' => array( $slug ), 'tgmpa-page' => $this->tgmpa_menu_slug, 'plugin_status' => 'all', '_wpnonce' => wp_create_nonce( 'bulk-plugins' ), 'action' => 'tgmpa-bulk-update', 'action2' => - 1, 'message' => esc_html__( 'Updating Plugin','upstudy' ), ); break; } } foreach ( $plugins['install'] as $slug => $plugin ) { if ( $_POST['slug'] == $slug ) { $json = array( 'url' => admin_url( $this->tgmpa_url ), 'plugin' => array( $slug ), 'tgmpa-page' => $this->tgmpa_menu_slug, 'plugin_status' => 'all', '_wpnonce' => wp_create_nonce( 'bulk-plugins' ), 'action' => 'tgmpa-bulk-install', 'action2' => - 1, 'message' => esc_html__( 'Installing Plugin','upstudy' ), ); break; } } if ( $json ) { $json['hash'] = md5( serialize( $json ) ); // used for checking if duplicates happen, move to next plugin wp_send_json( $json ); } else { wp_send_json( array( 'done' => 1, 'message' => esc_html__( 'Success','upstudy' ) ) ); } exit; } private function _content_default_get() { $content = array(); // find out what content is in our default json file. $available_content = $this->_get_json( 'default.json' ); foreach ( $available_content as $post_type => $post_data ) { if ( count( $post_data ) ) { $first = current( $post_data ); $post_type_title = ! empty( $first['type_title'] ) ? $first['type_title'] : ucwords( $post_type ) . 's'; if ( $post_type_title == 'Navigation Menu Items' ) { $post_type_title = 'Navigation'; } $content[ $post_type ] = array( 'title' => $post_type_title, 'description' => sprintf( __( 'This will create default %s as seen in the demo.','upstudy' ), $post_type_title ), 'pending' => esc_html__( 'Pending.','upstudy' ), 'installing' => esc_html__( 'Installing.','upstudy' ), 'success' => esc_html__( 'Success.' ,'upstudy'), 'install_callback' => array( $this, '_content_install_type' ), 'checked' => $this->is_possible_upgrade() ? 0 : 1, // dont check if already have content installed. ); } } $content['widgets'] = array( 'title' => esc_html__( 'Widgets','upstudy' ), 'description' => esc_html__( 'Insert default sidebar widgets as seen in the demo.' ,'upstudy'), 'pending' => esc_html__( 'Pending.' ,'upstudy'), 'installing' => esc_html__( 'Installing Default Widgets.','upstudy' ), 'success' => esc_html__( 'Success.','upstudy' ), 'install_callback' => array( $this, '_content_install_widgets' ), 'checked' => $this->is_possible_upgrade() ? 0 : 1, // dont check if already have content installed. ); $content['settings'] = array( 'title' => esc_html__( 'Settings' ,'upstudy'), 'description' => esc_html__( 'Configure default settings.' ,'upstudy'), 'pending' => esc_html__( 'Pending.','upstudy' ), 'installing' => esc_html__( 'Installing Default Settings.' ,'upstudy'), 'success' => esc_html__( 'Success.','upstudy' ), 'install_callback' => array( $this, '_content_install_settings' ), 'checked' => $this->is_possible_upgrade() ? 0 : 1, // dont check if already have content installed. ); $content = apply_filters( $this->theme_name . '_theme_setup_wizard_content', $content ); return $content; } /** * Page setup */ public function envato_setup_default_content() { ?> _content_default_get(); if ( ! check_ajax_referer( 'envato_setup_nonce', 'wpnonce' ) || empty( $_POST['content'] ) && isset( $content[ $_POST['content'] ] ) ) { wp_send_json_error( array( 'error' => 1, 'message' => esc_html__( 'No content Found' ,'upstudy') ) ); } $json = false; $this_content = $content[ $_POST['content'] ]; if ( isset( $_POST['proceed'] ) ) { // install the content! $this->log( ' -!! STARTING SECTION for ' . $_POST['content'] ); // init delayed posts from transient. $this->delay_posts = get_transient( 'delayed_posts' ); if ( ! is_array( $this->delay_posts ) ) { $this->delay_posts = array(); } if ( ! empty( $this_content['install_callback'] ) ) { if ( $result = call_user_func( $this_content['install_callback'] ) ) { $this->log( ' -- FINISH. Writing ' . count( $this->delay_posts, COUNT_RECURSIVE ) . ' delayed posts to transient ' ); set_transient( 'delayed_posts', $this->delay_posts, 60 * 60 * 24 ); if ( is_array( $result ) && isset( $result['retry'] ) ) { // we split the stuff up again. $json = array( 'url' => admin_url( 'admin-ajax.php' ), 'action' => 'envato_setup_content', 'proceed' => 'true', 'retry' => time(), 'retry_count' => $result['retry_count'], 'content' => $_POST['content'], '_wpnonce' => wp_create_nonce( 'envato_setup_nonce' ), 'message' => $this_content['installing'], 'logs' => $this->logs, 'errors' => $this->errors, ); } else { $json = array( 'done' => 1, 'message' => $this_content['success'], 'debug' => $result, 'logs' => $this->logs, 'errors' => $this->errors, ); } } } } else { $json = array( 'url' => admin_url( 'admin-ajax.php' ), 'action' => 'envato_setup_content', 'proceed' => 'true', 'content' => $_POST['content'], '_wpnonce' => wp_create_nonce( 'envato_setup_nonce' ), 'message' => $this_content['installing'], 'logs' => $this->logs, 'errors' => $this->errors, ); } if ( $json ) { $json['hash'] = md5( serialize( $json ) ); // used for checking if duplicates happen, move to next plugin wp_send_json( $json ); } else { wp_send_json( array( 'error' => 1, 'message' => esc_html__( 'Error','upstudy' ), 'logs' => $this->logs, 'errors' => $this->errors, ) ); } exit; } private function _imported_term_id( $original_term_id, $new_term_id = false ) { $terms = get_transient( 'importtermids' ); if ( ! is_array( $terms ) ) { $terms = array(); } if ( $new_term_id ) { if ( ! isset( $terms[ $original_term_id ] ) ) { $this->log( 'Insert old TERM ID ' . $original_term_id . ' as new TERM ID: ' . $new_term_id ); } else if ( $terms[ $original_term_id ] != $new_term_id ) { $this->error( 'Replacement OLD TERM ID ' . $original_term_id . ' overwritten by new TERM ID: ' . $new_term_id ); } $terms[ $original_term_id ] = $new_term_id; set_transient( 'importtermids', $terms, 60 * 60 * 24 ); } else if ( $original_term_id && isset( $terms[ $original_term_id ] ) ) { return $terms[ $original_term_id ]; } return false; } public function vc_post( $post_id = false ) { $vc_post_ids = get_transient( 'import_vc_posts' ); if ( ! is_array( $vc_post_ids ) ) { $vc_post_ids = array(); } if ( $post_id ) { $vc_post_ids[ $post_id ] = $post_id; set_transient( 'import_vc_posts', $vc_post_ids, 60 * 60 * 24 ); } else { $this->log( 'Processing vc pages 2: ' ); return; if ( class_exists( 'Vc_Manager' ) && class_exists( 'Vc_Post_Admin' ) ) { $this->log( $vc_post_ids ); $vc_manager = Vc_Manager::getInstance(); $vc_base = $vc_manager->vc(); $post_admin = new Vc_Post_Admin(); foreach ( $vc_post_ids as $vc_post_id ) { $this->log( 'Save ' . $vc_post_id ); $vc_base->buildShortcodesCustomCss( $vc_post_id ); $post_admin->save( $vc_post_id ); $post_admin->setSettings( $vc_post_id ); //twice? bug? $vc_base->buildShortcodesCustomCss( $vc_post_id ); $post_admin->save( $vc_post_id ); $post_admin->setSettings( $vc_post_id ); } } } } public function elementor_post( $post_id = false ) { // regenrate the CSS for this Elementor post if( class_exists( 'Elementor\Post_CSS_File' ) ) { $post_css = new Elementor\Post_CSS_File($post_id); $post_css->update(); } } private function _imported_post_id( $original_id = false, $new_id = false ) { if ( is_array( $original_id ) || is_object( $original_id ) ) { return false; } $post_ids = get_transient( 'importpostids' ); if ( ! is_array( $post_ids ) ) { $post_ids = array(); } if ( $new_id ) { if ( ! isset( $post_ids[ $original_id ] ) ) { $this->log( 'Insert old ID ' . $original_id . ' as new ID: ' . $new_id ); } else if ( $post_ids[ $original_id ] != $new_id ) { $this->error( 'Replacement OLD ID ' . $original_id . ' overwritten by new ID: ' . $new_id ); } $post_ids[ $original_id ] = $new_id; set_transient( 'importpostids', $post_ids, 60 * 60 * 24 ); } else if ( $original_id && isset( $post_ids[ $original_id ] ) ) { return $post_ids[ $original_id ]; } else if ( $original_id === false ) { return $post_ids; } return false; } private function _post_orphans( $original_id = false, $missing_parent_id = false ) { $post_ids = get_transient( 'postorphans' ); if ( ! is_array( $post_ids ) ) { $post_ids = array(); } if ( $missing_parent_id ) { $post_ids[ $original_id ] = $missing_parent_id; set_transient( 'postorphans', $post_ids, 60 * 60 * 24 ); } else if ( $original_id && isset( $post_ids[ $original_id ] ) ) { return $post_ids[ $original_id ]; } else if ( $original_id === false ) { return $post_ids; } return false; } private function _cleanup_imported_ids() { // loop over all attachments and assign the correct post ids to those attachments. } private $delay_posts = array(); private function _delay_post_process( $post_type, $post_data ) { if ( ! isset( $this->delay_posts[ $post_type ] ) ) { $this->delay_posts[ $post_type ] = array(); } $this->delay_posts[ $post_type ][ $post_data['post_id'] ] = $post_data; } // return the difference in length between two strings public function cmpr_strlen( $a, $b ) { return strlen( $b ) - strlen( $a ); } private function _process_post_data( $post_type, $post_data, $delayed = 0, $debug = false ) { $this->log( " Processing $post_type " . $post_data['post_id'] ); $original_post_data = $post_data; if ( $debug ) { echo "HERE\n"; } if ( ! post_type_exists( $post_type ) ) { return false; } if ( ! $debug && $this->_imported_post_id( $post_data['post_id'] ) ) { return true; // already done :) } if ( empty( $post_data['post_title'] ) && empty( $post_data['post_name'] ) ) { // this is menu items $post_data['post_name'] = $post_data['post_id']; } $post_data['post_type'] = $post_type; $post_parent = (int) $post_data['post_parent']; if ( $post_parent ) { // if we already know the parent, map it to the new local ID if ( $this->_imported_post_id( $post_parent ) ) { $post_data['post_parent'] = $this->_imported_post_id( $post_parent ); // otherwise record the parent for later } else { $this->_post_orphans( intval( $post_data['post_id'] ), $post_parent ); $post_data['post_parent'] = 0; } } // check if already exists if ( ! $debug ) { if ( empty( $post_data['post_title'] ) && ! empty( $post_data['post_name'] ) ) { global $wpdb; $sql = " SELECT ID, post_name, post_parent, post_type FROM $wpdb->posts WHERE post_name = %s AND post_type = %s "; $pages = $wpdb->get_results( $wpdb->prepare( $sql, array( $post_data['post_name'], $post_type, ) ), OBJECT_K ); $foundid = 0; foreach ( (array) $pages as $page ) { if ( $page->post_name == $post_data['post_name'] && empty( $page->post_title ) ) { $foundid = $page->ID; } } if ( $foundid ) { $this->_imported_post_id( $post_data['post_id'], $foundid ); return true; } } // dont use post_exists because it will dupe up on media with same name but different slug if ( ! empty( $post_data['post_title'] ) && ! empty( $post_data['post_name'] ) ) { global $wpdb; $sql = " SELECT ID, post_name, post_parent, post_type FROM $wpdb->posts WHERE post_name = %s AND post_title = %s AND post_type = %s "; $pages = $wpdb->get_results( $wpdb->prepare( $sql, array( $post_data['post_name'], $post_data['post_title'], $post_type, ) ), OBJECT_K ); $foundid = 0; foreach ( (array) $pages as $page ) { if ( $page->post_name == $post_data['post_name'] ) { $foundid = $page->ID; } } if ( $foundid ) { $this->_imported_post_id( $post_data['post_id'], $foundid ); return true; } } } // backwards compat with old import format. if ( isset( $post_data['meta'] ) ) { foreach ( $post_data['meta'] as $key => $meta ) { if(is_array($meta) && count($meta) == 1){ $single_meta = current($meta); if(!is_array($single_meta)){ $post_data['meta'][$key] = $single_meta; } } } } switch ( $post_type ) { case 'attachment': // import media via url if ( ! empty( $post_data['guid'] ) ) { // check if this has already been imported. $old_guid = $post_data['guid']; if ( $this->_imported_post_id( $old_guid ) ) { return true; // alrady done; } // ignore post parent, we haven't imported those yet. // $file_data = wp_remote_get($post_data['guid']); $remote_url = $post_data['guid']; $post_data['upload_date'] = date( 'Y/m', strtotime( $post_data['post_date_gmt'] ) ); if ( isset( $post_data['meta'] ) ) { foreach ( $post_data['meta'] as $key => $meta ) { if ( $key == '_wp_attached_file' ) { foreach ( (array) $meta as $meta_val ) { if ( preg_match( '%^[0-9]{4}/[0-9]{2}%', $meta_val, $matches ) ) { $post_data['upload_date'] = $matches[0]; } } } } } $upload = $this->_fetch_remote_file( $remote_url, $post_data ); if ( ! is_array( $upload ) || is_wp_error( $upload ) ) { // todo: error return false; } if ( $info = wp_check_filetype( $upload['file'] ) ) { $post['post_mime_type'] = $info['type']; } else { return false; } $post_data['guid'] = $upload['url']; // as per wp-admin/includes/upload.php $post_id = wp_insert_attachment( $post_data, $upload['file'] ); if($post_id) { if ( ! empty( $post_data['meta'] ) ) { foreach ( $post_data['meta'] as $meta_key => $meta_val ) { if($meta_key != '_wp_attached_file' && !empty($meta_val)) { update_post_meta( $post_id, $meta_key, $meta_val ); } } } wp_update_attachment_metadata( $post_id, wp_generate_attachment_metadata( $post_id, $upload['file'] ) ); // remap resized image URLs, works by stripping the extension and remapping the URL stub. if ( preg_match( '!^image/!', $info['type'] ) ) { $parts = pathinfo( $remote_url ); $name = basename( $parts['basename'], ".{$parts['extension']}" ); // PATHINFO_FILENAME in PHP 5.2 $parts_new = pathinfo( $upload['url'] ); $name_new = basename( $parts_new['basename'], ".{$parts_new['extension']}" ); $this->_imported_post_id( $parts['dirname'] . '/' . $name, $parts_new['dirname'] . '/' . $name_new ); } $this->_imported_post_id( $post_data['post_id'], $post_id ); } } break; default: // work out if we have to delay this post insertion $replace_meta_vals = array( ); if ( ! empty( $post_data['meta'] ) && is_array( $post_data['meta'] ) ) { // replace any elementor post data: // fix for double json encoded stuff: foreach ( $post_data['meta'] as $meta_key => $meta_val ) { if ( is_string( $meta_val ) && strlen( $meta_val ) && $meta_val[0] == '[' ) { $test_json = @json_decode( $meta_val, true ); if ( is_array( $test_json ) ) { $post_data['meta'][ $meta_key ] = $test_json; } } } array_walk_recursive( $post_data['meta'], array( $this, '_elementor_id_import' ) ); // replace menu data: // work out what we're replacing. a tax, page, term etc.. if(!empty($post_data['meta']['_menu_item_menu_item_parent'])) { $new_parent_id = $this->_imported_post_id( $post_data['meta']['_menu_item_menu_item_parent'] ); if(!$new_parent_id) { if ( $delayed ) { // already delayed, unable to find this meta value, skip inserting it $this->error( 'Unable to find replacement. Continue anyway.... content will most likely break..' ); } else { $this->error( 'Unable to find replacement. Delaying.... ' ); $this->_delay_post_process( $post_type, $original_post_data ); return false; } } $post_data['meta']['_menu_item_menu_item_parent'] = $new_parent_id; } switch($post_data['meta'][ '_menu_item_type' ]){ case 'post_type': if(!empty($post_data['meta']['_menu_item_object_id'])) { $new_parent_id = $this->_imported_post_id( $post_data['meta']['_menu_item_object_id'] ); if(!$new_parent_id) { if ( $delayed ) { // already delayed, unable to find this meta value, skip inserting it $this->error( 'Unable to find replacement. Continue anyway.... content will most likely break..' ); } else { $this->error( 'Unable to find replacement. Delaying.... ' ); $this->_delay_post_process( $post_type, $original_post_data ); return false; } } $post_data['meta']['_menu_item_object_id'] = $new_parent_id; } break; case 'taxonomy': if(!empty($post_data['meta']['_menu_item_object_id'])) { $new_parent_id = $this->_imported_term_id( $post_data['meta']['_menu_item_object_id'] ); if(!$new_parent_id) { if ( $delayed ) { // already delayed, unable to find this meta value, skip inserting it $this->error( 'Unable to find replacement. Continue anyway.... content will most likely break..' ); } else { $this->error( 'Unable to find replacement. Delaying.... ' ); $this->_delay_post_process( $post_type, $original_post_data ); return false; } } $post_data['meta']['_menu_item_object_id'] = $new_parent_id; } break; } // please ignore this horrible loop below: // it was an attempt to automate different visual composer meta key replacements // but I'm not using visual composer any more, so ignoring it. foreach ( $replace_meta_vals as $meta_key_to_replace => $meta_values_to_replace ) { $meta_keys_to_replace = explode( '|', $meta_key_to_replace ); $success = false; $trying_to_find_replace = false; foreach ( $meta_keys_to_replace as $meta_key ) { if ( ! empty( $post_data['meta'][ $meta_key ] ) ) { $meta_val = $post_data['meta'][ $meta_key ]; if ( $debug ) { echo "Meta key: $meta_key \n"; print_r( $meta_val ); } // if we're replacing a single post/tax value. if ( isset( $meta_values_to_replace['post'] ) && $meta_values_to_replace['post'] && (int) $meta_val > 0 ) { $trying_to_find_replace = true; $new_meta_val = $this->_imported_post_id( $meta_val ); if ( $new_meta_val ) { $post_data['meta'][ $meta_key ] = $new_meta_val; $success = true; } else { $success = false; break; } } if ( isset( $meta_values_to_replace['taxonomy'] ) && $meta_values_to_replace['taxonomy'] && (int) $meta_val > 0 ) { $trying_to_find_replace = true; $new_meta_val = $this->_imported_term_id( $meta_val ); if ( $new_meta_val ) { $post_data['meta'][ $meta_key ] = $new_meta_val; $success = true; } else { $success = false; break; } } if ( is_array( $meta_val ) && isset( $meta_values_to_replace['posts'] ) ) { foreach ( $meta_values_to_replace['posts'] as $post_array_key ) { $this->log( 'Trying to find/replace "' . $post_array_key . '"" in the ' . $meta_key . ' sub array:' ); $this_success = false; array_walk_recursive( $meta_val, function ( &$item, $key ) use ( &$trying_to_find_replace, $post_array_key, &$success, &$this_success, $post_type, $original_post_data, $meta_key, $delayed ) { if ( $key == $post_array_key && (int) $item > 0 ) { $trying_to_find_replace = true; $new_insert_id = $this->_imported_post_id( $item ); if ( $new_insert_id ) { $success = true; $this_success = true; $this->log( 'Found' . $meta_key . ' -> ' . $post_array_key . ' replacement POST ID insert for ' . $item . ' ( as ' . $new_insert_id . ' ) ' ); $item = $new_insert_id; } else { $this->error( 'Unable to find ' . $meta_key . ' -> ' . $post_array_key . ' POST ID insert for ' . $item . ' ' ); } } } ); if ( $this_success ) { $post_data['meta'][ $meta_key ] = $meta_val; } } foreach ( $meta_values_to_replace['taxonomies'] as $post_array_key ) { $this->log( 'Trying to find/replace "' . $post_array_key . '"" TAXONOMY in the ' . $meta_key . ' sub array:' ); //$this->log(var_export($meta_val,true)); $this_success = false; array_walk_recursive( $meta_val, function ( &$item, $key ) use ( &$trying_to_find_replace, $post_array_key, &$success, &$this_success, $post_type, $original_post_data, $meta_key, $delayed ) { if ( $key == $post_array_key && (int) $item > 0 ) { $trying_to_find_replace = true; $new_insert_id = $this->_imported_term_id( $item ); if ( $new_insert_id ) { $success = true; $this_success = true; $this->log( 'Found' . $meta_key . ' -> ' . $post_array_key . ' replacement TAX ID insert for ' . $item . ' ( as ' . $new_insert_id . ' ) ' ); $item = $new_insert_id; } else { $this->error( 'Unable to find ' . $meta_key . ' -> ' . $post_array_key . ' TAX ID insert for ' . $item . ' ' ); } } } ); if ( $this_success ) { $post_data['meta'][ $meta_key ] = $meta_val; } } } if ( $success ) { if ( $debug ) { echo "Meta key AFTER REPLACE: $meta_key \n"; print_r( $post_data['meta'] ); } } } } if ( $trying_to_find_replace ) { $this->log( 'Trying to find/replace postmeta "' . $meta_key_to_replace . '" ' ); if ( ! $success ) { // failed to find a replacement. if ( $delayed ) { // already delayed, unable to find this meta value, skip inserting it $this->error( 'Unable to find replacement. Continue anyway.... content will most likely break..' ); } else { $this->error( 'Unable to find replacement. Delaying.... ' ); $this->_delay_post_process( $post_type, $original_post_data ); return false; } } else { $this->log( 'SUCCESSSS ' ); } } } } $post_data['post_content'] = $this->_parse_gallery_shortcode_content($post_data['post_content']); // we have to fix up all the visual composer inserted image ids $replace_post_id_keys = array( 'parallax_image', 'dtbwp_row_image_top', 'dtbwp_row_image_bottom', 'image', 'item', // vc grid 'post_id', ); foreach ( $replace_post_id_keys as $replace_key ) { if ( preg_match_all( '# ' . $replace_key . '="(\d+)"#', $post_data['post_content'], $matches ) ) { foreach ( $matches[0] as $match_id => $string ) { $new_id = $this->_imported_post_id( $matches[1][ $match_id ] ); if ( $new_id ) { $post_data['post_content'] = str_replace( $string, ' ' . $replace_key . '="' . $new_id . '"', $post_data['post_content'] ); } else { $this->error( 'Unable to find POST replacement for ' . $replace_key . '="' . $matches[1][ $match_id ] . '" in content.' ); if ( $delayed ) { // already delayed, unable to find this meta value, insert it anyway. } else { $this->error( 'Adding ' . $post_data['post_id'] . ' to delay listing.' ); // echo "Delaying post id ".$post_data['post_id']."... \n\n"; $this->_delay_post_process( $post_type, $original_post_data ); return false; } } } } } $replace_tax_id_keys = array( 'taxonomies', ); foreach ( $replace_tax_id_keys as $replace_key ) { if ( preg_match_all( '# ' . $replace_key . '="(\d+)"#', $post_data['post_content'], $matches ) ) { foreach ( $matches[0] as $match_id => $string ) { $new_id = $this->_imported_term_id( $matches[1][ $match_id ] ); if ( $new_id ) { $post_data['post_content'] = str_replace( $string, ' ' . $replace_key . '="' . $new_id . '"', $post_data['post_content'] ); } else { $this->error( 'Unable to find TAXONOMY replacement for ' . $replace_key . '="' . $matches[1][ $match_id ] . '" in content.' ); if ( $delayed ) { // already delayed, unable to find this meta value, insert it anyway. } else { // echo "Delaying post id ".$post_data['post_id']."... \n\n"; $this->_delay_post_process( $post_type, $original_post_data ); return false; } } } } } $post_id = wp_insert_post( $post_data, true ); if ( ! is_wp_error( $post_id ) ) { $this->_imported_post_id( $post_data['post_id'], $post_id ); // add/update post meta if ( ! empty( $post_data['meta'] ) ) { foreach ( $post_data['meta'] as $meta_key => $meta_val ) { // if the post has a featured image, take note of this in case of remap if ( '_thumbnail_id' == $meta_key ) { /// find this inserted id and use that instead. $inserted_id = $this->_imported_post_id( intval( $meta_val ) ); if ( $inserted_id ) { $meta_val = $inserted_id; } } // echo "Post meta $meta_key was $meta_val \n\n"; update_post_meta( $post_id, $meta_key, $meta_val ); } } if ( ! empty( $post_data['terms'] ) ) { $terms_to_set = array(); foreach ( $post_data['terms'] as $term_slug => $terms ) { foreach ( $terms as $term ) { $taxonomy = $term['taxonomy']; if ( taxonomy_exists( $taxonomy ) ) { $term_exists = term_exists( $term['slug'], $taxonomy ); $term_id = is_array( $term_exists ) ? $term_exists['term_id'] : $term_exists; if ( ! $term_id ) { if ( ! empty( $term['parent'] ) ) { // see if we have imported this yet? $term['parent'] = $this->_imported_term_id( $term['parent'] ); } $t = wp_insert_term( $term['name'], $taxonomy, $term ); if ( ! is_wp_error( $t ) ) { $term_id = $t['term_id']; } else { // todo - error continue; } } $this->_imported_term_id( $term['term_id'], $term_id ); // add the term meta. if($term_id && !empty($term['meta']) && is_array($term['meta'])){ foreach($term['meta'] as $meta_key => $meta_val){ // we have to replace certain meta_key/meta_val // e.g. thumbnail id from woocommerce product categories. switch($meta_key){ case 'thumbnail_id': if( $new_meta_val = $this->_imported_post_id($meta_val) ){ // use this new id. $meta_val = $new_meta_val; } break; } update_term_meta( $term_id, $meta_key, $meta_val ); } } $terms_to_set[ $taxonomy ][] = intval( $term_id ); } } } foreach ( $terms_to_set as $tax => $ids ) { wp_set_post_terms( $post_id, $ids, $tax ); } } // procses visual composer just to be sure. if ( strpos( $post_data['post_content'], '[vc_' ) !== false ) { $this->vc_post( $post_id ); } if ( !empty($post_data['meta']['_elementor_data']) || !!empty($post_data['meta']['_elementor_css']) ) { $this->elementor_post( $post_id ); } } break; } return true; } private function _parse_gallery_shortcode_content($content){ // we have to format the post content. rewriting images and gallery stuff $replace = $this->_imported_post_id(); $urls_replace = array(); foreach ( $replace as $key => $val ) { if ( $key && $val && ! is_numeric( $key ) && ! is_numeric( $val ) ) { $urls_replace[ $key ] = $val; } } if ( $urls_replace ) { uksort( $urls_replace, array( &$this, 'cmpr_strlen' ) ); foreach ( $urls_replace as $from_url => $to_url ) { $content = str_replace( $from_url, $to_url, $content ); } } if ( preg_match_all( '#\[gallery[^\]]*\]#', $content, $matches ) ) { foreach ( $matches[0] as $match_id => $string ) { if ( preg_match( '#ids="([^"]+)"#', $string, $ids_matches ) ) { $ids = explode( ',', $ids_matches[1] ); foreach ( $ids as $key => $val ) { $new_id = $val ? $this->_imported_post_id( $val ) : false; if ( ! $new_id ) { unset( $ids[ $key ] ); } else { $ids[ $key ] = $new_id; } } $new_ids = implode( ',', $ids ); $content = str_replace( $ids_matches[0], 'ids="' . $new_ids . '"', $content ); } } } // contact form 7 id fixes. if ( preg_match_all( '#\[contact-form-7[^\]]*\]#', $content, $matches ) ) { foreach ( $matches[0] as $match_id => $string ) { if ( preg_match( '#id="(\d+)"#', $string, $id_match ) ) { $new_id = $this->_imported_post_id( $id_match[1] ); if ( $new_id ) { $content = str_replace( $id_match[0], 'id="' . $new_id . '"', $content ); } else { // no imported ID found. remove this entry. $content = str_replace( $matches[0], '(insert contact form here)', $content ); } } } } return $content; } private function _elementor_id_import( &$item, $key ) { if ( $key == 'id' && ! empty( $item ) && is_numeric( $item ) ) { // check if this has been imported before $new_meta_val = $this->_imported_post_id( $item ); if ( $new_meta_val ) { $item = $new_meta_val; } } if ( $key == 'page' && ! empty( $item ) ) { if ( false !== strpos( $item, 'p.' ) ) { $new_id = str_replace('p.', '', $item); // check if this has been imported before $new_meta_val = $this->_imported_post_id( $new_id ); if ( $new_meta_val ) { $item = 'p.' . $new_meta_val; } }else if(is_numeric($item)){ // check if this has been imported before $new_meta_val = $this->_imported_post_id( $item ); if ( $new_meta_val ) { $item = $new_meta_val; } } } if ( $key == 'post_id' && ! empty( $item ) && is_numeric( $item ) ) { // check if this has been imported before $new_meta_val = $this->_imported_post_id( $item ); if ( $new_meta_val ) { $item = $new_meta_val; } } if ( $key == 'url' && ! empty( $item ) && strstr( $item, 'ocalhost' ) ) { // check if this has been imported before $new_meta_val = $this->_imported_post_id( $item ); if ( $new_meta_val ) { $item = $new_meta_val; } } if ( ($key == 'shortcode' || $key == 'editor') && ! empty( $item ) ) { // we have to fix the [contact-form-7 id=133] shortcode issue. $item = $this->_parse_gallery_shortcode_content($item); } } private function _content_install_type() { $post_type = ! empty( $_POST['content'] ) ? $_POST['content'] : false; $all_data = $this->_get_json( 'default.json' ); if ( ! $post_type || ! isset( $all_data[ $post_type ] ) ) { return false; } $limit = 10 + ( isset( $_REQUEST['retry_count'] ) ? (int) $_REQUEST['retry_count'] : 0 ); $x = 0; foreach ( $all_data[ $post_type ] as $post_data ) { $this->_process_post_data( $post_type, $post_data ); if ( $x ++ > $limit ) { return array( 'retry' => 1, 'retry_count' => $limit ); } } $this->_handle_delayed_posts(); $this->_handle_post_orphans(); // now we have to handle any custom SQL queries. This is needed for the events manager to store location and event details. $sql = $this->_get_sql( basename( $post_type ) . '.sql' ); if ( $sql ) { global $wpdb; // do a find-replace with certain keys. if ( preg_match_all( '#__POSTID_(\d+)__#', $sql, $matches ) ) { foreach ( $matches[0] as $match_id => $match ) { $new_id = $this->_imported_post_id( $matches[1][ $match_id ] ); if ( ! $new_id ) { $new_id = 0; } $sql = str_replace( $match, $new_id, $sql ); } } $sql = str_replace( '__DBPREFIX__', $wpdb->prefix, $sql ); $bits = preg_split( "/;(\s*\n|$)/", $sql ); foreach ( $bits as $bit ) { $bit = trim( $bit ); if ( $bit ) { $wpdb->query( $bit ); } } } return true; } private function _handle_post_orphans() { $orphans = $this->_post_orphans(); foreach ( $orphans as $original_post_id => $original_post_parent_id ) { if ( $original_post_parent_id ) { if ( $this->_imported_post_id( $original_post_id ) && $this->_imported_post_id( $original_post_parent_id ) ) { $post_data = array(); $post_data['ID'] = $this->_imported_post_id( $original_post_id ); $post_data['post_parent'] = $this->_imported_post_id( $original_post_parent_id ); wp_update_post( $post_data ); $this->_post_orphans( $original_post_id, 0 ); // ignore future } } } } private function _handle_delayed_posts( $last_delay = false ) { $this->log( ' ---- Processing ' . count( $this->delay_posts, COUNT_RECURSIVE ) . ' delayed posts' ); for ( $x = 1; $x < 4; $x ++ ) { foreach ( $this->delay_posts as $delayed_post_type => $delayed_post_datas ) { foreach ( $delayed_post_datas as $delayed_post_id => $delayed_post_data ) { if ( $this->_imported_post_id( $delayed_post_data['post_id'] ) ) { $this->log( $x . ' - Successfully processed ' . $delayed_post_type . ' ID ' . $delayed_post_data['post_id'] . ' previously.' ); unset( $this->delay_posts[ $delayed_post_type ][ $delayed_post_id ] ); $this->log( ' ( ' . count( $this->delay_posts, COUNT_RECURSIVE ) . ' delayed posts remain ) ' ); } else if ( $this->_process_post_data( $delayed_post_type, $delayed_post_data, $last_delay ) ) { $this->log( $x . ' - Successfully found delayed replacement for ' . $delayed_post_type . ' ID ' . $delayed_post_data['post_id'] . '.' ); // successfully inserted! don't try again. unset( $this->delay_posts[ $delayed_post_type ][ $delayed_post_id ] ); $this->log( ' ( ' . count( $this->delay_posts, COUNT_RECURSIVE ) . ' delayed posts remain ) ' ); } } } } } private function _fetch_remote_file( $url, $post ) { // extract the file name and extension from the url $file_name = basename( $url ); $local_file = trailingslashit( get_template_directory() ) . 'images/stock/' . $file_name; $upload = false; if ( is_file( $local_file ) && filesize( $local_file ) > 0 ) { require_once( ABSPATH . 'wp-admin/includes/file.php' ); WP_Filesystem(); global $wp_filesystem; $file_data = $wp_filesystem->get_contents( $local_file ); $upload = wp_upload_bits( $file_name, 0, $file_data, $post['upload_date'] ); if ( $upload['error'] ) { return new WP_Error( 'upload_dir_error', $upload['error'] ); } } if ( ! $upload || $upload['error'] ) { // get placeholder file in the upload dir with a unique, sanitized filename $upload = wp_upload_bits( $file_name, 0, '', $post['upload_date'] ); if ( $upload['error'] ) { return new WP_Error( 'upload_dir_error', $upload['error'] ); } // fetch the remote url and write it to the placeholder file //$headers = wp_get_http( $url, $upload['file'] ); $max_size = (int) apply_filters( 'import_attachment_size_limit', 0 ); // we check if this file is uploaded locally in the source folder. $response = wp_remote_get( $url ); if ( is_array( $response ) && ! empty( $response['body'] ) && $response['response']['code'] == '200' ) { require_once( ABSPATH . 'wp-admin/includes/file.php' ); $headers = $response['headers']; WP_Filesystem(); global $wp_filesystem; $wp_filesystem->put_contents( $upload['file'], $response['body'] ); // } else { // required to download file failed. @unlink( $upload['file'] ); return new WP_Error( 'import_file_error', esc_html__( 'Remote server did not respond','upstudy' ) ); } $filesize = filesize( $upload['file'] ); if ( isset( $headers['content-length'] ) && $filesize != $headers['content-length'] ) { @unlink( $upload['file'] ); return new WP_Error( 'import_file_error', esc_html__( 'Remote file is incorrect size' ,'upstudy') ); } if ( 0 == $filesize ) { @unlink( $upload['file'] ); return new WP_Error( 'import_file_error', esc_html__( 'Zero size file downloaded','upstudy' ) ); } if ( ! empty( $max_size ) && $filesize > $max_size ) { @unlink( $upload['file'] ); return new WP_Error( 'import_file_error', sprintf( __( 'Remote file is too large, limit is %s','upstudy' ), size_format( $max_size ) ) ); } } // keep track of the old and new urls so we can substitute them later $this->_imported_post_id( $url, $upload['url'] ); $this->_imported_post_id( $post['guid'], $upload['url'] ); // keep track of the destination if the remote url is redirected somewhere else if ( isset( $headers['x-final-location'] ) && $headers['x-final-location'] != $url ) { $this->_imported_post_id( $headers['x-final-location'], $upload['url'] ); } return $upload; } /** * Payments Step */ public function envato_setup_updates() { ?> get_oauth_login_url( $this->get_step_link( 'updates' ) ); wp_redirect( esc_url_raw( $url ) ); exit; } public function envato_setup_customize() { ?>Theme Options menu from the WordPress dashboard. These include:','upstudy' ); ?>
Widgets. Here widgets can be "drag & droped" into sidebars. More details in documentation.','upstudy' ); ?>
" . sprintf( __( 'Something went wrong while trying to retrieve oauth token: %s','upstudy' ), $error_message ) . '
Follow the video to configure it.','upstudy' ), esc_url('https://www.youtube.com/watch?v=Grf7uAharrw') ); ?> https://devthrow.com/support/ ','upstudy' ), esc_url('https://devthrow.com/support/') ); ?>