Example #1
0
 /**
  * This function is called after when some file was unlinked from item
  *
  * @param integer Link ID
  */
 function after_unlink_action($link_ID = 0)
 {
     if (empty($this->Item)) {
         // No existing Item, Exit here
         return;
     }
     if (!empty($link_ID)) {
         // Find inline image placeholders if link ID is defined
         preg_match_all('/\\[(image|file|inline):' . $link_ID . ':?[^\\]]*\\]/i', $this->Item->content, $inline_images);
         if (!empty($inline_images[0])) {
             // There are inline image placeholders in the post content
             $this->Item->set('content', str_replace($inline_images[0], '', $this->Item->content));
             $this->Item->dbupdate();
             return;
         }
     }
     // Update last touched date of the Item
     $this->update_last_touched_date();
 }
Example #2
0
/**
 * Create sample posts and display a process of creating
 *
 * @param integer Blog ID
 * @param integer Number of posts
 */
function tool_create_sample_posts($blog_ID, $num_posts)
{
    global $Messages, $DB, $Debuglog;
    $BlogCache =& get_BlogCache();
    $selected_Blog = $BlogCache->get_by_ID($blog_ID, false, false);
    if ($selected_Blog == NULL) {
        // Incorrect blog ID, Exit here
        return;
    }
    echo T_('Creating of the sample posts...');
    evo_flush();
    /**
     * Disable log queries because it increases the memory and stops the process with error "Allowed memory size of X bytes exhausted..."
     */
    $DB->log_queries = false;
    $count = 1;
    $num_posts_created = 0;
    $content = T_('This is an auto generated post for testing moderation.');
    for ($i = 1; $i <= $num_posts; $i++) {
        // Spaces and line breaks make generated string look like real text
        $length = rand(300, 500);
        $word = generate_random_key($length, "\n     abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
        $post_content = $content . ' ' . $word;
        $urltitle = strtolower(str_replace(array("\n", ' ', '-'), '', substr($word, 50, 20)));
        $urltitle = trim($urltitle, '-');
        $Item = new Item();
        $Item->set('title', 'Generated post ' . $i);
        $Item->set('content', $post_content);
        $Item->set('status', 'published');
        $Item->set('dateset', 1);
        // Set post main cat ID, from selected blog
        $Item->set('main_cat_ID', $selected_Blog->get_default_cat_ID());
        // Random post url slug
        $Item->set('urltitle', $urltitle);
        if ($Item->dbinsert_test()) {
            $num_posts_created++;
        }
        $count++;
        if ($count % 100 == 0) {
            // Display a process of creating by one dot for 100 posts
            echo ' .';
            //pre_dump( memory_get_usage() );
            evo_flush();
        }
        // Clear all debug messages, To avoid an error about full memory
        $Debuglog->clear('all');
    }
    echo ' OK.';
    $Messages->add(sprintf(T_('Created %d posts.'), $num_posts_created), 'success');
    if ($num_posts > $num_posts_created) {
        // Some post creation failed because of concurtent modification error
        // Note: This message should not appear offten, so it doesn't need translation
        $Messages->add(sprintf('Creation of %d post(s) failed becuase of concurrent modification error.', $num_posts - $num_posts_created), 'note');
    }
}
Example #3
0
/**
 * Create a new Item and return an XML-RPC response
 *
 * @param array Item properties
 * @param object Blog where we are going to create a new Item
 * @return xmlrpcmsg
 */
function xmlrpcs_new_item($params, &$Blog = NULL)
{
    global $current_User, $Settings, $Messages, $DB, $posttypes_perms;
    $params = array_merge(array('title' => '', 'content' => '', 'date' => '', 'main_cat_ID' => 0, 'extra_cat_IDs' => array(), 'cat_IDs' => array(), 'status' => 'published', 'tags' => '', 'excerpt' => '', 'item_typ_ID' => 1, 'comment_status' => 'open', 'urltitle' => '', 'featured' => 0, 'custom_fields' => array(), 'order' => '', 'parent_ID' => ''), $params);
    if (empty($Blog) && !empty($params['main_cat_ID'])) {
        // Get the blog by main category ID
        // Check if category exists and can be used
        $ChapterCache =& get_ChapterCache();
        $main_Chapter =& $ChapterCache->get_by_ID($params['main_cat_ID'], false, false);
        if (empty($main_Chapter)) {
            // Cat does not exist:
            return xmlrpcs_resperror(11);
            // User error 11
        }
        $BlogCache =& get_BlogCache();
        $Blog =& $BlogCache->get_by_ID($main_Chapter->blog_ID, false, false);
        logIO('Requested Blog: ' . $Blog->ID . ' - ' . $Blog->name);
    }
    if (empty($Blog)) {
        // Blog does not exist:
        return xmlrpcs_resperror();
    }
    if (empty($params['main_cat_ID'])) {
        if (is_array($params['cat_IDs']) && count($params['cat_IDs']) > 0) {
            // Let's use first cat for MAIN and others for EXTRA
            $params['main_cat_ID'] = array_shift($params['cat_IDs']);
            $params['extra_cat_IDs'] = $params['cat_IDs'];
        } else {
            if (!($main_cat = $Blog->get_default_cat_ID())) {
                // No default category found for requested blog
                return xmlrpcs_resperror(12);
                // User error 12
            }
            $params['main_cat_ID'] = $main_cat;
        }
    }
    logIO('Main cat ID: ' . $params['main_cat_ID']);
    logIO('Extra cat IDs: ' . implode(', ', $params['extra_cat_IDs']));
    if (empty($params['main_cat_ID'])) {
        // Main category does not exist:
        return xmlrpcs_resperror(11);
        // User error 11
    }
    // Check if category exists and can be used
    if (!xmlrpcs_check_cats($params['main_cat_ID'], $Blog, $params['extra_cat_IDs'])) {
        // Permission denied
        return xmlrpcs_resperror(3);
        // User error 3
    }
    /*
     * CHECK PERMISSION: (we need perm on all categories, especially if they are in different blogs)
     * NOTE: extra_cat_IDs array now includes main_cat_ID too, so we are actually checking ALL categories below
     */
    if (!$current_User->check_perm('cats_post!' . $params['status'], 'edit', false, $params['extra_cat_IDs'])) {
        // Permission denied
        return xmlrpcs_resperror(3);
        // User error 3
    }
    if (!empty($params['item_typ_ID'])) {
        if (!preg_match('~^[0-9]+$~', $params['item_typ_ID'])) {
            // Only accept numeric values, switch to default value
            $params['item_typ_ID'] = 1;
        }
        foreach ($posttypes_perms as $l_permname => $l_posttypes) {
            // "Reverse" the $posttypes_perms array:
            foreach ($l_posttypes as $ll_posttype) {
                $posttype2perm[$ll_posttype] = $l_permname;
            }
        }
        if (isset($posttype2perm[$params['item_typ_ID']])) {
            // Check permission for this post type
            if (!$current_User->check_perm('cats_' . $posttype2perm[$params['item_typ_ID']], 'edit', false, $params['extra_cat_IDs'])) {
                // Permission denied
                return xmlrpcs_resperror(3);
                // User error 3
            }
        }
    }
    logIO('Post type: ' . $params['item_typ_ID']);
    logIO('Permission granted.');
    // CHECK HTML SANITY:
    if (($params['title'] = check_html_sanity($params['title'], 'xmlrpc_posting')) === false) {
        return xmlrpcs_resperror(21, $Messages->get_string('Invalid post title, please correct these errors:', ''));
    }
    if (($params['content'] = check_html_sanity($params['content'], 'xmlrpc_posting')) === false) {
        return xmlrpcs_resperror(22, $Messages->get_string('Invalid post contents, please correct these errors:' . "\n", '', "  //  \n", 'xmlrpc'));
    }
    if (empty($params['date'])) {
        $params['date'] = date('Y-m-d H:i:s', time() + $Settings->get('time_difference'));
    }
    // INSERT NEW POST INTO DB:
    load_class('items/model/_item.class.php', 'Item');
    $edited_Item = new Item();
    $edited_Item->set('title', $params['title']);
    $edited_Item->set('content', $params['content']);
    $edited_Item->set('issue_date', $params['date']);
    $edited_Item->set('main_cat_ID', $params['main_cat_ID']);
    $edited_Item->set('extra_cat_IDs', $params['extra_cat_IDs']);
    $edited_Item->set('status', $params['status']);
    $edited_Item->set('ptyp_ID', $params['item_typ_ID']);
    $edited_Item->set('featured', $params['featured']);
    $edited_Item->set_tags_from_string($params['tags']);
    $edited_Item->set('locale', $current_User->locale);
    $edited_Item->set_creator_User($current_User);
    if ($params['excerpt'] != '') {
        $edited_Item->set('excerpt', $params['excerpt']);
    }
    if ($params['urltitle'] != '') {
        $edited_Item->set('urltitle', $params['urltitle']);
    }
    if ($params['parent_ID'] != '') {
        $edited_Item->set('parent_ID', $params['parent_ID']);
    }
    if (!empty($params['order'])) {
        $edited_Item->set('order', $params['order']);
    }
    // Do not set if order is 0
    if ($Blog->get_setting('allow_comments') != 'never' && $Blog->get_setting('disable_comments_bypost')) {
        // Comment status
        $edited_Item->set('comment_status', $params['comment_status']);
    }
    $edited_Item->dbinsert('through_xmlrpc');
    if (empty($edited_Item->ID)) {
        return xmlrpcs_resperror(99, 'Error while inserting item: ' . $DB->last_error);
    }
    logIO('Posted with ID: ' . $edited_Item->ID);
    if (!empty($params['custom_fields']) && is_array($params['custom_fields']) && count($params['custom_fields']) > 0) {
        // TODO sam2kb> Add custom fields
        foreach ($params['custom_fields'] as $field) {
            // id, key, value
            logIO('Custom field: ' . var_export($field, true));
        }
    }
    // Execute or schedule notifications & pings:
    logIO('Handling notifications...');
    $edited_Item->handle_post_processing(true);
    logIO('OK.');
    return new xmlrpcresp(new xmlrpcval($edited_Item->ID));
}
Example #4
0
 param('post_status', 'string', 'published');
 if ($action == 'create_publish') {
     // load publish status from param, because a post can be published to many status
     $post_status = load_publish_status(true);
 }
 // Check if new category was started to create. If yes check if it is valid.
 check_categories($post_category, $post_extracats);
 // Check permission on statuses:
 $current_User->check_perm('cats_post!' . $post_status, 'create', true, $post_extracats);
 // Check permission on post type:
 check_perm_posttype($post_extracats);
 // CREATE NEW POST:
 load_class('items/model/_item.class.php', 'Item');
 $edited_Item = new Item();
 // Set the params we already got:
 $edited_Item->set('status', $post_status);
 $edited_Item->set('main_cat_ID', $post_category);
 $edited_Item->set('extra_cat_IDs', $post_extracats);
 // Set object params:
 $edited_Item->load_from_Request($action == 'create_edit', true);
 $Plugins->trigger_event('AdminBeforeItemEditCreate', array('Item' => &$edited_Item));
 if (!empty($mass_create)) {
     // ------ MASS CREATE ------
     $Items =& create_multiple_posts($edited_Item, param('paragraphs_linebreak', 'boolean', 0));
     if (empty($Items)) {
         param_error('content', T_('Content must not be empty.'));
     }
 }
 $result = !$Messages->has_errors();
 if ($result) {
     // There are no validation errors
Example #5
0
/**
 * Import WordPress data from XML file into b2evolution database
 */
function wpxml_import()
{
    global $DB, $tableprefix;
    // Load classes:
    load_class('regional/model/_country.class.php', 'Country');
    load_class('regional/model/_region.class.php', 'Region');
    load_class('regional/model/_subregion.class.php', 'Subregion');
    load_class('regional/model/_city.class.php', 'City');
    // Set Blog from request blog ID
    $wp_blog_ID = param('wp_blog_ID', 'integer', 0);
    $BlogCache =& get_BlogCache();
    $wp_Blog =& $BlogCache->get_by_ID($wp_blog_ID);
    // The import type ( replace | append )
    $import_type = param('import_type', 'string', 'replace');
    // Get XML file from request
    $xml_file = $_FILES['wp_file'];
    // Parse WordPress XML file into array
    $xml_data = wpxml_parser($xml_file['tmp_name']);
    $DB->begin();
    if ($import_type == 'replace') {
        // Remove data from selected blog
        // Get existing categories
        $SQL = new SQL();
        $SQL->SELECT('cat_ID');
        $SQL->FROM('T_categories');
        $SQL->WHERE('cat_blog_ID = ' . $DB->quote($wp_blog_ID));
        $old_categories = $DB->get_col($SQL->get());
        if (!empty($old_categories)) {
            // Get existing posts
            $SQL = new SQL();
            $SQL->SELECT('post_ID');
            $SQL->FROM('T_items__item');
            $SQL->WHERE('post_main_cat_ID IN ( ' . implode(', ', $old_categories) . ' )');
            $old_posts = $DB->get_col($SQL->get());
        }
        echo T_('Removing the comments... ');
        evo_flush();
        if (!empty($old_posts)) {
            $SQL = new SQL();
            $SQL->SELECT('comment_ID');
            $SQL->FROM('T_comments');
            $SQL->WHERE('comment_post_ID IN ( ' . implode(', ', $old_posts) . ' )');
            $old_comments = $DB->get_col($SQL->get());
            $DB->query('DELETE FROM T_comments WHERE comment_post_ID IN ( ' . implode(', ', $old_posts) . ' )');
            if (!empty($old_comments)) {
                $DB->query('DELETE FROM T_comments__votes WHERE cmvt_cmt_ID IN ( ' . implode(', ', $old_comments) . ' )');
            }
        }
        echo T_('OK') . '<br />';
        echo T_('Removing the posts... ');
        evo_flush();
        if (!empty($old_categories)) {
            $DB->query('DELETE FROM T_items__item WHERE post_main_cat_ID IN ( ' . implode(', ', $old_categories) . ' )');
            if (!empty($old_posts)) {
                // Remove the post's data from related tables
                $DB->query('DELETE FROM T_items__item_settings WHERE iset_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__prerendering WHERE itpr_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__subscriptions WHERE isub_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__version WHERE iver_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_postcats WHERE postcat_post_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_slug WHERE slug_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
            }
        }
        echo T_('OK') . '<br />';
        echo T_('Removing the categories... ');
        evo_flush();
        $DB->query('DELETE FROM T_categories WHERE cat_blog_ID = ' . $DB->quote($wp_blog_ID));
        echo T_('OK') . '<br />';
        echo T_('Removing the tags that are no longer used... ');
        evo_flush();
        if (!empty($old_posts)) {
            // Remove the tags
            // Get tags from selected blog
            $SQL = new SQL();
            $SQL->SELECT('itag_tag_ID');
            $SQL->FROM('T_items__itemtag');
            $SQL->WHERE('itag_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
            $old_tags_this_blog = array_unique($DB->get_col($SQL->get()));
            if (!empty($old_tags_this_blog)) {
                // Get tags from other blogs
                $SQL = new SQL();
                $SQL->SELECT('itag_tag_ID');
                $SQL->FROM('T_items__itemtag');
                $SQL->WHERE('itag_itm_ID NOT IN ( ' . implode(', ', $old_posts) . ' )');
                $old_tags_other_blogs = array_unique($DB->get_col($SQL->get()));
                $old_tags_other_blogs_sql = !empty($old_tags_other_blogs) ? ' AND tag_ID NOT IN ( ' . implode(', ', $old_tags_other_blogs) . ' )' : '';
                // Remove the tags that are no longer used
                $DB->query('DELETE FROM T_items__tag
					WHERE tag_ID IN ( ' . implode(', ', $old_tags_this_blog) . ' )' . $old_tags_other_blogs_sql);
            }
            // Remove the links of tags with posts
            $DB->query('DELETE FROM T_items__itemtag WHERE itag_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
        }
        echo T_('OK') . '<br /><br />';
    }
    /* Import authors */
    $authors = array();
    $authors_IDs = array();
    if (isset($xml_data['authors']) && count($xml_data['authors']) > 0) {
        global $Settings, $UserSettings;
        echo T_('Importing the users... ');
        evo_flush();
        // Get existing users
        $SQL = new SQL();
        $SQL->SELECT('user_login, user_ID');
        $SQL->FROM('T_users');
        $existing_users = $DB->get_assoc($SQL->get());
        $authors_count = 0;
        foreach ($xml_data['authors'] as $author) {
            if (empty($existing_users[(string) $author['author_login']])) {
                // Insert new user into DB if User doesn't exist with current login name
                $GroupCache =& get_GroupCache();
                if (!empty($author['author_group'])) {
                    // Set user group from xml data
                    if (($UserGroup =& $GroupCache->get_by_name($author['author_group'], false)) === false) {
                        // If user's group doesn't exist yet, we should create new
                        $UserGroup = new Group();
                        $UserGroup->set('name', $author['author_group']);
                        $UserGroup->dbinsert();
                    }
                } else {
                    // Set default user group is it is not defined in xml
                    if (($UserGroup =& $GroupCache->get_by_name('Normal Users', false)) === false) {
                        // Exit from import of users, because we cannot set default user group
                        break;
                    }
                }
                unset($author_created_from_country);
                if (!empty($author['author_created_from_country'])) {
                    // Get country ID from DB by code
                    $CountryCache =& get_CountryCache();
                    if (($Country =& $CountryCache->get_by_name($author['author_created_from_country'], false)) !== false) {
                        $author_created_from_country = $Country->ID;
                    }
                }
                // Get regional IDs by their names
                $author_regions = wp_get_regional_data($author['author_country'], $author['author_region'], $author['author_subregion'], $author['author_city']);
                $User = new User();
                $User->set('login', $author['author_login']);
                $User->set('email', $author['author_email']);
                $User->set('firstname', $author['author_first_name']);
                $User->set('lastname', $author['author_last_name']);
                $User->set('pass', $author['author_pass']);
                $User->set_Group($UserGroup);
                $User->set('status', !empty($author['author_status']) ? $author['author_status'] : 'autoactivated');
                $User->set('nickname', $author['author_nickname']);
                $User->set('url', $author['author_url']);
                $User->set('level', $author['author_level']);
                $User->set('locale', $author['author_locale']);
                $User->set('gender', $author['author_gender'] == 'female' ? 'F' : ($author['author_gender'] == 'male' ? 'M' : ''));
                if ($author['author_age_min'] > 0) {
                    $User->set('age_min', $author['author_age_min']);
                }
                if ($author['author_age_max'] > 0) {
                    $User->set('age_max', $author['author_age_max']);
                }
                if (isset($author_created_from_country)) {
                    // User was created from this country
                    $User->set('reg_ctry_ID', $author_created_from_country);
                }
                if (!empty($author_regions['country'])) {
                    // Country
                    $User->set('ctry_ID', $author_regions['country']);
                    if (!empty($author_regions['region'])) {
                        // Region
                        $User->set('rgn_ID', $author_regions['region']);
                        if (!empty($author_regions['subregion'])) {
                            // Subregion
                            $User->set('subrg_ID', $author_regions['subregion']);
                        }
                        if (!empty($author_regions['city'])) {
                            // City
                            $User->set('city_ID', $author_regions['city']);
                        }
                    }
                }
                $User->set('source', $author['author_source']);
                $User->set_datecreated($author['author_created_ts'], true);
                $User->set('lastseen_ts', $author['author_lastseen_ts']);
                $User->set('profileupdate_date', $author['author_profileupdate_date']);
                $User->dbinsert();
                $user_ID = $User->ID;
                if (!empty($user_ID) && !empty($author['author_created_fromIPv4'])) {
                    $UserSettings->set('created_fromIPv4', ip2int($author['author_created_fromIPv4']), $user_ID);
                }
                $authors_count++;
            } else {
                // Get ID of existing user
                $user_ID = $existing_users[(string) $author['author_login']];
            }
            // Save user ID of current author
            $authors[$author['author_login']] = (string) $user_ID;
            $authors_IDs[$author['author_id']] = (string) $user_ID;
        }
        $UserSettings->dbupdate();
        echo sprintf(T_('%d records'), $authors_count) . '<br />';
    }
    /* Import categories */
    $category_default = 0;
    // Get existing categories
    $SQL = new SQL();
    $SQL->SELECT('cat_urlname, cat_ID');
    $SQL->FROM('T_categories');
    $SQL->WHERE('cat_blog_ID = ' . $DB->quote($wp_blog_ID));
    $categories = $DB->get_assoc($SQL->get());
    if (isset($xml_data['categories']) && count($xml_data['categories']) > 0) {
        echo T_('Importing the categories... ');
        evo_flush();
        load_class('chapters/model/_chapter.class.php', 'Chapter');
        load_funcs('locales/_charset.funcs.php');
        $categories_count = 0;
        foreach ($xml_data['categories'] as $cat) {
            if (empty($categories[(string) $cat['category_nicename']])) {
                $Chapter = new Chapter(NULL, $wp_blog_ID);
                $Chapter->set('name', $cat['cat_name']);
                $Chapter->set('urlname', $cat['category_nicename']);
                $Chapter->set('description', $cat['category_description']);
                if (!empty($cat['category_parent']) && isset($categories[(string) $cat['category_parent']])) {
                    // Set category parent ID
                    $Chapter->set('parent_ID', $categories[(string) $cat['category_parent']]);
                }
                $Chapter->dbinsert();
                // Save new category
                $categories[$cat['category_nicename']] = $Chapter->ID;
                if (empty($category_default)) {
                    // Set first category as default
                    $category_default = $Chapter->ID;
                }
                $categories_count++;
            }
        }
        if (empty($category_default)) {
            // Set first category as default
            foreach ($categories as $category_name => $category_ID) {
                $category_default = $category_ID;
                break;
            }
        }
        echo sprintf(T_('%d records'), $categories_count) . '<br />';
    }
    /* Import tags */
    $tags = array();
    if (isset($xml_data['tags']) && count($xml_data['tags']) > 0) {
        echo T_('Importing the tags... ');
        evo_flush();
        // Get existing tags
        $SQL = new SQL();
        $SQL->SELECT('tag_name, tag_ID');
        $SQL->FROM('T_items__tag');
        $tags = $DB->get_assoc($SQL->get());
        $tags_count = 0;
        foreach ($xml_data['tags'] as $tag) {
            if (empty($tags[(string) $tag['tag_name']])) {
                // Insert new tag into DB if tag doesn't exist with current name
                mysql_query('INSERT INTO ' . $tableprefix . 'items__tag ( tag_name )
					VALUES ( ' . $DB->quote($tag['tag_name']) . ' )', $DB->dbhandle);
                $tag_ID = mysql_insert_id($DB->dbhandle);
                // Save new tag
                $tags[$tag['tag_name']] = (string) $tag_ID;
                $tags_count++;
            }
        }
        echo sprintf(T_('%d records'), $tags_count) . '<br />';
    }
    /* Import posts */
    $posts = array();
    $comments = array();
    if (isset($xml_data['posts']) && count($xml_data['posts']) > 0) {
        load_class('items/model/_item.class.php', 'Item');
        // Set status's links between WP and b2evo names
        $post_statuses = array('publish' => 'published', 'pending' => 'deprecated', 'deprecated' => 'deprecated', 'protected' => 'protected', 'private' => 'private', 'redirected' => 'redirected', 'draft' => 'draft');
        // Get post types
        $SQL = new SQL();
        $SQL->SELECT('LOWER( ptyp_name ), ptyp_ID');
        $SQL->FROM('T_items__type');
        $post_types = $DB->get_assoc($SQL->get());
        echo T_('Importing the posts... ');
        evo_flush();
        foreach ($xml_data['posts'] as $post) {
            $author_ID = isset($authors[(string) $post['post_author']]) ? $authors[(string) $post['post_author']] : 1;
            $last_edit_user_ID = isset($authors[(string) $post['post_lastedit_user']]) ? $authors[(string) $post['post_lastedit_user']] : $author_ID;
            $post_main_cat_ID = $category_default;
            $post_extra_cat_IDs = array($post_main_cat_ID);
            $post_tags = array();
            if (!empty($post['terms'])) {
                // Set categories and tags
                foreach ($post['terms'] as $term) {
                    switch ($term['domain']) {
                        case 'category':
                            if (isset($categories[(string) $term['slug']])) {
                                if ($post_main_cat_ID == $category_default) {
                                    // Set main category
                                    $post_main_cat_ID = $categories[(string) $term['slug']];
                                } else {
                                    // Set extra categories
                                    $post_extra_cat_IDs[] = $categories[(string) $term['slug']];
                                }
                            }
                            break;
                        case 'post_tag':
                            if (isset($tags[(string) $term['slug']])) {
                                // Set tag
                                $post_tags[] = $term['slug'];
                            }
                            break;
                    }
                }
            }
            // Set post type ID
            $post_type_ID = isset($post_types[strtolower($post['post_type'])]) ? $post_types[strtolower($post['post_type'])] : '1';
            // Get regional IDs by their names
            $item_regions = wp_get_regional_data($post['post_country'], $post['post_region'], $post['post_subregion'], $post['post_city']);
            $Item = new Item();
            $Item->set('main_cat_ID', $post_main_cat_ID);
            $Item->set('creator_user_ID', $author_ID);
            $Item->set('lastedit_user_ID', $last_edit_user_ID);
            $Item->set('title', $post['post_title']);
            $Item->set('content', $post['post_content']);
            $Item->set('excerpt', $post['post_excerpt']);
            $Item->set('datestart', $post['post_date']);
            $Item->set('datecreated', !empty($post['post_datecreated']) ? $post['post_datecreated'] : $post['post_date']);
            $Item->set('datemodified', !empty($post['post_datemodified']) ? $post['post_datemodified'] : $post['post_date']);
            $Item->set('urltitle', !empty($post['post_urltitle']) ? $post['post_urltitle'] : $post['post_title']);
            $Item->set('status', isset($post_statuses[(string) $post['status']]) ? $post_statuses[(string) $post['status']] : 'draft');
            $Item->set('comment_status', $post['comment_status'] == 'open' ? 'open' : 'closed');
            $Item->set('ptyp_ID', $post_type_ID);
            if (empty($post['post_excerpt']) && !empty($post['post_content'])) {
                // Generate excerpt
                $Item->set('excerpt', wp_generate_excerpt($post['post_content']));
                $Item->set('excerpt_autogenerated', '1');
            }
            $Item->set('extra_cat_IDs', $post_extra_cat_IDs);
            $Item->set('dateset', $post['post_date_mode'] == 'set' ? 1 : 0);
            if (isset($authors[(string) $post['post_assigned_user']])) {
                $Item->set('assigned_user', $authors[(string) $post['post_assigned_user']]);
            }
            $Item->set('datedeadline', $post['post_datedeadline']);
            $Item->set('locale', $post['post_locale']);
            $Item->set('excerpt_autogenerated', $post['post_excerpt_autogenerated']);
            $Item->set('titletag', $post['post_titletag']);
            $Item->set('notifications_status', $post['post_notifications_status']);
            $Item->set('views', $post['post_views']);
            $Item->set('renderers', array($post['post_renderers']));
            $Item->set('priority', $post['post_priority']);
            $Item->set('featured', $post['post_featured']);
            $Item->set('order', $post['post_order']);
            if (!empty($item_regions['country'])) {
                // Country
                $Item->set('ctry_ID', $item_regions['country']);
                if (!empty($item_regions['region'])) {
                    // Region
                    $Item->set('rgn_ID', $item_regions['region']);
                    if (!empty($item_regions['subregion'])) {
                        // Subregion
                        $Item->set('subrg_ID', $item_regions['subregion']);
                    }
                    if (!empty($item_regions['city'])) {
                        // City
                        $Item->set('city_ID', $item_regions['city']);
                    }
                }
            }
            if (count($post_tags) > 0) {
                $Item->tags = $post_tags;
            }
            $Item->dbinsert();
            $posts[$post['post_id']] = $Item->ID;
            if (!empty($post['comments'])) {
                // Set comments
                $comments[$Item->ID] = $post['comments'];
            }
        }
        foreach ($xml_data['posts'] as $post) {
            // Set post parents
            if (!empty($post['post_parent']) && isset($posts[(string) $post['post_parent']])) {
                mysql_query('UPDATE ' . $tableprefix . 'items__item
						  SET post_parent_ID = ' . $DB->quote($posts[(string) $post['post_parent']]) . '
						WHERE post_ID = ' . $DB->quote($posts[(string) $post['post_id']]), $DB->dbhandle);
            }
        }
        echo sprintf(T_('%d records'), count($xml_data['posts'])) . '<br />';
    }
    /* Import comments */
    if (!empty($comments)) {
        echo T_('Importing the comments... ');
        evo_flush();
        $comments_count = 0;
        $comments_IDs = array();
        foreach ($comments as $post_ID => $comments) {
            if (empty($comments)) {
                // Skip if no comments
                continue;
            }
            foreach ($comments as $comment) {
                $comment_author_ID = 0;
                if (!empty($comment['comment_user_id']) && isset($authors_IDs[(string) $comment['comment_user_id']])) {
                    // Author ID
                    $comment_author_ID = $authors_IDs[(string) $comment['comment_user_id']];
                }
                $comment_parent_ID = 0;
                if (!empty($comment['comment_parent']) && isset($comments_IDs[(string) $comment['comment_parent']])) {
                    // Parent comment ID
                    $comment_parent_ID = $comments_IDs[(string) $comment['comment_parent']];
                }
                unset($comment_IP_country);
                if (!empty($comment['comment_IP_country'])) {
                    // Get country ID by code
                    $CountryCache =& get_CountryCache();
                    if ($Country =& $CountryCache->get_by_name($comment['comment_IP_country'], false)) {
                        $comment_IP_country = $Country->ID;
                    }
                }
                $Comment = new Comment();
                $Comment->item_ID = $post_ID;
                $Comment->set('post_ID', $post_ID);
                if (!empty($comment_parent_ID)) {
                    $Comment->set('in_reply_to_cmt_ID', $comment_parent_ID);
                }
                $Comment->set('date', $comment['comment_date']);
                if (!empty($comment_author_ID)) {
                    $Comment->set('author_ID', $comment_author_ID);
                }
                $Comment->set('author', evo_substr($comment['comment_author'], 0, 100));
                $Comment->set('author_IP', $comment['comment_author_IP']);
                $Comment->set('author_email', $comment['comment_author_email']);
                $Comment->set('content', $comment['comment_content']);
                if (empty($comment['comment_status'])) {
                    // If comment status is empty (the export of wordpress doesn't provide this field)
                    $Comment->set('status', $comment['comment_approved'] == '1' ? 'published' : 'draft');
                } else {
                    // Set status when we have predefined value
                    $Comment->set('status', $comment['comment_status']);
                }
                if (!empty($comment_IP_country)) {
                    // Country
                    $Comment->set('IP_ctry_ID', $comment_IP_country);
                }
                $Comment->set('rating', $comment['comment_rating']);
                $Comment->set('featured', $comment['comment_featured']);
                $Comment->set('nofollow', $comment['comment_nofollow']);
                $Comment->set('helpful_addvotes', $comment['comment_helpful_addvotes']);
                $Comment->set('helpful_countvotes', $comment['comment_helpful_countvotes']);
                $Comment->set('spam_addvotes', $comment['comment_spam_addvotes']);
                $Comment->set('spam_countvotes', $comment['comment_spam_countvotes']);
                $Comment->set('karma', $comment['comment_karma']);
                $Comment->set('spam_karma', $comment['comment_spam_karma']);
                $Comment->set('allow_msgform', $comment['comment_allow_msgform']);
                $Comment->set('notif_status', $comment['comment_notif_status']);
                $Comment->dbinsert();
                $comments_IDs[$comment['comment_id']] = $Comment->ID;
                $comments_count++;
            }
        }
        echo sprintf(T_('%d records'), $comments_count) . '<br />';
    }
    $DB->commit();
}
Example #6
0
/**
 * Prepare the 'In-skin editing'.
 *
 */
function init_inskin_editing()
{
    global $Blog, $edited_Item, $action, $form_action;
    global $item_tags, $item_title, $item_content;
    global $admin_url, $redirect_to, $advanced_edit_link;
    if (!$Blog->get_setting('in_skin_editing')) {
        // Redirect to the Back-office editing (setting is OFF)
        header_redirect($admin_url . '?ctrl=items&action=new&blog=' . $Blog->ID);
    }
    $tab_switch_params = 'blog=' . $Blog->ID;
    // Post ID, go from $_GET when we edit post from Front-office
    $post_ID = param('p', 'integer', 0);
    // Post ID, go from $_GET when we copy post from Front-office
    $copy_post_ID = param('cp', 'integer', 0);
    if ($post_ID > 0) {
        // Edit post
        global $post_extracats;
        $action = 'edit';
        $ItemCache =& get_ItemCache();
        $edited_Item = $ItemCache->get_by_ID($post_ID);
        check_categories_nosave($post_category, $post_extracats);
        $post_extracats = postcats_get_byID($post_ID);
        $redirect_to = url_add_param($admin_url, 'ctrl=items&filter=restore&blog=' . $Blog->ID . '&highlight=' . $edited_Item->ID, '&');
        $tab_switch_params .= '&amp;p=' . $edited_Item->ID;
    } elseif ($copy_post_ID > 0) {
        // Copy post
        global $localtimenow;
        $action = 'new';
        $ItemCache =& get_ItemCache();
        $edited_Item = $ItemCache->get_by_ID($copy_post_ID);
        $edited_Item_Blog = $edited_Item->get_Blog();
        $item_status = $edited_Item_Blog->get_allowed_item_status();
        $edited_Item->set('status', $item_status);
        $edited_Item->set('dateset', 0);
        // Date not explicitly set yet
        $edited_Item->set('issue_date', date('Y-m-d H:i:s', $localtimenow));
        modules_call_method('constructor_item', array('Item' => &$edited_Item));
        check_categories_nosave($post_category, $post_extracats);
        $redirect_to = url_add_param($admin_url, 'ctrl=items&filter=restore&blog=' . $Blog->ID, '&');
    } elseif (empty($action)) {
        // Create new post (from Front-office)
        $action = 'new';
        load_class('items/model/_item.class.php', 'Item');
        $edited_Item = new Item();
        $def_status = get_highest_publish_status('post', $Blog->ID, false);
        $edited_Item->set('status', $def_status);
        check_categories_nosave($post_category, $post_extracats);
        $edited_Item->set('main_cat_ID', $Blog->get_default_cat_ID());
        // Set default locations from current user
        $edited_Item->set_creator_location('country');
        $edited_Item->set_creator_location('region');
        $edited_Item->set_creator_location('subregion');
        $edited_Item->set_creator_location('city');
        // Set object params:
        $edited_Item->load_from_Request(false, true);
        $redirect_to = url_add_param($admin_url, 'ctrl=items&filter=restore&blog=' . $Blog->ID, '&');
    }
    // Used in the edit form:
    // We never allow HTML in titles, so we always encode and decode special chars.
    $item_title = htmlspecialchars_decode($edited_Item->title);
    if ($Blog->get_setting('allow_html_post')) {
        // HTML is allowed for this post, we have HTML in the DB and we can edit it:
        $item_content = $edited_Item->content;
    } else {
        // HTML is disallowed for this post, content is encoded in DB and we need to decode it for editing:
        $item_content = htmlspecialchars_decode($edited_Item->content);
    }
    // Format content for editing, if we were not already in editing...
    $Plugins_admin =& get_Plugins_admin();
    $edited_Item->load_Blog();
    $params = array('object_type' => 'Item', 'object_Blog' => &$edited_Item->Blog);
    $Plugins_admin->unfilter_contents($item_title, $item_content, $edited_Item->get_renderers_validated(), $params);
    $item_tags = implode(', ', $edited_Item->get_tags());
    // Get an url for a link 'Go to advanced edit screen'
    $mode_editing = param('mode_editing', 'string', 'expert');
    $entries = get_item_edit_modes($Blog->ID, $action, $admin_url, $tab_switch_params);
    $advanced_edit_link = $entries[$mode_editing];
    $form_action = get_samedomain_htsrv_url() . 'item_edit.php';
}
/**
 * Read messages from server and create posts
 *
 * @param resource $mbox created by pbm_connect() (by reference)
 * @param integer the number of messages to process
 * @return boolean true on success
 */
function pbm_process_messages(&$mbox, $limit)
{
    global $Settings;
    global $pbm_item_files, $pbm_messages, $pbm_items, $post_cntr, $del_cntr, $is_cron_mode;
    // No execution time limit
    set_max_execution_time(0);
    // Are we in test mode?
    $test_mode_on = $Settings->get('eblog_test_mode');
    $post_cntr = 0;
    $del_cntr = 0;
    for ($index = 1; $index <= $limit; $index++) {
        pbm_msg('<hr /><h3>Processing message #' . $index . ':</h3>');
        $strbody = '';
        $hasAttachment = false;
        $hasRelated = false;
        $pbm_item_files = array();
        // reset the value for each new Item
        // Save email to hard drive, otherwise attachments may take a lot of RAM
        if (!($tmpMIME = tempnam(sys_get_temp_dir(), 'b2evoMail'))) {
            pbm_msg(T_('Could not create temporary file.'), true);
            continue;
        }
        imap_savebody($mbox, $tmpMIME, $index);
        // Create random temp directory for message parts
        $tmpDirMIME = pbm_tempdir(sys_get_temp_dir(), 'b2evo_');
        $mimeParser = new mime_parser_class();
        $mimeParser->mbox = 0;
        // Set to 0 for parsing a single message file
        $mimeParser->decode_headers = 1;
        $mimeParser->ignore_syntax_errors = 1;
        $mimeParser->extract_addresses = 0;
        $MIMEparameters = array('File' => $tmpMIME, 'SaveBody' => $tmpDirMIME, 'SkipBody' => 1);
        if (!$mimeParser->Decode($MIMEparameters, $decodedMIME)) {
            pbm_msg(sprintf('MIME message decoding error: %s at position %d.', $mimeParser->error, $mimeParser->error_position), true);
            rmdir_r($tmpDirMIME);
            unlink($tmpMIME);
            continue;
        } else {
            pbm_msg('MIME message decoding successful');
            if (!$mimeParser->Analyze($decodedMIME[0], $parsedMIME)) {
                pbm_msg(sprintf('MIME message analyse error: %s', $mimeParser->error), true);
                rmdir_r($tmpDirMIME);
                unlink($tmpMIME);
                continue;
            }
            // Get message $subject and $post_date from headers (by reference)
            if (!pbm_process_header($parsedMIME, $subject, $post_date)) {
                // Couldn't process message headers
                rmdir_r($tmpDirMIME);
                unlink($tmpMIME);
                continue;
            }
            // TODO: handle type == "message" recursively
            // sam2kb> For some reason imap_qprint() demages HTML text... needs more testing
            if ($parsedMIME['Type'] == 'html') {
                // Mail is HTML
                if ($Settings->get('eblog_html_enabled')) {
                    // HTML posting enabled
                    pbm_msg('HTML message part saved as ' . $parsedMIME['DataFile']);
                    $html_body = file_get_contents($parsedMIME['DataFile']);
                }
                foreach ($parsedMIME['Alternative'] as $alternative) {
                    // First try to get HTML alternative (when possible)
                    if ($alternative['Type'] == 'html' && $Settings->get('eblog_html_enabled')) {
                        // HTML text
                        pbm_msg('HTML alternative message part saved as ' . $alternative['DataFile']);
                        // sam2kb> TODO: we may need to use $html_body here instead
                        $strbody = file_get_contents($alternative['DataFile']);
                        break;
                        // stop after first alternative
                    } elseif ($alternative['Type'] == 'text') {
                        // Plain text
                        pbm_msg('Text alternative message part saved as ' . $alternative['DataFile']);
                        $strbody = imap_qprint(file_get_contents($alternative['DataFile']));
                        break;
                        // stop after first alternative
                    }
                }
            } elseif ($parsedMIME['Type'] == 'text') {
                // Mail is plain text
                pbm_msg('Plain-text message part saved as ' . $parsedMIME['DataFile']);
                $strbody = imap_qprint(file_get_contents($parsedMIME['DataFile']));
            }
            // Check for attachments
            if (!empty($parsedMIME['Attachments'])) {
                $hasAttachment = true;
                foreach ($parsedMIME['Attachments'] as $file) {
                    pbm_msg('Attachment: ' . $file['FileName'] . ' stored as ' . $file['DataFile']);
                }
            }
            // Check for inline images
            if (!empty($parsedMIME['Related'])) {
                $hasRelated = true;
                foreach ($parsedMIME['Related'] as $file) {
                    pbm_msg('Related file with content ID: ' . $file['ContentID'] . ' stored as ' . $file['DataFile']);
                }
            }
            if (count($mimeParser->warnings) > 0) {
                pbm_msg(sprintf('<h4>%d warnings during decode:</h4>', count($mimeParser->warnings)));
                foreach ($mimeParser->warnings as $k => $v) {
                    pbm_msg('Warning: ' . $v . ' at position ' . $k);
                }
            }
        }
        unlink($tmpMIME);
        if (empty($html_body)) {
            // Plain text message
            pbm_msg('Message type: TEXT');
            pbm_msg('Message body: <pre style="font-size:10px">' . htmlspecialchars($strbody) . '</pre>');
            // Process body. First fix different line-endings (dos, mac, unix), remove double newlines
            $content = str_replace(array("\r", "\n\n"), "\n", trim($strbody));
            // First see if there's an <auth> tag with login and password
            if (($auth = pbm_get_auth_tag($content)) === false) {
                // No <auth> tag, let's detect legacy "username:password" on the first line
                $a_body = explode("\n", $content, 2);
                // tblue> splitting only into 2 parts allows colons in the user PW
                // Note: login and password cannot include '<' !
                $auth = explode(':', strip_tags($a_body[0]), 2);
                // Drop the first line with username and password
                $content = $a_body[1];
            }
        } else {
            // HTML message
            pbm_msg('Message type: HTML');
            if (($parsed_message = pbm_prepare_html_message($html_body)) === false) {
                // No 'auth' tag provided, skip to the next message
                rmdir_r($tmpDirMIME);
                continue;
            }
            list($auth, $content) = $parsed_message;
        }
        // TODO: dh> should the password really get trimmed here?!
        $user_pass = isset($auth[1]) ? trim(remove_magic_quotes($auth[1])) : NULL;
        $user_login = trim(evo_strtolower(remove_magic_quotes($auth[0])));
        if (empty($user_login) || empty($user_pass)) {
            pbm_msg(sprintf(T_('Please add username and password in message body in format %s.'), '"&lt;auth&gt;username:password&lt;/auth&gt;"'), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        // Authenticate user
        pbm_msg('Authenticating user: &laquo;' . $user_login . '&raquo;');
        $pbmUser =& pbm_validate_user_password($user_login, $user_pass);
        if (!$pbmUser) {
            pbm_msg(sprintf(T_('Authentication failed for user &laquo;%s&raquo;'), htmlspecialchars($user_login)), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        $pbmUser->get_Group();
        // Load group
        if (!empty($is_cron_mode)) {
            // Assign current User if we are in cron mode. This is needed in order to check user permissions
            global $current_User;
            $current_User = duplicate($pbmUser);
        }
        // Activate User's locale
        locale_activate($pbmUser->get('locale'));
        pbm_msg('<b class="green">Success</b>');
        if ($post_categories = xmlrpc_getpostcategories($content)) {
            $main_cat_ID = array_shift($post_categories);
            $extra_cat_IDs = $post_categories;
            pbm_msg('Extra categories: ' . implode(', ', $extra_cat_IDs));
        } else {
            $main_cat_ID = $Settings->get('eblog_default_category');
            $extra_cat_IDs = array();
        }
        pbm_msg('Main category ID: ' . $main_cat_ID);
        $ChapterCache =& get_ChapterCache();
        $pbmChapter =& $ChapterCache->get_by_ID($main_cat_ID, false, false);
        if (empty($pbmChapter)) {
            pbm_msg(sprintf(T_('Requested category %s does not exist!'), $main_cat_ID), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        $blog_ID = $pbmChapter->blog_ID;
        pbm_msg('Blog ID: ' . $blog_ID);
        $BlogCache =& get_BlogCache();
        $pbmBlog =& $BlogCache->get_by_ID($blog_ID, false, false);
        if (empty($pbmBlog)) {
            pbm_msg(sprintf(T_('Requested blog %s does not exist!'), $blog_ID), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        // Check permission:
        pbm_msg(sprintf('Checking permissions for user &laquo;%s&raquo; to post to Blog #%d', $user_login, $blog_ID));
        if (!$pbmUser->check_perm('blog_post!published', 'edit', false, $blog_ID)) {
            pbm_msg(T_('Permission denied.'), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        if (($hasAttachment || $hasRelated) && !$pbmUser->check_perm('files', 'add', false, $blog_ID)) {
            pbm_msg(T_('You have no permission to add/upload files.'), true);
            rmdir_r($tmpDirMIME);
            continue;
        }
        pbm_msg('<b class="green">Success</b>');
        // Remove content after terminator
        $eblog_terminator = $Settings->get('eblog_body_terminator');
        if (!empty($eblog_terminator) && ($os_terminator = evo_strpos($content, $eblog_terminator)) !== false) {
            $content = evo_substr($content, 0, $os_terminator);
        }
        $post_title = pbm_get_post_title($content, $subject);
        // Remove 'title' and 'category' tags
        $content = xmlrpc_removepostdata($content);
        // Remove <br> tags from string start and end
        // We do it here because there might be extra <br> left after deletion of <auth>, <category> and <title> tags
        $content = preg_replace(array('~^(\\s*<br[\\s/]*>\\s*){1,}~i', '~(\\s*<br[\\s/]*>\\s*){1,}$~i'), '', $content);
        if ($hasAttachment || $hasRelated) {
            // Handle attachments
            if (isset($GLOBALS['files_Module'])) {
                if ($mediadir = $pbmBlog->get_media_dir()) {
                    if ($hasAttachment) {
                        pbm_process_attachments($content, $parsedMIME['Attachments'], $mediadir, $pbmBlog->get_media_url(), $Settings->get('eblog_add_imgtag'), 'attach');
                    }
                    if ($hasRelated) {
                        pbm_process_attachments($content, $parsedMIME['Related'], $mediadir, $pbmBlog->get_media_url(), true, 'related');
                    }
                } else {
                    pbm_msg(T_('Unable to access media directory. No attachments processed.'), true);
                }
            } else {
                pbm_msg(T_('Files module is disabled or missing!'), true);
            }
        }
        // CHECK and FORMAT content
        global $Plugins;
        $renderer_params = array('Blog' => &$pbmBlog, 'setting_name' => 'coll_apply_rendering');
        $renderers = $Plugins->validate_renderer_list($Settings->get('eblog_renderers'), $renderer_params);
        pbm_msg('Applying the following text renderers: ' . implode(', ', $renderers));
        // Do some optional filtering on the content
        // Typically stuff that will help the content to validate
        // Useful for code display
        // Will probably be used for validation also
        $Plugins_admin =& get_Plugins_admin();
        $params = array('object_type' => 'Item', 'object_Blog' => &$pbmBlog);
        $Plugins_admin->filter_contents($post_title, $content, $renderers, $params);
        pbm_msg('Filtered post content: <pre style="font-size:10px">' . htmlspecialchars($content) . '</pre>');
        $context = $Settings->get('eblog_html_tag_limit') ? 'commenting' : 'posting';
        $post_title = check_html_sanity($post_title, $context, $pbmUser);
        $content = check_html_sanity($content, $context, $pbmUser);
        global $Messages;
        if ($Messages->has_errors()) {
            // Make it easier for user to find and correct the errors
            pbm_msg("\n" . sprintf(T_('Processing message: %s'), $post_title), true);
            pbm_msg($Messages->get_string(T_('Cannot post, please correct these errors:'), 'error'), true);
            $Messages->clear();
            rmdir_r($tmpDirMIME);
            continue;
        }
        if ($test_mode_on) {
            // Test mode
            pbm_msg('<b class="green">It looks like the post can be successfully saved in the database. However we will not do it in test mode.</b>');
        } else {
            load_class('items/model/_item.class.php', 'Item');
            global $pbm_items, $DB, $localtimenow;
            $post_status = 'published';
            pbm_msg(sprintf('<h4>Saving item "%s" in the database</h4>', $post_title));
            // INSERT NEW POST INTO DB:
            $edited_Item = new Item();
            $edited_Item->set_creator_User($pbmUser);
            $edited_Item->set($edited_Item->lasteditor_field, $pbmUser->ID);
            $edited_Item->set('title', $post_title);
            $edited_Item->set('content', $content);
            $edited_Item->set('datestart', $post_date);
            $edited_Item->set('datemodified', date('Y-m-d H:i:s', $localtimenow));
            $edited_Item->set('main_cat_ID', $main_cat_ID);
            $edited_Item->set('extra_cat_IDs', $extra_cat_IDs);
            $edited_Item->set('status', $post_status);
            $edited_Item->set('locale', $pbmUser->locale);
            $edited_Item->set('renderers', $renderers);
            // INSERT INTO DB:
            $edited_Item->dbinsert('through_email');
            pbm_msg(sprintf('Item created?: ' . (isset($edited_Item->ID) ? 'yes' : 'no')));
            // Execute or schedule notifications & pings:
            $edited_Item->handle_post_processing(true);
            if (!empty($pbm_item_files)) {
                // Attach files
                $FileCache =& get_FileCache();
                $order = 1;
                foreach ($pbm_item_files as $filename) {
                    pbm_msg(sprintf('Saving file "%s" in the database', $filename));
                    $pbmFile =& $FileCache->get_by_root_and_path('collection', $pbmBlog->ID, $filename);
                    $pbmFile->meta = 'notfound';
                    // Save time and don't try to load meta from DB, it's not there anyway
                    $pbmFile->dbsave();
                    pbm_msg(sprintf('File saved?: ' . (isset($pbmFile->ID) ? 'yes' : 'no')));
                    pbm_msg(sprintf('Attaching file "%s" to the post', $filename));
                    // Let's make the link!
                    $pbmLink = new Link();
                    $pbmLink->set('itm_ID', $edited_Item->ID);
                    $pbmLink->set('file_ID', $pbmFile->ID);
                    $pbmLink->set('position', 'aftermore');
                    $pbmLink->set('order', $order++);
                    $pbmLink->dbinsert();
                    pbm_msg(sprintf('File attached?: ' . (isset($pbmLink->ID) ? 'yes' : 'no')));
                }
            }
            // Save posted items sorted by author user for reports
            $pbm_items['user_' . $pbmUser->ID][] = $edited_Item;
            ++$post_cntr;
        }
        pbm_msg('Message posting successful');
        // Delete temporary directory
        rmdir_r($tmpDirMIME);
        if (!$test_mode_on && $Settings->get('eblog_delete_emails')) {
            pbm_msg('Marking message for deletion from inbox: ' . $index);
            imap_delete($mbox, $index);
            ++$del_cntr;
        }
    }
    // Expunge messages marked for deletion
    imap_expunge($mbox);
    return true;
}
Example #8
0
      */
     $AdminUI->title_titlearea = T_('Comment recycle bins');
     /*
      * Add sub menu entries:
      * We do this here instead of _header because we need to include all filter params into regenerate_url()
      */
     attach_browse_tabs(false);
     $AdminUI->set_path('collections', 'comments');
     $AdminUI->breadcrumbpath_add(T_('Comment recycle bins'), '?ctrl=comments&amp;action=emptytrash');
     break;
 case 'elevate':
     // Check that this action request is not a CSRF hacked request:
     $Session->assert_received_crumb('comment');
     $item_content = $edited_Comment->get_author_name() . ' ' . T_('wrote') . ': <blockquote>' . $edited_Comment->get_content() . '</blockquote>';
     $new_Item = new Item();
     $new_Item->set('status', 'draft');
     $new_Item->set_creator_by_login($current_User->login);
     $new_Item->set('main_cat_ID', $Blog->get_default_cat_ID());
     $new_Item->set('title', T_('Elevated from comment'));
     $new_Item->set('content', $item_content);
     if (!$new_Item->dbinsert()) {
         $Messages->add(T_('Unable to create the new post!'), 'error');
         break;
     }
     // Deprecate the comment after elevating
     $edited_Comment->set('status', 'deprecated');
     $edited_Comment->dbupdate();
     // Move all child comments to new created post
     move_child_comments_to_item($edited_Comment->ID, $new_Item->ID);
     header_redirect(url_add_param($admin_url, 'ctrl=items&blog=' . $blog . '&action=edit&p=' . $new_Item->ID, '&'));
     break;
Example #9
0
 			if( $post_content != $old_content )
 			{
 				echo '<p style="color:darkblue;border:1px dashed orange;">'.htmlspecialchars($old_content).'</p>
 				converted img-links to: <p style="color:darkblue;border:1px dashed orange;">'.htmlspecialchars($post_content).'</p>';
 			}
 		}*/
 debug_dump($post_catids, 'post_extracats');
 $post_category = array_shift($post_catids);
 debug_dump($post_category, 'post_category');
 debug_dump($post_categories, 'post_categories');
 debug_dump($post_author, 'post_author');
 debug_dump(isset($item_Author->ID) ? $item_Author->ID : 'NULL (simulating)', 'item_Author->ID');
 if (!$simulate) {
     $edited_Item = new Item();
     $edited_Item->set_creator_User($item_Author);
     $edited_Item->set('title', $post_title);
     $edited_Item->set('content', $post_content);
     $edited_Item->set('datestart', $post_date);
     $edited_Item->set('main_cat_ID', $post_category);
     $edited_Item->set('extra_cat_IDs', $post_catids);
     $edited_Item->set('status', $post_status);
     $edited_Item->set('locale', $post_locale);
     $edited_Item->set('notifications_status', 'finished');
     $edited_Item->set('comment_status', $comment_status);
     $edited_Item->set_renderers($post_renderers);
     $edited_Item->dbinsert();
     $post_ID = $edited_Item->ID;
 }
 $message .= '<li><span style="color:green">Imported successfully</span><ul><li>main category: <span style="color:#09c">' . get_catname($post_category) . '</span></li>';
 if (count($post_catids)) {
     $message .= '<li>extra categories: <span style="color:#09c">' . preg_replace('/(\\d+)/e', "get_catname('\\1')", implode(', ', $post_catids)) . '</span></li>';
Example #10
0
 if (empty($item_status)) {
     $Messages->add(T_('Sorry, you have no permission to post into this blog.'), 'error');
     break;
 }
 // make sure we have loaded metas for all files in selection!
 $selected_Filelist->load_meta();
 // Ready to create post(s):
 load_class('items/model/_item.class.php', 'Item');
 switch ($action) {
     case 'make_post':
         // SINGLE POST:
         // Stop a request from the blocked IP addresses or Domains
         antispam_block_request();
         // Create a post:
         $edited_Item = new Item();
         $edited_Item->set('status', $item_status);
         $edited_Item->set('main_cat_ID', $Blog->get_default_cat_ID());
         $l_File =& $selected_Filelist->get_next();
         $title = $l_File->get('title');
         if (empty($title)) {
             $title = $l_File->get('name');
         }
         $edited_Item->set('title', $title);
         $DB->begin('SERIALIZABLE');
         // INSERT NEW POST INTO DB:
         if ($edited_Item->dbinsert()) {
             $order = 1;
             $LinkOwner = new LinkItem($edited_Item);
             do {
                 // LOOP through files:
                 // echo '<br>file meta: '.$l_File->meta;
Example #11
0
/**
 * Import WordPress data from XML file into b2evolution database
 */
function wpxml_import()
{
    global $DB, $tableprefix;
    // Load classes:
    load_class('regional/model/_country.class.php', 'Country');
    load_class('regional/model/_region.class.php', 'Region');
    load_class('regional/model/_subregion.class.php', 'Subregion');
    load_class('regional/model/_city.class.php', 'City');
    // Set Blog from request blog ID
    $wp_blog_ID = param('wp_blog_ID', 'integer', 0);
    $BlogCache =& get_BlogCache();
    $wp_Blog =& $BlogCache->get_by_ID($wp_blog_ID);
    // The import type ( replace | append )
    $import_type = param('import_type', 'string', 'replace');
    // Should we delete files on 'replace' mode?
    $delete_files = param('delete_files', 'integer', 0);
    $XML_file_path = get_param('wp_file');
    $XML_file_name = basename($XML_file_path);
    if (preg_match('/\\.(xml|txt)$/i', $XML_file_name)) {
        // XML format
        // Check WordPress XML file
        if (!wpxml_check_xml_file($XML_file_path)) {
            // Errors are in XML file
            return;
        }
        // Use this folder to upload files if they exist in subfolder "/b2evolution_export_files"
        $attached_files_path = dirname($XML_file_path);
    } else {
        if (preg_match('/\\.zip$/i', $XML_file_name)) {
            // ZIP format
            // Extract ZIP and check WordPress XML file
            global $media_path;
            $ZIP_folder_path = $media_path . 'import/temp-' . md5(rand());
            if (!unpack_archive($XML_file_path, $ZIP_folder_path, true, $XML_file_name)) {
                // Errors on unpack ZIP file
                return;
            }
            // Find valid XML file in ZIP package
            $ZIP_files_list = scandir($ZIP_folder_path);
            $xml_exists_in_zip = false;
            foreach ($ZIP_files_list as $ZIP_file) {
                if (preg_match('/\\.(xml|txt)$/i', $ZIP_file)) {
                    // XML file is found in ZIP package
                    if (wpxml_check_xml_file($ZIP_folder_path . '/' . $ZIP_file)) {
                        // XML file is valid
                        $XML_file_path = $ZIP_folder_path . '/' . $ZIP_file;
                        $xml_exists_in_zip = true;
                        break;
                    }
                }
            }
            if (!$xml_exists_in_zip) {
                // No XML is detected in ZIP package
                echo '<p style="color:red">' . T_('XML file is not detected in your ZIP package.') . '</p>';
                // Delete temporary folder that contains the files from extracted ZIP package
                rmdir_r($ZIP_folder_path);
                return;
            }
            // Use this folder to upload files, $ZIP_folder_path must be deleted after import
            $attached_files_path = $ZIP_folder_path;
        } else {
            // Unrecognized extension
            echo '<p style="color:red">' . sprintf(T_('%s has an unrecognized extension.'), '<b>' . $xml_file['name'] . '</b>') . '</p>';
            return;
        }
    }
    // Parse WordPress XML file into array
    $xml_data = wpxml_parser($XML_file_path);
    $DB->begin();
    if ($import_type == 'replace') {
        // Remove data from selected blog
        // Get existing categories
        $SQL = new SQL();
        $SQL->SELECT('cat_ID');
        $SQL->FROM('T_categories');
        $SQL->WHERE('cat_blog_ID = ' . $DB->quote($wp_blog_ID));
        $old_categories = $DB->get_col($SQL->get());
        if (!empty($old_categories)) {
            // Get existing posts
            $SQL = new SQL();
            $SQL->SELECT('post_ID');
            $SQL->FROM('T_items__item');
            $SQL->WHERE('post_main_cat_ID IN ( ' . implode(', ', $old_categories) . ' )');
            $old_posts = $DB->get_col($SQL->get());
        }
        echo T_('Removing the comments... ');
        evo_flush();
        if (!empty($old_posts)) {
            $SQL = new SQL();
            $SQL->SELECT('comment_ID');
            $SQL->FROM('T_comments');
            $SQL->WHERE('comment_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
            $old_comments = $DB->get_col($SQL->get());
            $DB->query('DELETE FROM T_comments WHERE comment_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
            if (!empty($old_comments)) {
                $DB->query('DELETE FROM T_comments__votes WHERE cmvt_cmt_ID IN ( ' . implode(', ', $old_comments) . ' )');
                $DB->query('DELETE FROM T_links WHERE link_cmt_ID IN ( ' . implode(', ', $old_comments) . ' )');
            }
        }
        echo T_('OK') . '<br />';
        echo T_('Removing the posts... ');
        evo_flush();
        if (!empty($old_categories)) {
            $DB->query('DELETE FROM T_items__item WHERE post_main_cat_ID IN ( ' . implode(', ', $old_categories) . ' )');
            if (!empty($old_posts)) {
                // Remove the post's data from related tables
                if ($delete_files) {
                    // Get the file IDs that should be deleted from hard drive
                    $SQL = new SQL();
                    $SQL->SELECT('DISTINCT link_file_ID');
                    $SQL->FROM('T_links');
                    $SQL->WHERE('link_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                    $deleted_file_IDs = $DB->get_col($SQL->get());
                }
                $DB->query('DELETE FROM T_items__item_settings WHERE iset_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__prerendering WHERE itpr_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__subscriptions WHERE isub_item_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_items__version WHERE iver_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_postcats WHERE postcat_post_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_slug WHERE slug_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE l, lv FROM T_links AS l
											 LEFT JOIN T_links__vote AS lv ON lv.lvot_link_ID = l.link_ID
											WHERE l.link_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
                $DB->query('DELETE FROM T_users__postreadstatus WHERE uprs_post_ID IN ( ' . implode(', ', $old_posts) . ' )');
            }
        }
        echo T_('OK') . '<br />';
        echo T_('Removing the categories... ');
        evo_flush();
        $DB->query('DELETE FROM T_categories WHERE cat_blog_ID = ' . $DB->quote($wp_blog_ID));
        echo T_('OK') . '<br />';
        echo T_('Removing the tags that are no longer used... ');
        evo_flush();
        if (!empty($old_posts)) {
            // Remove the tags
            // Get tags from selected blog
            $SQL = new SQL();
            $SQL->SELECT('itag_tag_ID');
            $SQL->FROM('T_items__itemtag');
            $SQL->WHERE('itag_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
            $old_tags_this_blog = array_unique($DB->get_col($SQL->get()));
            if (!empty($old_tags_this_blog)) {
                // Get tags from other blogs
                $SQL = new SQL();
                $SQL->SELECT('itag_tag_ID');
                $SQL->FROM('T_items__itemtag');
                $SQL->WHERE('itag_itm_ID NOT IN ( ' . implode(', ', $old_posts) . ' )');
                $old_tags_other_blogs = array_unique($DB->get_col($SQL->get()));
                $old_tags_other_blogs_sql = !empty($old_tags_other_blogs) ? ' AND tag_ID NOT IN ( ' . implode(', ', $old_tags_other_blogs) . ' )' : '';
                // Remove the tags that are no longer used
                $DB->query('DELETE FROM T_items__tag
					WHERE tag_ID IN ( ' . implode(', ', $old_tags_this_blog) . ' )' . $old_tags_other_blogs_sql);
            }
            // Remove the links of tags with posts
            $DB->query('DELETE FROM T_items__itemtag WHERE itag_itm_ID IN ( ' . implode(', ', $old_posts) . ' )');
        }
        echo T_('OK') . '<br />';
        if ($delete_files) {
            // Delete the files
            echo T_('Removing the files... ');
            if (!empty($deleted_file_IDs)) {
                // Commit the DB changes before files deleting
                $DB->commit();
                // Get the deleted file IDs that are linked to other objects
                $SQL = new SQL();
                $SQL->SELECT('DISTINCT link_file_ID');
                $SQL->FROM('T_links');
                $SQL->WHERE('link_file_ID IN ( ' . implode(', ', $deleted_file_IDs) . ' )');
                $linked_file_IDs = $DB->get_col($SQL->get());
                // We can delete only the files that are NOT linked to other objects
                $deleted_file_IDs = array_diff($deleted_file_IDs, $linked_file_IDs);
                $FileCache =& get_FileCache();
                foreach ($deleted_file_IDs as $deleted_file_ID) {
                    if (!($deleted_File =& $FileCache->get_by_ID($deleted_file_ID, false, false))) {
                        // Incorrect file ID
                        echo '<p class="red">' . sprintf(T_('No file #%s found in DB. It cannot be deleted.'), $deleted_file_ID) . '</p>';
                    }
                    if (!$deleted_File->unlink()) {
                        // No permission to delete file
                        echo '<p class="red">' . sprintf(T_('Could not delete the file &laquo;%s&raquo;.'), $deleted_File->get_full_path()) . '</p>';
                    }
                    // Clear cache to save memory
                    $FileCache->clear();
                }
                // Start new transaction for the data inserting
                $DB->begin();
            }
            echo T_('OK') . '<br />';
        }
        echo '<br />';
    }
    /* Import authors */
    $authors = array();
    $authors_IDs = array();
    if (isset($xml_data['authors']) && count($xml_data['authors']) > 0) {
        global $Settings, $UserSettings;
        echo T_('Importing the users... ');
        evo_flush();
        // Get existing users
        $SQL = new SQL();
        $SQL->SELECT('user_login, user_ID');
        $SQL->FROM('T_users');
        $existing_users = $DB->get_assoc($SQL->get());
        $authors_count = 0;
        foreach ($xml_data['authors'] as $author) {
            if (empty($existing_users[(string) $author['author_login']])) {
                // Insert new user into DB if User doesn't exist with current login name
                $GroupCache =& get_GroupCache();
                if (!empty($author['author_group'])) {
                    // Set user group from xml data
                    if (($UserGroup =& $GroupCache->get_by_name($author['author_group'], false)) === false) {
                        // If user's group doesn't exist yet, we should create new
                        $UserGroup = new Group();
                        $UserGroup->set('name', $author['author_group']);
                        $UserGroup->dbinsert();
                    }
                } else {
                    // Set default user group is it is not defined in xml
                    if (($UserGroup =& $GroupCache->get_by_name('Normal Users', false)) === false) {
                        // Exit from import of users, because we cannot set default user group
                        break;
                    }
                }
                unset($author_created_from_country);
                if (!empty($author['author_created_from_country'])) {
                    // Get country ID from DB by code
                    $CountryCache =& get_CountryCache();
                    if (($Country =& $CountryCache->get_by_name($author['author_created_from_country'], false)) !== false) {
                        $author_created_from_country = $Country->ID;
                    }
                }
                // Get regional IDs by their names
                $author_regions = wp_get_regional_data($author['author_country'], $author['author_region'], $author['author_subregion'], $author['author_city']);
                $User = new User();
                $User->set('login', $author['author_login']);
                $User->set('email', $author['author_email']);
                $User->set('firstname', $author['author_first_name']);
                $User->set('lastname', $author['author_last_name']);
                $User->set('pass', $author['author_pass']);
                $User->set_Group($UserGroup);
                $User->set('status', !empty($author['author_status']) ? $author['author_status'] : 'autoactivated');
                $User->set('nickname', $author['author_nickname']);
                $User->set('url', $author['author_url']);
                $User->set('level', $author['author_level']);
                $User->set('locale', $author['author_locale']);
                $User->set('gender', $author['author_gender'] == 'female' ? 'F' : ($author['author_gender'] == 'male' ? 'M' : ''));
                if ($author['author_age_min'] > 0) {
                    $User->set('age_min', $author['author_age_min']);
                }
                if ($author['author_age_max'] > 0) {
                    $User->set('age_max', $author['author_age_max']);
                }
                if (isset($author_created_from_country)) {
                    // User was created from this country
                    $User->set('reg_ctry_ID', $author_created_from_country);
                }
                if (!empty($author_regions['country'])) {
                    // Country
                    $User->set('ctry_ID', $author_regions['country']);
                    if (!empty($author_regions['region'])) {
                        // Region
                        $User->set('rgn_ID', $author_regions['region']);
                        if (!empty($author_regions['subregion'])) {
                            // Subregion
                            $User->set('subrg_ID', $author_regions['subregion']);
                        }
                        if (!empty($author_regions['city'])) {
                            // City
                            $User->set('city_ID', $author_regions['city']);
                        }
                    }
                }
                $User->set('source', $author['author_source']);
                $User->set_datecreated(empty($author['author_created_ts']) ? mktime() : intval($author['author_created_ts']));
                $User->set('lastseen_ts', empty($author['author_lastseen_ts']) ? NULL : $author['author_lastseen_ts'], true);
                $User->set('profileupdate_date', empty($author['author_profileupdate_date']) ? date('Y-m-d', mktime()) : $author['author_profileupdate_date']);
                $User->dbinsert();
                $user_ID = $User->ID;
                if (!empty($user_ID) && !empty($author['author_created_fromIPv4'])) {
                    $UserSettings->set('created_fromIPv4', ip2int($author['author_created_fromIPv4']), $user_ID);
                }
                $authors_count++;
            } else {
                // Get ID of existing user
                $user_ID = $existing_users[(string) $author['author_login']];
            }
            // Save user ID of current author
            $authors[$author['author_login']] = (string) $user_ID;
            $authors_IDs[$author['author_id']] = (string) $user_ID;
        }
        $UserSettings->dbupdate();
        echo sprintf(T_('%d records'), $authors_count) . '<br />';
    }
    /* Import files, Copy them all to media folder */
    if (isset($xml_data['files']) && count($xml_data['files']) > 0) {
        echo T_('Importing the files... ');
        evo_flush();
        if (!file_exists($attached_files_path . '/b2evolution_export_files')) {
            // Display an error if files are attached but folder doesn't exist
            echo '<p class="red">' . sprintf(T_('No folder %s found. It must exists to import the attached files properly.'), '<b>' . $attached_files_path . '/b2evolution_export_files' . '</b>') . '</p>';
        } else {
            // The attached files are located in this subfolder
            $subfolder_path = '/b2evolution_export_files';
            $files_count = 0;
            $files = array();
            foreach ($xml_data['files'] as $file) {
                switch ($file['file_root_type']) {
                    case 'shared':
                        // Shared files
                        $file_root_ID = 0;
                        break;
                    case 'user':
                        // User's files
                        if (isset($authors_IDs[$file['file_root_ID']])) {
                            // If owner of this file exists in our DB
                            $file_root_ID = $authors_IDs[$file['file_root_ID']];
                            break;
                        }
                        // Otherwise we should upload this file into blog's folder:
                    // Otherwise we should upload this file into blog's folder:
                    default:
                        // 'collection', 'absolute', 'skins'
                        // The files from other blogs and from other places must be moved in the folder of the current blog
                        $file['file_root_type'] = 'collection';
                        $file_root_ID = $wp_blog_ID;
                        break;
                }
                // Get FileRoot by type and ID
                $FileRootCache =& get_FileRootCache();
                $FileRoot =& $FileRootCache->get_by_type_and_ID($file['file_root_type'], $file_root_ID);
                if (is_dir($attached_files_path . $subfolder_path . '/' . $file['zip_path'] . $file['file_path'])) {
                    // Folder
                    $file_destination_path = $FileRoot->ads_path;
                } else {
                    // File
                    $file_destination_path = $FileRoot->ads_path . $file['file_path'];
                }
                if (!file_exists($attached_files_path . $subfolder_path . '/' . $file['zip_path'] . $file['file_path'])) {
                    // File doesn't exist
                    echo '<p class="orange">' . sprintf(T_('Unable to copy file %s, because it does not exist.'), '<b>' . $file['zip_path'] . $file['file_path'] . '</b>') . '</p>';
                    // Skip it
                    continue;
                } else {
                    if (!copy_r($attached_files_path . $subfolder_path . '/' . $file['zip_path'] . $file['file_path'], $file_destination_path)) {
                        // No permission to copy to this folder
                        if (is_dir($attached_files_path . $subfolder_path . '/' . $file['zip_path'] . $file['file_path'])) {
                            // Folder
                            echo '<p class="orange">' . sprintf(T_('Unable to copy folder %s to %s. Please, check the permissions assigned to this folder.'), '<b>' . $file['zip_path'] . $file['file_path'] . '</b>', '<b>' . $file_destination_path . '</b>') . '</p>';
                        } else {
                            // File
                            echo '<p class="orange">' . sprintf(T_('Unable to copy file %s to %s. Please, check the permissions assigned to this folder.'), '<b>' . $file['zip_path'] . $file['file_path'] . '</b>', '<b>' . $file_destination_path . '</b>') . '</p>';
                        }
                        // Skip it
                        continue;
                    }
                }
                // Create new File object, It will be linked to the items below
                $File = new File($file['file_root_type'], $file_root_ID, $file['file_path']);
                $File->set('title', $file['file_title']);
                $File->set('alt', $file['file_alt']);
                $File->set('desc', $file['file_desc']);
                $files[$file['file_ID']] = $File;
                $files_count++;
            }
            echo sprintf(T_('%d records'), $files_count) . '<br />';
            if (isset($ZIP_folder_path) && file_exists($ZIP_folder_path)) {
                // This folder was created only to extract files from ZIP package, Remove it now
                rmdir_r($ZIP_folder_path);
            }
        }
    }
    /* Import categories */
    $category_default = 0;
    load_class('chapters/model/_chapter.class.php', 'Chapter');
    // Get existing categories
    $SQL = new SQL();
    $SQL->SELECT('cat_urlname, cat_ID');
    $SQL->FROM('T_categories');
    $SQL->WHERE('cat_blog_ID = ' . $DB->quote($wp_blog_ID));
    $categories = $DB->get_assoc($SQL->get());
    if (isset($xml_data['categories']) && count($xml_data['categories']) > 0) {
        echo T_('Importing the categories... ');
        evo_flush();
        load_funcs('locales/_charset.funcs.php');
        $categories_count = 0;
        foreach ($xml_data['categories'] as $cat) {
            if (empty($categories[(string) $cat['category_nicename']])) {
                $Chapter = new Chapter(NULL, $wp_blog_ID);
                $Chapter->set('name', $cat['cat_name']);
                $Chapter->set('urlname', $cat['category_nicename']);
                $Chapter->set('description', $cat['category_description']);
                if (!empty($cat['category_parent']) && isset($categories[(string) $cat['category_parent']])) {
                    // Set category parent ID
                    $Chapter->set('parent_ID', $categories[(string) $cat['category_parent']]);
                }
                $Chapter->dbinsert();
                // Save new category
                $categories[$cat['category_nicename']] = $Chapter->ID;
                if (empty($category_default)) {
                    // Set first category as default
                    $category_default = $Chapter->ID;
                }
                $categories_count++;
            }
        }
        echo sprintf(T_('%d records'), $categories_count) . '<br />';
    }
    if (empty($category_default)) {
        // No categories in XML file, Try to use first category(from DB) as default
        foreach ($categories as $category_name => $category_ID) {
            $category_default = $category_ID;
            break;
        }
    }
    if (empty($category_default)) {
        // If category is still not defined then we should create default, because blog must has at least one category
        $new_Chapter = new Chapter(NULL, $wp_blog_ID);
        $new_Chapter->set('name', T_('Uncategorized'));
        $new_Chapter->set('urlname', $wp_Blog->get('urlname') . '-main');
        $new_Chapter->dbinsert();
        $category_default = $new_Chapter->ID;
    }
    /* Import tags */
    $tags = array();
    if (isset($xml_data['tags']) && count($xml_data['tags']) > 0) {
        echo T_('Importing the tags... ');
        evo_flush();
        // Get existing tags
        $SQL = new SQL();
        $SQL->SELECT('tag_name, tag_ID');
        $SQL->FROM('T_items__tag');
        $tags = $DB->get_assoc($SQL->get());
        $tags_count = 0;
        foreach ($xml_data['tags'] as $tag) {
            if (empty($tags[(string) $tag['tag_name']])) {
                // Insert new tag into DB if tag doesn't exist with current name
                mysqli_query($DB->dbhandle, 'INSERT INTO ' . $tableprefix . 'items__tag ( tag_name )
					VALUES ( ' . $DB->quote($tag['tag_name']) . ' )');
                $tag_ID = mysqli_insert_id($DB->dbhandle);
                // Save new tag
                $tags[$tag['tag_name']] = (string) $tag_ID;
                $tags_count++;
            }
        }
        echo sprintf(T_('%d records'), $tags_count) . '<br />';
    }
    /* Import posts */
    $posts = array();
    $comments = array();
    if (isset($xml_data['posts']) && count($xml_data['posts']) > 0) {
        load_class('items/model/_item.class.php', 'Item');
        // Set status's links between WP and b2evo names
        $post_statuses = array('publish' => 'published', 'pending' => 'review', 'draft' => 'draft', 'trash' => 'deprecated', 'community' => 'community', 'deprecated' => 'deprecated', 'protected' => 'protected', 'private' => 'private', 'review' => 'review', 'redirected' => 'redirected');
        // Get post types
        $SQL = new SQL();
        $SQL->SELECT('LOWER( ityp_name ), ityp_ID');
        $SQL->FROM('T_items__type');
        $post_types = $DB->get_assoc($SQL->get());
        echo T_('Importing the posts... ');
        evo_flush();
        foreach ($xml_data['posts'] as $post) {
            $author_ID = isset($authors[(string) $post['post_author']]) ? $authors[(string) $post['post_author']] : 1;
            $last_edit_user_ID = isset($authors[(string) $post['post_lastedit_user']]) ? $authors[(string) $post['post_lastedit_user']] : $author_ID;
            $post_main_cat_ID = $category_default;
            $post_extra_cat_IDs = array();
            $post_tags = array();
            if (!empty($post['terms'])) {
                // Set categories and tags
                foreach ($post['terms'] as $term) {
                    switch ($term['domain']) {
                        case 'category':
                            if (isset($categories[(string) $term['slug']])) {
                                if ($post_main_cat_ID == $category_default) {
                                    // Set main category
                                    $post_main_cat_ID = $categories[(string) $term['slug']];
                                }
                                // Set extra categories
                                $post_extra_cat_IDs[] = $categories[(string) $term['slug']];
                            }
                            break;
                        case 'post_tag':
                            if (isset($tags[(string) $term['slug']])) {
                                // Set tag
                                $post_tags[] = $term['slug'];
                            }
                            break;
                    }
                }
            }
            // Set post type ID
            $post_type_ID = isset($post_types[strtolower($post['post_type'])]) ? $post_types[strtolower($post['post_type'])] : '1';
            // Get regional IDs by their names
            $item_regions = wp_get_regional_data($post['post_country'], $post['post_region'], $post['post_subregion'], $post['post_city']);
            $Item = new Item();
            $Item->set('main_cat_ID', $post_main_cat_ID);
            $Item->set('creator_user_ID', $author_ID);
            $Item->set('lastedit_user_ID', $last_edit_user_ID);
            $Item->set('title', $post['post_title']);
            $Item->set('content', $post['post_content']);
            $Item->set('excerpt', $post['post_excerpt']);
            $Item->set('datestart', $post['post_date']);
            $Item->set('datecreated', !empty($post['post_datecreated']) ? $post['post_datecreated'] : $post['post_date']);
            $Item->set('datemodified', !empty($post['post_datemodified']) ? $post['post_datemodified'] : $post['post_date']);
            $Item->set('urltitle', !empty($post['post_urltitle']) ? $post['post_urltitle'] : $post['post_title']);
            $Item->set('url', $post['post_url']);
            $Item->set('status', isset($post_statuses[(string) $post['status']]) ? $post_statuses[(string) $post['status']] : 'review');
            // If 'comment_status' has the unappropriate value set it to 'open'
            $Item->set('comment_status', in_array($post['comment_status'], array('open', 'closed', 'disabled')) ? $post['comment_status'] : 'open');
            $Item->set('ityp_ID', $post_type_ID);
            if (empty($post['post_excerpt']) && !empty($post['post_content'])) {
                // Generate excerpt
                $Item->set('excerpt', excerpt($post['post_content']));
                $Item->set('excerpt_autogenerated', '1');
            }
            $Item->set('extra_cat_IDs', $post_extra_cat_IDs);
            $Item->set('dateset', $post['post_date_mode'] == 'set' ? 1 : 0);
            if (isset($authors[(string) $post['post_assigned_user']])) {
                $Item->set('assigned_user', $authors[(string) $post['post_assigned_user']]);
            }
            $Item->set('datedeadline', $post['post_datedeadline']);
            $Item->set('locale', $post['post_locale']);
            $Item->set('excerpt_autogenerated', $post['post_excerpt_autogenerated']);
            $Item->set('titletag', $post['post_titletag']);
            $Item->set('notifications_status', empty($post['post_notifications_status']) ? 'noreq' : $post['post_notifications_status']);
            $Item->set('renderers', array($post['post_renderers']));
            $Item->set('priority', $post['post_priority']);
            $Item->set('featured', $post['post_featured']);
            $Item->set('order', $post['post_order']);
            if (!empty($item_regions['country'])) {
                // Country
                $Item->set('ctry_ID', $item_regions['country']);
                if (!empty($item_regions['region'])) {
                    // Region
                    $Item->set('rgn_ID', $item_regions['region']);
                    if (!empty($item_regions['subregion'])) {
                        // Subregion
                        $Item->set('subrg_ID', $item_regions['subregion']);
                    }
                    if (!empty($item_regions['city'])) {
                        // City
                        $Item->set('city_ID', $item_regions['city']);
                    }
                }
            }
            if (count($post_tags) > 0) {
                $Item->tags = $post_tags;
            }
            $Item->dbinsert();
            $posts[$post['post_id']] = $Item->ID;
            if (!empty($files) && !empty($post['links'])) {
                // Link the files to the Item if it has them
                foreach ($post['links'] as $link) {
                    if (isset($files[$link['link_file_ID']])) {
                        // Link a file to Item
                        $File = $files[$link['link_file_ID']];
                        $LinkOwner = new LinkItem($Item);
                        $File->link_to_Object($LinkOwner, $link['link_order'], $link['link_position']);
                    }
                }
            }
            if (!empty($post['comments'])) {
                // Set comments
                $comments[$Item->ID] = $post['comments'];
            }
        }
        foreach ($xml_data['posts'] as $post) {
            // Set post parents
            if (!empty($post['post_parent']) && isset($posts[(string) $post['post_parent']])) {
                mysqli_query($DB->dbhandle, 'UPDATE ' . $tableprefix . 'items__item
						  SET post_parent_ID = ' . $DB->quote($posts[(string) $post['post_parent']]) . '
						WHERE post_ID = ' . $DB->quote($posts[(string) $post['post_id']]));
            }
        }
        echo sprintf(T_('%d records'), count($xml_data['posts'])) . '<br />';
    }
    /* Import comments */
    if (!empty($comments)) {
        echo T_('Importing the comments... ');
        evo_flush();
        $comments_count = 0;
        $comments_IDs = array();
        foreach ($comments as $post_ID => $comments) {
            if (empty($comments)) {
                // Skip if no comments
                continue;
            }
            foreach ($comments as $comment) {
                $comment_author_user_ID = 0;
                if (!empty($comment['comment_user_id']) && isset($authors_IDs[(string) $comment['comment_user_id']])) {
                    // Author ID
                    $comment_author_user_ID = $authors_IDs[(string) $comment['comment_user_id']];
                }
                $comment_parent_ID = 0;
                if (!empty($comment['comment_parent']) && isset($comments_IDs[(string) $comment['comment_parent']])) {
                    // Parent comment ID
                    $comment_parent_ID = $comments_IDs[(string) $comment['comment_parent']];
                }
                unset($comment_IP_country);
                if (!empty($comment['comment_IP_country'])) {
                    // Get country ID by code
                    $CountryCache =& get_CountryCache();
                    if ($Country =& $CountryCache->get_by_name($comment['comment_IP_country'], false)) {
                        $comment_IP_country = $Country->ID;
                    }
                }
                $Comment = new Comment();
                $Comment->set('item_ID', $post_ID);
                if (!empty($comment_parent_ID)) {
                    $Comment->set('in_reply_to_cmt_ID', $comment_parent_ID);
                }
                $Comment->set('date', $comment['comment_date']);
                if (!empty($comment_author_user_ID)) {
                    $Comment->set('author_user_ID', $comment_author_user_ID);
                }
                $Comment->set('author', utf8_substr($comment['comment_author'], 0, 100));
                $Comment->set('author_IP', $comment['comment_author_IP']);
                $Comment->set('author_email', $comment['comment_author_email']);
                $Comment->set('content', $comment['comment_content']);
                if (empty($comment['comment_status'])) {
                    // If comment status is empty (the export of wordpress doesn't provide this field)
                    $Comment->set('status', $comment['comment_approved'] == '1' ? 'published' : 'draft');
                } else {
                    // Set status when we have predefined value
                    $Comment->set('status', $comment['comment_status']);
                }
                if (!empty($comment_IP_country)) {
                    // Country
                    $Comment->set('IP_ctry_ID', $comment_IP_country);
                }
                $Comment->set('rating', $comment['comment_rating']);
                $Comment->set('featured', $comment['comment_featured']);
                $Comment->set('nofollow', $comment['comment_nofollow']);
                $Comment->set('helpful_addvotes', $comment['comment_helpful_addvotes']);
                $Comment->set('helpful_countvotes', $comment['comment_helpful_countvotes']);
                $Comment->set('spam_addvotes', $comment['comment_spam_addvotes']);
                $Comment->set('spam_countvotes', $comment['comment_spam_countvotes']);
                $Comment->set('karma', $comment['comment_karma']);
                $Comment->set('spam_karma', $comment['comment_spam_karma']);
                $Comment->set('allow_msgform', $comment['comment_allow_msgform']);
                $Comment->set('notif_status', empty($comment['comment_notif_status']) ? 'noreq' : $comment['comment_notif_status']);
                $Comment->dbinsert();
                $comments_IDs[$comment['comment_id']] = $Comment->ID;
                $comments_count++;
            }
        }
        echo sprintf(T_('%d records'), $comments_count) . '<br />';
    }
    echo '<p>' . T_('Import complete.') . '</p>';
    $DB->commit();
}