function bbPress_ajax_favorite() { $user_id = bbp_get_current_user_id(); $id = intval($_POST['id']); if (!current_user_can('edit_user', $user_id)) { die('-1'); } if (!($topic = bbp_get_topic($id))) { die('0'); } check_ajax_referer('toggle-favorite_' . $topic->ID); if (bbp_is_user_favorite($user_id, $topic->ID)) { if (bbp_remove_user_favorite($user_id, $topic->ID)) { die('1'); } } else { if (bbp_add_user_favorite($user_id, $topic->ID)) { die('1'); } } die('0'); }
/** * Split topic handler * * Handles the front end split topic submission * * @since bbPress (r2756) * * @param string $action The requested action to compare this function to * @uses bbp_add_error() To add an error message * @uses bbp_get_reply() To get the reply * @uses bbp_get_topic() To get the topics * @uses bbp_verify_nonce_request() To verify the nonce and check the request * @uses current_user_can() To check if the current user can edit the topics * @uses bbp_get_topic_post_type() To get the topic post type * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error} * @uses do_action() Calls 'bbp_pre_split_topic' with the from reply id, source * and destination topic ids * @uses bbp_get_topic_subscribers() To get the source topic subscribers * @uses bbp_add_user_subscription() To add the user subscription * @uses bbp_get_topic_favoriters() To get the source topic favoriters * @uses bbp_add_user_favorite() To add the user favorite * @uses wp_get_post_terms() To get the source topic tags * @uses wp_set_post_terms() To set the topic tags * @uses bbp_get_reply_post_type() To get the reply post type * @uses wpdb::prepare() To prepare our sql query * @uses wpdb::get_results() To execute the sql query and get results * @uses wp_update_post() To update the replies * @uses bbp_update_reply_topic_id() To update the reply topic id * @uses bbp_get_topic_forum_id() To get the topic forum id * @uses bbp_update_reply_forum_id() To update the reply forum id * @uses do_action() Calls 'bbp_split_topic_reply' with the reply id and * destination topic id * @uses bbp_update_topic_last_reply_id() To update the topic last reply id * @uses bbp_update_topic_last_active_time() To update the topic last active meta * @uses do_action() Calls 'bbp_post_split_topic' with the destination and * source topic ids and source topic's forum id * @uses bbp_get_topic_permalink() To get the topic permalink * @uses wp_safe_redirect() To redirect to the topic link */ function bbp_split_topic_handler($action = '') { // Bail if action is not 'bbp-split-topic' if ('bbp-split-topic' !== $action) { return; } global $wpdb; // Prevent debug notices $from_reply_id = $destination_topic_id = 0; $destination_topic_title = ''; $destination_topic = $from_reply = $source_topic = ''; $split_option = false; /** Split Reply ***********************************************************/ if (empty($_POST['bbp_reply_id'])) { bbp_add_error('bbp_split_topic_reply_id', __('<strong>ERROR</strong>: Reply ID to split the topic from not found!', 'bbpress')); } else { $from_reply_id = (int) $_POST['bbp_reply_id']; } $from_reply = bbp_get_reply($from_reply_id); // Reply exists if (empty($from_reply)) { bbp_add_error('bbp_split_topic_r_not_found', __('<strong>ERROR</strong>: The reply you want to split from was not found.', 'bbpress')); } /** Topic to Split ********************************************************/ // Get the topic being split $source_topic = bbp_get_topic($from_reply->post_parent); // No topic if (empty($source_topic)) { bbp_add_error('bbp_split_topic_source_not_found', __('<strong>ERROR</strong>: The topic you want to split was not found.', 'bbpress')); } // Nonce check failed if (!bbp_verify_nonce_request('bbp-split-topic_' . $source_topic->ID)) { bbp_add_error('bbp_split_topic_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress')); return; } // Use cannot edit topic if (!current_user_can('edit_topic', $source_topic->ID)) { bbp_add_error('bbp_split_topic_source_permission', __('<strong>ERROR</strong>: You do not have the permissions to edit the source topic.', 'bbpress')); } // How to Split if (!empty($_POST['bbp_topic_split_option'])) { $split_option = (string) trim($_POST['bbp_topic_split_option']); } // Invalid split option if (empty($split_option) || !in_array($split_option, array('existing', 'reply'))) { bbp_add_error('bbp_split_topic_option', __('<strong>ERROR</strong>: You need to choose a valid split option.', 'bbpress')); // Valid Split Option } else { // What kind of split switch ($split_option) { // Into an existing topic case 'existing': // Get destination topic id if (empty($_POST['bbp_destination_topic'])) { bbp_add_error('bbp_split_topic_destination_id', __('<strong>ERROR</strong>: Destination topic ID not found!', 'bbpress')); } else { $destination_topic_id = (int) $_POST['bbp_destination_topic']; } // Get the destination topic $destination_topic = bbp_get_topic($destination_topic_id); // No destination topic if (empty($destination_topic)) { bbp_add_error('bbp_split_topic_destination_not_found', __('<strong>ERROR</strong>: The topic you want to split to was not found!', 'bbpress')); } // User cannot edit the destination topic if (!current_user_can('edit_topic', $destination_topic->ID)) { bbp_add_error('bbp_split_topic_destination_permission', __('<strong>ERROR</strong>: You do not have the permissions to edit the destination topic!', 'bbpress')); } break; // Split at reply into a new topic // Split at reply into a new topic case 'reply': default: // User needs to be able to publish topics if (current_user_can('publish_topics')) { // Use the new title that was passed if (!empty($_POST['bbp_topic_split_destination_title'])) { $destination_topic_title = esc_attr(strip_tags($_POST['bbp_topic_split_destination_title'])); // Use the source topic title } else { $destination_topic_title = $source_topic->post_title; } // Update the topic $destination_topic_id = wp_update_post(array('ID' => $from_reply->ID, 'post_title' => $destination_topic_title, 'post_name' => false, 'post_type' => bbp_get_topic_post_type(), 'post_parent' => $source_topic->post_parent, 'menu_order' => 0, 'guid' => '')); $destination_topic = bbp_get_topic($destination_topic_id); // Make sure the new topic knows its a topic bbp_update_topic_topic_id($from_reply->ID); // Shouldn't happen if (false === $destination_topic_id || is_wp_error($destination_topic_id) || empty($destination_topic)) { bbp_add_error('bbp_split_topic_destination_reply', __('<strong>ERROR</strong>: There was a problem converting the reply into the topic. Please try again.', 'bbpress')); } // User cannot publish posts } else { bbp_add_error('bbp_split_topic_destination_permission', __('<strong>ERROR</strong>: You do not have the permissions to create new topics. The reply could not be converted into a topic.', 'bbpress')); } break; } } // Bail if there are errors if (bbp_has_errors()) { return; } /** No Errors - Do the Spit ***********************************************/ // Update counts, etc... do_action('bbp_pre_split_topic', $from_reply->ID, $source_topic->ID, $destination_topic->ID); /** Date Check ************************************************************/ // Check if the destination topic is older than the from reply if (strtotime($from_reply->post_date) < strtotime($destination_topic->post_date)) { // Set destination topic post_date to 1 second before from reply $destination_post_date = date('Y-m-d H:i:s', strtotime($from_reply->post_date) - 1); // Update destination topic wp_update_post(array('ID' => $destination_topic_id, 'post_date' => $destination_post_date, 'post_date_gmt' => get_gmt_from_date($destination_post_date))); } /** Subscriptions *********************************************************/ // Copy the subscribers if (!empty($_POST['bbp_topic_subscribers']) && "1" === $_POST['bbp_topic_subscribers'] && bbp_is_subscriptions_active()) { // Get the subscribers $subscribers = bbp_get_topic_subscribers($source_topic->ID); if (!empty($subscribers)) { // Add subscribers to new topic foreach ((array) $subscribers as $subscriber) { bbp_add_user_subscription($subscriber, $destination_topic->ID); } } } /** Favorites *************************************************************/ // Copy the favoriters if told to if (!empty($_POST['bbp_topic_favoriters']) && "1" === $_POST['bbp_topic_favoriters']) { // Get the favoriters $favoriters = bbp_get_topic_favoriters($source_topic->ID); if (!empty($favoriters)) { // Add the favoriters to new topic foreach ((array) $favoriters as $favoriter) { bbp_add_user_favorite($favoriter, $destination_topic->ID); } } } /** Tags ******************************************************************/ // Copy the tags if told to if (!empty($_POST['bbp_topic_tags']) && "1" === $_POST['bbp_topic_tags']) { // Get the source topic tags $source_topic_tags = wp_get_post_terms($source_topic->ID, bbp_get_topic_tag_tax_id(), array('fields' => 'names')); if (!empty($source_topic_tags)) { wp_set_post_terms($destination_topic->ID, $source_topic_tags, bbp_get_topic_tag_tax_id(), true); } } /** Split Replies *********************************************************/ // get_posts() is not used because it doesn't allow us to use '>=' // comparision without a filter. $replies = (array) $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_date >= %s AND {$wpdb->posts}.post_parent = %d AND {$wpdb->posts}.post_type = %s ORDER BY {$wpdb->posts}.post_date ASC", $from_reply->post_date, $source_topic->ID, bbp_get_reply_post_type())); // Make sure there are replies to loop through if (!empty($replies) && !is_wp_error($replies)) { // Calculate starting point for reply positions switch ($split_option) { // Get topic reply count for existing topic case 'existing': $reply_position = bbp_get_topic_reply_count($destination_topic->ID); break; // Account for new lead topic // Account for new lead topic case 'reply': $reply_position = 1; break; } // Save reply ids $reply_ids = array(); // Change the post_parent of each reply to the destination topic id foreach ($replies as $reply) { // Bump the reply position each iteration through the loop $reply_position++; // Update the reply wp_update_post(array('ID' => $reply->ID, 'post_title' => sprintf(__('Reply To: %s', 'bbpress'), $destination_topic->post_title), 'post_name' => false, 'post_parent' => $destination_topic->ID, 'menu_order' => $reply_position, 'guid' => '')); // Gather reply ids $reply_ids[] = $reply->ID; // Adjust reply meta values bbp_update_reply_topic_id($reply->ID, $destination_topic->ID); bbp_update_reply_forum_id($reply->ID, bbp_get_topic_forum_id($destination_topic->ID)); // Adjust reply to values $reply_to = bbp_get_reply_to($reply->ID); // Not a reply to a reply that moved over if (!in_array($reply_to, $reply_ids)) { bbp_update_reply_to($reply->ID, 0); } // New topic from reply can't be a reply to if ($from_reply->ID === $destination_topic->ID && $from_reply->ID === $reply_to) { bbp_update_reply_to($reply->ID, 0); } // Do additional actions per split reply do_action('bbp_split_topic_reply', $reply->ID, $destination_topic->ID); } // Remove reply to from new topic if ($from_reply->ID === $destination_topic->ID) { delete_post_meta($from_reply->ID, '_bbp_reply_to'); } // Set the last reply ID and freshness $last_reply_id = $reply->ID; $freshness = $reply->post_date; // Set the last reply ID and freshness to the from_reply } else { $last_reply_id = $from_reply->ID; $freshness = $from_reply->post_date; } // It is a new topic and we need to set some default metas to make // the topic display in bbp_has_topics() list if ('reply' === $split_option) { bbp_update_topic_last_reply_id($destination_topic->ID, $last_reply_id); bbp_update_topic_last_active_id($destination_topic->ID, $last_reply_id); bbp_update_topic_last_active_time($destination_topic->ID, $freshness); } // Update source topic ID last active bbp_update_topic_last_reply_id($source_topic->ID); bbp_update_topic_last_active_id($source_topic->ID); bbp_update_topic_last_active_time($source_topic->ID); /** Successful Split ******************************************************/ // Update counts, etc... do_action('bbp_post_split_topic', $from_reply->ID, $source_topic->ID, $destination_topic->ID); // Redirect back to the topic wp_safe_redirect(bbp_get_topic_permalink($destination_topic->ID)); // For good measure exit; }
/** * Handles the front end adding and removing of favorite topics * * @uses bbp_get_user_id() To get the user id * @uses bbp_verify_nonce_request() To verify the nonce and check the request * @uses current_user_can() To check if the current user can edit the user * @uses bbPress:errors:add() To log the error messages * @uses bbp_is_user_favorite() To check if the topic is in user's favorites * @uses bbp_remove_user_favorite() To remove the user favorite * @uses bbp_add_user_favorite() To add the user favorite * @uses do_action() Calls 'bbp_favorites_handler' with success, user id, topic * id and action * @uses bbp_is_favorites() To check if it's the favorites page * @uses bbp_get_favorites_link() To get the favorites page link * @uses bbp_get_topic_permalink() To get the topic permalink * @uses wp_safe_redirect() To redirect to the url */ function bbp_favorites_handler() { if (!bbp_is_favorites_active()) { return false; } // Bail if not a GET action if ('GET' !== strtoupper($_SERVER['REQUEST_METHOD'])) { return; } // Bail if required GET actions aren't passed if (empty($_GET['topic_id']) || empty($_GET['action'])) { return; } // Setup possible get actions $possible_actions = array('bbp_favorite_add', 'bbp_favorite_remove'); // Bail if actions aren't meant for this function if (!in_array($_GET['action'], $possible_actions)) { return; } // What action is taking place? $action = $_GET['action']; $topic_id = intval($_GET['topic_id']); $user_id = bbp_get_user_id(0, true, true); // Check for empty topic if (empty($topic_id)) { bbp_add_error('bbp_favorite_topic_id', __('<strong>ERROR</strong>: No topic was found! Which topic are you marking/unmarking as favorite?', 'bbpress')); // Check nonce } elseif (!bbp_verify_nonce_request('toggle-favorite_' . $topic_id)) { bbp_add_error('bbp_favorite_nonce', __('<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress')); // Check current user's ability to edit the user } elseif (!current_user_can('edit_user', $user_id)) { bbp_add_error('bbp_favorite_permissions', __('<strong>ERROR</strong>: You don\'t have the permission to edit favorites of that user!', 'bbpress')); } // Bail if errors if (bbp_has_errors()) { return; } /** No errors *************************************************************/ $is_favorite = bbp_is_user_favorite($user_id, $topic_id); $success = false; if (true == $is_favorite && 'bbp_favorite_remove' == $action) { $success = bbp_remove_user_favorite($user_id, $topic_id); } elseif (false == $is_favorite && 'bbp_favorite_add' == $action) { $success = bbp_add_user_favorite($user_id, $topic_id); } // Do additional favorites actions do_action('bbp_favorites_handler', $success, $user_id, $topic_id, $action); // Success! if (true == $success) { // Redirect back from whence we came if (bbp_is_favorites()) { $redirect = bbp_get_favorites_permalink($user_id); } elseif (bbp_is_single_user()) { $redirect = bbp_get_user_profile_url(); } elseif (is_singular(bbp_get_topic_post_type())) { $redirect = bbp_get_topic_permalink($topic_id); } elseif (is_single() || is_page()) { $redirect = get_permalink(); } wp_safe_redirect($redirect); // For good measure exit; // Fail! Handle errors } elseif (true == $is_favorite && 'bbp_favorite_remove' == $action) { bbp_add_error('bbp_favorite_remove', __('<strong>ERROR</strong>: There was a problem removing that topic from favorites!', 'bbpress')); } elseif (false == $is_favorite && 'bbp_favorite_add' == $action) { bbp_add_error('bbp_favorite_add', __('<strong>ERROR</strong>: There was a problem favoriting that topic!', 'bbpress')); } }
/** * AJAX handler to add or remove a topic from a user's favorites * * @since bbPress (r3732) * * @uses bbp_is_favorites_active() To check if favorites are active * @uses bbp_is_user_logged_in() To check if user is logged in * @uses bbp_get_current_user_id() To get the current user id * @uses current_user_can() To check if the current user can edit the user * @uses bbp_get_topic() To get the topic * @uses wp_verify_nonce() To verify the nonce & check the referer * @uses bbp_is_user_favorite() To check if the topic is user's favorite * @uses bbp_remove_user_favorite() To remove the topic from user's favorites * @uses bbp_add_user_favorite() To add the topic from user's favorites * @uses bbp_ajax_response() To return JSON */ public function ajax_favorite() { // Bail if favorites are not active if (!bbp_is_favorites_active()) { bbp_ajax_response(false, __('Favorites are no longer active.', 'bbpress'), 300); } // Bail if user is not logged in if (!is_user_logged_in()) { bbp_ajax_response(false, __('Please login to make this topic a favorite.', 'bbpress'), 301); } // Get user and topic data $user_id = bbp_get_current_user_id(); $id = !empty($_POST['id']) ? intval($_POST['id']) : 0; // Bail if user cannot add favorites for this user if (!current_user_can('edit_user', $user_id)) { bbp_ajax_response(false, __('You do not have permission to do this.', 'bbpress'), 302); } // Get the topic $topic = bbp_get_topic($id); // Bail if topic cannot be found if (empty($topic)) { bbp_ajax_response(false, __('The topic could not be found.', 'bbpress'), 303); } // Bail if user did not take this action if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'toggle-favorite_' . $topic->ID)) { bbp_ajax_response(false, __('Are you sure you meant to do that?', 'bbpress'), 304); } // Take action $status = bbp_is_user_favorite($user_id, $topic->ID) ? bbp_remove_user_favorite($user_id, $topic->ID) : bbp_add_user_favorite($user_id, $topic->ID); // Bail if action failed if (empty($status)) { bbp_ajax_response(false, __('The request was unsuccessful. Please try again.', 'bbpress'), 305); } // Put subscription attributes in convenient array $attrs = array('topic_id' => $topic->ID, 'user_id' => $user_id); // Action succeeded bbp_ajax_response(true, bbp_get_user_favorites_link($attrs, $user_id, false), 200); }
/** * Convert Table * * @param string to type * @param int Start row */ public function convert_table($to_type, $start) { // Are we usig a sync table, or postmeta? if ($this->wpdb->get_var("SHOW TABLES LIKE '" . $this->sync_table_name . "'") == $this->sync_table_name) { $this->sync_table = true; } else { $this->sync_table = false; } // Set some defaults $has_insert = false; $from_tablename = ''; $field_list = $from_tables = $tablefield_array = array(); // Toggle Table Name based on $to_type (destination) switch ($to_type) { case 'user': $tablename = $this->wpdb->users; break; case 'tags': $tablename = ''; break; case 'forum_subscriptions': $tablename = $this->wpdb->usermeta; break; case 'topic_subscriptions': $tablename = $this->wpdb->usermeta; break; case 'favorites': $tablename = $this->wpdb->usermeta; break; default: $tablename = $this->wpdb->posts; } // Get the fields from the destination table if (!empty($tablename)) { $tablefield_array = $this->get_fields($tablename); } /** Step 1 ************************************************************/ // Loop through the field maps, and look for to_type matches foreach ($this->field_map as $item) { // Yay a match, and we have a from table, too if ($item['to_type'] == $to_type && !empty($item['from_tablename'])) { // $from_tablename was set from a previous loop iteration if (!empty($from_tablename)) { // Doing some joining if (!in_array($item['from_tablename'], $from_tables) && in_array($item['join_tablename'], $from_tables)) { $from_tablename .= ' ' . $item['join_type'] . ' JOIN ' . $this->opdb->prefix . $item['from_tablename'] . ' AS ' . $item['from_tablename'] . ' ' . $item['join_expression']; } // $from_tablename needs to be set } else { $from_tablename = $item['from_tablename'] . ' AS ' . $item['from_tablename']; } // Specific FROM expression data used if (!empty($item['from_expression'])) { // No 'WHERE' in expression if (stripos($from_tablename, "WHERE") === false) { $from_tablename .= ' ' . $item['from_expression']; // 'WHERE' in expression, so replace with 'AND' } else { $from_tablename .= ' ' . str_replace("WHERE", "AND", $item['from_expression']); } } // Add tablename and fieldname to arrays, formatted for querying $from_tables[] = $item['from_tablename']; $field_list[] = 'convert(' . $item['from_tablename'] . '.' . $item['from_fieldname'] . ' USING "' . $this->charset . '") AS ' . $item['from_fieldname']; } } /** Step 2 ************************************************************/ // We have a $from_tablename, so we want to get some data to convert if (!empty($from_tablename)) { // Get some data from the old forums $field_list = array_unique($field_list); $forum_query = 'SELECT ' . implode(',', $field_list) . ' FROM ' . $this->opdb->prefix . $from_tablename . ' LIMIT ' . $start . ', ' . $this->max_rows; $forum_array = $this->opdb->get_results($forum_query, ARRAY_A); // Set this query as the last one ran update_option('_bbp_converter_query', $forum_query); // Query returned some results if (!empty($forum_array)) { // Loop through results foreach ((array) $forum_array as $forum) { // Reset some defaults $insert_post = $insert_postmeta = $insert_data = array(); // Loop through field map, again... foreach ($this->field_map as $row) { // Types match and to_fieldname is present. This means // we have some work to do here. if ($row['to_type'] == $to_type && isset($row['to_fieldname'])) { // This row has a destination that matches one of the // columns in this table. if (in_array($row['to_fieldname'], $tablefield_array)) { // Allows us to set default fields. if (isset($row['default'])) { $insert_post[$row['to_fieldname']] = $row['default']; // Translates a field from the old forum. } elseif (isset($row['callback_method'])) { if ('callback_userid' == $row['callback_method'] && empty($_POST['_bbp_converter_convert_users'])) { $insert_post[$row['to_fieldname']] = $forum[$row['from_fieldname']]; } else { $insert_post[$row['to_fieldname']] = call_user_func_array(array($this, $row['callback_method']), array($forum[$row['from_fieldname']], $forum)); } // Maps the field from the old forum. } else { $insert_post[$row['to_fieldname']] = $forum[$row['from_fieldname']]; } // Destination field is not empty, so we might need // to do some extra work or set a default. } elseif (!empty($row['to_fieldname'])) { // Allows us to set default fields. if (isset($row['default'])) { $insert_postmeta[$row['to_fieldname']] = $row['default']; // Translates a field from the old forum. } elseif (isset($row['callback_method'])) { if ($row['callback_method'] == 'callback_userid' && 0 == $_POST['_bbp_converter_convert_users']) { $insert_postmeta[$row['to_fieldname']] = $forum[$row['from_fieldname']]; } else { $insert_postmeta[$row['to_fieldname']] = call_user_func_array(array($this, $row['callback_method']), array($forum[$row['from_fieldname']], $forum)); } // Maps the field from the old forum. } else { $insert_postmeta[$row['to_fieldname']] = $forum[$row['from_fieldname']]; } } } } /** Step 3 ************************************************/ // Something to insert into the destination field if (count($insert_post) > 0 || $to_type == 'tags' && count($insert_postmeta) > 0) { switch ($to_type) { /** New user **************************************/ case 'user': if (username_exists($insert_post['user_login'])) { $insert_post['user_login'] = '******' . $insert_post['user_login']; } if (email_exists($insert_post['user_email'])) { $insert_post['user_email'] = 'imported_' . $insert_post['user_email']; } $post_id = wp_insert_user($insert_post); if (is_numeric($post_id)) { foreach ($insert_postmeta as $key => $value) { add_user_meta($post_id, $key, $value, true); if ('_id' == substr($key, -3) && true === $this->sync_table) { $this->wpdb->insert($this->sync_table_name, array('value_type' => 'user', 'value_id' => $post_id, 'meta_key' => $key, 'meta_value' => $value)); } } } break; /** New Topic-Tag *********************************/ /** New Topic-Tag *********************************/ case 'tags': $post_id = wp_set_object_terms($insert_postmeta['objectid'], $insert_postmeta['name'], 'topic-tag', true); $term = get_term_by('name', $insert_postmeta['name'], 'topic-tag'); if (false !== $term) { wp_update_term($term->term_id, 'topic-tag', array('description' => $insert_postmeta['description'], 'slug' => $insert_postmeta['slug'])); } break; /** Forum Subscriptions *********************************/ /** Forum Subscriptions *********************************/ case 'forum_subscriptions': $user_id = $insert_post['user_id']; if (is_numeric($user_id)) { foreach ($insert_postmeta as $key => $value) { // Only extract values from the key _bbp_forum_subscriptions if ('_bbp_forum_subscriptions' == $key) { // Get the new forum ID $forum_id = $this->callback_forumid($value); // Add the topic ID to the users subscribed forums bbp_add_user_forum_subscription($user_id, $forum_id); } } } break; /** Subscriptions *********************************/ /** Subscriptions *********************************/ case 'topic_subscriptions': $user_id = $insert_post['user_id']; if (is_numeric($user_id)) { foreach ($insert_postmeta as $key => $value) { // Only extract values from the key _bbp_subscriptions if ('_bbp_subscriptions' == $key) { // Get the new topic ID $topic_id = $this->callback_topicid($value); // Add the topic ID to the users subscribed topics bbp_add_user_topic_subscription($user_id, $topic_id); } } } break; /** Favorites *********************************/ /** Favorites *********************************/ case 'favorites': $user_id = $insert_post['user_id']; if (is_numeric($user_id)) { // Loop through the array foreach ($insert_postmeta as $key => $value) { // Only extract values from the key _bbp_favorites if ('_bbp_favorites' == $key) { // Our array may contain comma delimited favorites so lets explode these $insert_postmeta = explode(",", $insert_postmeta['_bbp_favorites']); // Loop through our updated exploded array foreach ($insert_postmeta as $key => $value) { // Get the new topic ID $topic_id = $this->callback_topicid($value); // Add the topic ID to the users favorites bbp_add_user_favorite($user_id, $topic_id); } } } } break; /** Forum, Topic, Reply ***************************/ /** Forum, Topic, Reply ***************************/ default: $post_id = wp_insert_post($insert_post); if (is_numeric($post_id)) { foreach ($insert_postmeta as $key => $value) { add_post_meta($post_id, $key, $value, true); /** * If we are using the sync_table add * the meta '_id' keys to the table * * Forums: _bbp_old_forum_id // The old forum ID * _bbp_old_forum_parent_id // The old forum parent ID * * Topics: _bbp_forum_id // The new forum ID * _bbp_old_topic_id // The old topic ID * _bbp_old_closed_status_id // The old topic open/closed status * _bbp_old_sticky_status_id // The old topic sticky status * * Replies: _bbp_forum_id // The new forum ID * _bbp_topic_id // The new topic ID * _bbp_old_reply_id // The old reply ID * _bbp_old_reply_to_id // The old reply to ID */ if ('_id' == substr($key, -3) && true === $this->sync_table) { $this->wpdb->insert($this->sync_table_name, array('value_type' => 'post', 'value_id' => $post_id, 'meta_key' => $key, 'meta_value' => $value)); } /** * Replies need to save their old reply_to ID for * hierarchical replies association. Later we update * the _bbp_reply_to value with the new bbPress * value using convert_reply_to_parents() */ if ('reply' == $to_type && '_bbp_old_reply_to_id' == $key) { add_post_meta($post_id, '_bbp_reply_to', $value); } } } break; } $has_insert = true; } } } } return !$has_insert; }
/** * @covers ::bbp_add_user_favorite */ public function test_bbp_add_user_favorite() { $u = $this->factory->user->create(); $t = $this->factory->topic->create_many(3); // Add topic favorites. update_user_option($u, '_bbp_favorites', $t[0]); // Add user favorite. bbp_add_user_favorite($u, $t[1]); $favorites = bbp_get_user_favorites_topic_ids($u); $this->assertEquals(array($t[0], $t[1]), $favorites); // Add user favorite. bbp_add_user_favorite($u, $t[2]); $favorites = bbp_get_user_favorites_topic_ids($u); $this->assertEquals(array($t[0], $t[1], $t[2]), $favorites); }
/** * Perform the export * * @access public * @since 1.0 * @uses bbp_Export::csv_rows_out() * @return void */ public function import() { if (!$this->can_import()) { wp_die(__('You do not have permission to import data.', 'bbp-export-import'), __('Error', 'bbp-export-import')); } $csv_array = $this->csv_to_array($_FILES['bbp_csv_file']['tmp_name'], ';'); foreach ($csv_array as $key => $line) { $post_args = $line; $meta_args = array(); // Setup author date if ($post_args['anonymous'] == '1') { $meta_args['anonymous_email'] = $line['post_author']; } else { $user = get_user_by('email', $post_args['post_author']); if (!$user) { // The user doesn't exist, so create them $user = wp_insert_user(array('user_email' => $post_args['post_author'], 'user_login' => $post_args['user_login'])); } $post_args['post_author'] = $user->ID; } // Decode content $post_args['post_content'] = html_entity_decode($post_args['post_content']); $topic_type = bbp_get_topic_post_type(); $reply_type = bbp_get_reply_post_type(); // Remove the post args we don't want sent to wp_insert_post unset($post_args['anonymous']); unset($post_args['user_login']); switch ($line['post_type']) { case $topic_type: // Set the forum parent for topics $post_args['post_parent'] = $this->forum_id; $meta_args['voice_count'] = $line['voices']; $meta_args['reply_count'] = $post_args['reply_count']; $topic_id = bbp_insert_topic($post_args, $meta_args); // Subscribe the original poster to the topic bbp_add_user_subscription($post_args['post_author'], $topic_id); // Add the topic to the user's favorites if (bbp_is_user_favorite($post_args['post_author'], $topic_id)) { bbp_add_user_favorite($post_args['post_author'], $topic_id); } // Set topic as resolved if GetShopped Support Forum is active if ($post_args['resolved'] == '1') { add_post_meta($topic_id, '_bbps_topic_status', '2'); } break; case $reply_type: // Set the forum parent for replies. The topic ID is created above when the replie's topic is first created $post_args['post_parent'] = $topic_id; $reply_id = bbp_insert_reply($post_args, $meta_args); // Subscribe reply author, if not already if (!bbp_is_user_subscribed($post_args['post_author'], $topic_id)) { bbp_add_user_subscription($post_args['post_author'], $topic_id); } // Mark as favorite if (bbp_is_user_favorite($post_args['post_author'], $topic_id)) { bbp_add_user_favorite($post_args['post_author'], $topic_id); } // Check if the next row is a topic, meaning we have reached the last reply and need to update the last active time if ($csv_array[$key + 1]['post_type'] == bbp_get_topic_post_type()) { bbp_update_forum_last_active_time($this->forum_id, $post_args['post_date']); } break; } } // Recount forum topic / reply counts bbp_admin_repair_forum_topic_count(); bbp_admin_repair_forum_reply_count(); wp_redirect(admin_url('post.php?post=' . $this->forum_id . '&action=edit')); exit; }
/** * @covers ::bbp_add_user_favorite */ public function test_bbp_add_user_favorite() { $u = $this->factory->user->create(); $t = $this->factory->topic->create_many(3); // Add topic favorites. add_post_meta($t[0], '_bbp_favorite', $u, false); // Add user favorite. bbp_add_user_favorite($u, $t[1]); $favorites = bbp_get_user_favorites_topic_ids($u); $this->assertEqualSets(array($t[0], $t[1]), $favorites); // Add user favorite. bbp_add_user_favorite($u, $t[2]); $favorites = bbp_get_user_favorites_topic_ids($u); $this->assertEqualSets(array($t[0], $t[1], $t[2]), $favorites); }