/**
* Searches through the content of an activity item to locate usernames,
* designated by an @ sign.
*
* @since BuddyPress (1.5)
*
* @param string $content The content of the activity, usually found in $activity->content.
* @return mixed Associative array with user ID as key and username as value. Boolean false if no mentions found.
*/
function bp_activity_find_mentions($content)
{
$pattern = '/[@]+([A-Za-z0-9-_\\.@]+)\\b/';
preg_match_all($pattern, $content, $usernames);
// Make sure there's only one instance of each username
if (!($usernames = array_unique($usernames[1]))) {
return false;
}
$mentioned_users = array();
// We've found some mentions! Check to see if users exist
foreach ((array) $usernames as $key => $username) {
if (bp_is_username_compatibility_mode()) {
$user_id = username_exists($username);
} else {
$user_id = bp_core_get_userid_from_nicename($username);
}
// user ID exists, so let's add it to our array
if (!empty($user_id)) {
$mentioned_users[$user_id] = $username;
}
}
if (empty($mentioned_users)) {
return false;
}
return $mentioned_users;
}
/**
* Create a new message.
*
* @since 2.4.0 Added 'error_type' as an additional $args parameter.
*
* @param array|string $args {
* Array of arguments.
* @type int $sender_id Optional. ID of the user who is sending the
* message. Default: ID of the logged-in user.
* @type int $thread_id Optional. ID of the parent thread. Leave blank to
* create a new thread for the message.
* @type array $recipients IDs or usernames of message recipients. If this
* is an existing thread, it is unnecessary to pass a $recipients
* argument - existing thread recipients will be assumed.
* @type string $subject Optional. Subject line for the message. For
* existing threads, the existing subject will be used. For new
* threads, 'No Subject' will be used if no $subject is provided.
* @type string $content Content of the message. Cannot be empty.
* @type string $date_sent Date sent, in 'Y-m-d H:i:s' format. Default: current date/time.
* @type string $error_type Optional. Error type. Either 'bool' or 'wp_error'. Default: 'bool'.
* }
* @return int|bool ID of the message thread on success, false on failure.
*/
function messages_new_message($args = '')
{
// Parse the default arguments.
$r = bp_parse_args($args, array('sender_id' => bp_loggedin_user_id(), 'thread_id' => false, 'recipients' => array(), 'subject' => false, 'content' => false, 'date_sent' => bp_core_current_time(), 'error_type' => 'bool'), 'messages_new_message');
// Bail if no sender or no content.
if (empty($r['sender_id']) || empty($r['content'])) {
if ('wp_error' === $r['error_type']) {
if (empty($r['sender_id'])) {
$error_code = 'messages_empty_sender';
$feedback = __('Your message was not sent. Please use a valid sender.', 'buddypress');
} else {
$error_code = 'messages_empty_content';
$feedback = __('Your message was not sent. Please enter some content.', 'buddypress');
}
return new WP_Error($error_code, $feedback);
} else {
return false;
}
}
// Create a new message object.
$message = new BP_Messages_Message();
$message->thread_id = $r['thread_id'];
$message->sender_id = $r['sender_id'];
$message->subject = $r['subject'];
$message->message = $r['content'];
$message->date_sent = $r['date_sent'];
// If we have a thread ID...
if (!empty($r['thread_id'])) {
// ...use the existing recipients
$thread = new BP_Messages_Thread($r['thread_id']);
$message->recipients = $thread->get_recipients();
// Strip the sender from the recipient list, and unset them if they are
// not alone. If they are alone, let them talk to themselves.
if (isset($message->recipients[$r['sender_id']]) && count($message->recipients) > 1) {
unset($message->recipients[$r['sender_id']]);
}
// Set a default reply subject if none was sent.
if (empty($message->subject)) {
$message->subject = sprintf(__('Re: %s', 'buddypress'), $thread->messages[0]->subject);
}
// ...otherwise use the recipients passed
} else {
// Bail if no recipients.
if (empty($r['recipients'])) {
if ('wp_error' === $r['error_type']) {
return new WP_Error('message_empty_recipients', __('Message could not be sent. Please enter a recipient.', 'buddypress'));
} else {
return false;
}
}
// Set a default subject if none exists.
if (empty($message->subject)) {
$message->subject = __('No Subject', 'buddypress');
}
// Setup the recipients array.
$recipient_ids = array();
// Invalid recipients are added to an array, for future enhancements.
$invalid_recipients = array();
// Loop the recipients and convert all usernames to user_ids where needed.
foreach ((array) $r['recipients'] as $recipient) {
// Trim spaces and skip if empty.
$recipient = trim($recipient);
if (empty($recipient)) {
continue;
}
// Check user_login / nicename columns first
// @see http://buddypress.trac.wordpress.org/ticket/5151.
if (bp_is_username_compatibility_mode()) {
$recipient_id = bp_core_get_userid(urldecode($recipient));
} else {
$recipient_id = bp_core_get_userid_from_nicename($recipient);
}
// Check against user ID column if no match and if passed recipient is numeric.
if (empty($recipient_id) && is_numeric($recipient)) {
if (bp_core_get_core_userdata((int) $recipient)) {
$recipient_id = (int) $recipient;
}
//.........这里部分代码省略.........
//.........这里部分代码省略.........
}
}
// Running off blog other than root
if (defined('BP_ENABLE_MULTIBLOG') || 1 != BP_ROOT_BLOG) {
// Any subdirectory names must be removed from $bp_uri.
// This includes two cases: (1) when WP is installed in a subdirectory,
// and (2) when BP is running on secondary blog of a subdirectory
// multisite installation. Phew!
if ($chunks = explode('/', $current_blog->path)) {
foreach ($chunks as $key => $chunk) {
$bkey = array_search($chunk, $bp_uri);
if ($bkey !== false) {
unset($bp_uri[$bkey]);
}
$bp_uri = array_values($bp_uri);
}
}
}
// Set the indexes, these are incresed by one if we are not on a VHOST install
$component_index = 0;
$action_index = $component_index + 1;
// If this is a WordPress page, return from the function.
if (is_page($bp_uri[$component_index])) {
return false;
}
// Get site path items
$paths = explode('/', bp_core_get_site_path());
// Take empties off the end of path
if (empty($paths[count($paths) - 1])) {
array_pop($paths);
}
// Take empties off the start of path
if (empty($paths[0])) {
array_shift($paths);
}
foreach ((array) $bp_uri as $key => $uri_chunk) {
if (in_array($uri_chunk, $paths)) {
unset($bp_uri[$key]);
}
}
// Reset the keys by merging with an empty array
$bp_uri = array_merge(array(), $bp_uri);
$bp_unfiltered_uri = $bp_uri;
// If we are under anything with a members slug, set the correct globals
if ($bp_uri[0] == BP_MEMBERS_SLUG) {
$is_member_page = true;
$is_root_component = true;
}
// Catch a member page and set the current member ID
if (!defined('BP_ENABLE_ROOT_PROFILES')) {
if ($bp_uri[0] == BP_MEMBERS_SLUG && !empty($bp_uri[1]) || in_array('wp-load.php', $bp_uri)) {
// We are within a member page, set up user id globals
if (defined('BP_ENABLE_USERNAME_COMPATIBILITY_MODE')) {
$displayed_user_id = bp_core_get_userid(urldecode($bp_uri[1]));
} else {
$displayed_user_id = bp_core_get_userid_from_nicename(urldecode($bp_uri[1]));
}
unset($bp_uri[0]);
unset($bp_uri[1]);
// Reset the keys by merging with an empty array
$bp_uri = array_merge(array(), $bp_uri);
}
} else {
if (get_userdatabylogin($bp_uri[0]) || in_array('wp-load.php', $bp_uri)) {
$is_member_page = true;
$is_root_component = true;
// We are within a member page, set up user id globals
if (defined('BP_ENABLE_USERNAME_COMPATIBILITY_MODE')) {
$displayed_user_id = bp_core_get_userid(urldecode($bp_uri[0]));
} else {
$displayed_user_id = bp_core_get_userid_from_nicename(urldecode($bp_uri[0]));
}
unset($bp_uri[0]);
// Reset the keys by merging with an empty array
$bp_uri = array_merge(array(), $bp_uri);
}
}
if (!isset($is_root_component)) {
$is_root_component = in_array($bp_uri[0], $bp->root_components);
}
if (!is_subdomain_install() && !$is_root_component) {
$component_index++;
$action_index++;
}
// Set the current component
$current_component = $bp_uri[$component_index];
// Set the current action
$current_action = $bp_uri[$action_index];
// Set the entire URI as the action variables, we will unset the current_component and action in a second
$action_variables = $bp_uri;
// Unset the current_component and action from action_variables
unset($action_variables[$component_index]);
unset($action_variables[$action_index]);
// Remove the username from action variables if this is not a VHOST install
if (!is_subdomain_install() && !$is_root_component) {
array_shift($action_variables);
}
// Reset the keys by merging with an empty array
$action_variables = array_merge(array(), $action_variables);
}
/**
* Create a new message.
*
* @param array $args {
* Array of arguments.
* @type int $sender_id Optional. ID of the user who is sending the
* message. Default: ID of the logged-in user.
* @type int $thread_id Optional. ID of the parent thread. Leave blank to
* create a new thread for the message.
* @type array $recipients IDs or usernames of message recipients. If this
* is an existing thread, it is unnecessary to pass a $recipients
* argument - existing thread recipients will be assumed.
* @type string $subject Optional. Subject line for the message. For
* existing threads, the existing subject will be used. For new
* threads, 'No Subject' will be used if no $subject is provided.
* @type string $content Content of the message. Cannot be empty.
* @type string $date_sent Date sent, in 'Y-m-d H:i:s' format. Default:
* current date/time.
* }
* @return int|bool ID of the message thread on success, false on failure.
*/
function messages_new_message( $args = '' ) {
// Parse the default arguments
$r = bp_parse_args( $args, array(
'sender_id' => bp_loggedin_user_id(),
'thread_id' => false, // false for a new message, thread id for a reply to a thread.
'recipients' => array(), // Can be an array of usernames, user_ids or mixed.
'subject' => false,
'content' => false,
'date_sent' => bp_core_current_time()
), 'messages_new_message' );
// Bail if no sender or no content
if ( empty( $r['sender_id'] ) || empty( $r['content'] ) ) {
return false;
}
// Create a new message object
$message = new BP_Messages_Message;
$message->thread_id = $r['thread_id'];
$message->sender_id = $r['sender_id'];
$message->subject = $r['subject'];
$message->message = $r['content'];
$message->date_sent = $r['date_sent'];
// If we have a thread ID...
if ( ! empty( $r['thread_id'] ) ) {
// ...use the existing recipients
$thread = new BP_Messages_Thread( $r['thread_id'] );
$message->recipients = $thread->get_recipients();
// Strip the sender from the recipient list, and unset them if they are
// not alone. If they are alone, let them talk to themselves.
if ( isset( $message->recipients[ $r['sender_id'] ] ) && ( count( $message->recipients ) > 1 ) ) {
unset( $message->recipients[ $r['sender_id'] ] );
}
// Set a default reply subject if none was sent
if ( empty( $message->subject ) ) {
$message->subject = sprintf( __( 'Re: %s', 'buddypress' ), $thread->messages[0]->subject );
}
// ...otherwise use the recipients passed
} else {
// Bail if no recipients
if ( empty( $r['recipients'] ) ) {
return false;
}
// Set a default subject if none exists
if ( empty( $message->subject ) ) {
$message->subject = __( 'No Subject', 'buddypress' );
}
// Setup the recipients array
$recipient_ids = array();
// Invalid recipients are added to an array, for future enhancements
$invalid_recipients = array();
// Loop the recipients and convert all usernames to user_ids where needed
foreach( (array) $r['recipients'] as $recipient ) {
// Trim spaces and skip if empty
$recipient = trim( $recipient );
if ( empty( $recipient ) ) {
continue;
}
// Check user_login / nicename columns first
// @see http://buddypress.trac.wordpress.org/ticket/5151
if ( bp_is_username_compatibility_mode() ) {
$recipient_id = bp_core_get_userid( urldecode( $recipient ) );
} else {
$recipient_id = bp_core_get_userid_from_nicename( $recipient );
}
//.........这里部分代码省略.........
/**
* Determine which BP component (if any) matches a given transect
*
* @link http://en.wikipedia.org/wiki/Cycle_(graph_theory)
* @link http://en.wikipedia.org/wiki/Cycle_detection
* @version 1.0
* @since 1.0
* @param array $intersect | Intersect array
* @param array $status | Reason no match was found
* @return bool $result | Exception on failure. True on match. False on no match.
*/
public function matchComponent($intersect, &$status)
{
$transect = $intersect["transect"];
$route_found = false;
// CASE 1: Front-page component
// ====================================================================
if ($intersect["endpoint_id"] === null) {
// If a component is set to the front page, and the user is not requesting
// a specific post via a URL parameter, we have a match
$not_preview_mode = empty($_GET['p']) && empty($_GET['page_id']);
if ($not_preview_mode) {
$show_page_on_front = get_option('show_on_front') == 'page';
// Note comparison operator
$post_id = get_option('page_on_front');
if ($show_page_on_front && $post_id) {
$post = get_post($post_id);
if (!empty($post)) {
$this->bp->current_component = (string) $post->post_name;
$status = array('numeric' => 1, 'text' => "Successful match on front-page component.", 'data' => array('current_component' => $this->bp->current_component, 'post_id' => $post_id, 'post' => $post), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
$route_found = true;
} else {
throw new FOX_exception(array('numeric' => 1, 'text' => "Site front page set to component, but component's post was empty", 'data' => array("post_id" => $post_id), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__, 'child' => null));
}
}
}
if (!$route_found) {
$status = array('numeric' => 2, 'text' => "Site front page with no components active on front page.", 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
return false;
}
}
// CASE 2: Any non-nested component
// ====================================================================
if (!$this->bp->current_component) {
try {
$this->bp->current_component = self::getPrimaryComponentName($intersect["endpoint_name"]);
} catch (FOX_exception $child) {
throw new FOX_exception(array('numeric' => 2, 'text' => "Error fetching primary component name", 'data' => array("endpoint_name" => $intersect["endpoint_name"]), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__, 'child' => $child));
}
if ($this->bp->current_component) {
$status = array('numeric' => 3, 'text' => "Successful match on primary component", 'data' => array('current_component' => $this->bp->current_component), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
$route_found = true;
}
}
// CASE 3: Root profile
// ====================================================================
if (!$this->bp->current_component && !empty($transect) && !empty($this->bp->pages->members) && defined('BP_ENABLE_ROOT_PROFILES') && BP_ENABLE_ROOT_PROFILES) {
// Shift the user name off the transect
$user_name = array_shift($transect);
// Switch the user_id based on compatibility mode
if (bp_is_username_compatibility_mode()) {
$user_id = (int) bp_core_get_userid(urldecode($user_name));
} else {
$user_id = (int) bp_core_get_userid_from_nicename(urldecode($user_name));
}
if ($user_id) {
$this->bp->current_component = "members";
$this->bp->displayed_user->id = $user_id;
$status = array('numeric' => 4, 'text' => "Successful match on root profile", 'data' => array('current_component' => $this->bp->current_component), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
$route_found = true;
// Without the 'members' URL chunk, WordPress won't know which page to load,
// so this filter intercepts the WP query and tells it to load the members page
$function_string = '$query_args["pagename"] = "';
$function_string .= $this->bp->pages->members->name;
$function_string .= '"; return $query_args;';
add_filter('request', create_function('$query_args', $function_string));
} else {
$status = array('numeric' => 5, 'text' => "Root profiles enabled. No matching user.", 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
return false;
}
}
// CASE 4: No match
// ====================================================================
if (!$this->bp->current_component) {
$status = array('numeric' => 6, 'text' => "No matching components", 'data' => array('intersect' => $this->intersect, 'walk' => $this->walk), 'file' => __FILE__, 'line' => __LINE__, 'method' => __METHOD__);
return false;
}
// Members Component secondary processing
// ====================================================================
if ($this->bp->current_component == "members" && !empty($transect)) {
// If the component is "members", the transect must either contain no tokens (show all users on site),
// or the first token in the transect must be a valid user name (show single user)
$user_name = array_shift($transect);
// Switch the user_id based on compatibility mode
if (bp_is_username_compatibility_mode()) {
$user_id = (int) bp_core_get_userid(urldecode($user_name));
} else {
$user_id = (int) bp_core_get_userid_from_nicename(urldecode($user_name));
}
// CASE 1: Token in first transect position isn't a valid user_id
//.........这里部分代码省略.........
/**
* Return the user link for the user based on the supplied identifier.
*
* @since 1.0.0
*
* @param string $username If BP_ENABLE_USERNAME_COMPATIBILITY_MODE is set,
* this should be user_login, otherwise it should
* be user_nicename.
* @return string|bool The link to the user's domain, false on no match.
*/
function bp_core_get_userlink_by_username($username)
{
if (bp_is_username_compatibility_mode()) {
$user_id = bp_core_get_userid($username);
} else {
$user_id = bp_core_get_userid_from_nicename($username);
}
/**
* Filters the user link for the user based on username.
*
* @since 1.0.1
*
* @param string|bool $value URL for the user if found, otherwise false.
*/
return apply_filters('bp_core_get_userlink_by_username', bp_core_get_userlink($user_id, false, false, true));
}
/**
* import_gradebook_screen( $vars )
*
* Hooks into screen_handler
* Imports a CSV file data into the gradebook_screen(). It doesn't save anything!
*
* @param Array $vars a set of variables received for this screen template
* @return Array $vars a set of variable passed to this screen template
*/
function import_gradebook_screen($vars)
{
$is_nonce = wp_verify_nonce($_POST['_wpnonce'], 'gradebook_import_nonce');
if (!$is_nonce) {
$vars['die'] = __('BuddyPress Courseware Nonce Error while importing gradebook.', 'bpsp');
return $this->gradebook_screen($vars);
}
if (isset($_FILES['csv_filename']) && !empty($_FILES['csv_filename'])) {
require_once 'parseCSV.class.php';
// Load CSV parser
$csv = new parseCSV();
$csv->auto($_FILES['csv_filename']['tmp_name']);
foreach ($csv->data as &$grade) {
$id = bp_core_get_userid_from_nicename($grade['uid']);
if ($id) {
$csv->data[$id] = $grade;
}
unset($grade);
}
if (!empty($csv->data)) {
$vars['grades'] = $csv->data;
$vars['message'] = __('Data imported successfully, but it is not saved yet! Save this form changes to keep the data.', 'bpsp');
$vars['assignment_permalink'] = $vars['assignment_permalink'] . '/gradebook';
}
}
unset($_POST);
return $this->gradebook_screen($vars);
}
请发表评论