/** * Record an activity stream entry when a user unlocks an achievement * * @param WP_Post $achievement Achievement post object * @param int $user_id * @param int $progress_id * @since Achievements (3.2) */ public function achievement_unlocked(WP_Post $achievement, $user_id, $progress_id) { // Bail if user is not active if (!dpa_is_user_active($user_id)) { return; } // Achievement details $achievement_permalink = dpa_get_achievement_permalink($achievement->ID); $achievement_title = get_post_field('post_title', $achievement->ID, 'raw'); $achievement_link = sprintf('<a href="%1$s">%2$s</a>', esc_url($achievement_permalink), esc_html($achievement_title)); // Activity action & text $activity_text = sprintf(__('%1$s unlocked the achievement: %2$s', 'achievements'), bp_core_get_userlink($user_id), $achievement_link); $activity_action = apply_filters('dpa_activity_achievement_unlocked', $activity_text, $achievement->ID, $user_id, $progress_id); // Record the activity $activity = array('action' => $activity_action, 'content' => '', 'item_id' => $achievement->ID, 'hide_sitewide' => false, 'primary_link' => $achievement_permalink, 'type' => $this->achievement_unlocked, 'user_id' => $user_id); $this->record_activity($activity); }
/** * Return a breadcrumb ( achievement archive -> achievement -> [achievement, ...] ) * * @param array $args Optional. * @return string Breadcrumbs * @since Achievements (3.0) */ function dpa_get_breadcrumb($args = array()) { // Turn off breadcrumbs if (apply_filters('dpa_no_breadcrumb', is_front_page())) { return ''; } // Define variables $front_id = $root_id = 0; $ancestors = $crumbs = array(); $pre_root_text = $pre_front_text = $pre_current_text = ''; $pre_include_root = $pre_include_home = $pre_include_current = true; /** * Home text */ // No custom home text if (empty($args['home_text'])) { // Set home text to page title $front_id = get_option('page_on_front'); if (!empty($front_id)) { $pre_front_text = get_the_title($front_id); } else { $pre_front_text = _x('Home', 'Home screen of the website', 'achievements'); } } /** * Root text */ // No custom root text if (empty($args['root_text'])) { $page = dpa_get_page_by_path(dpa_get_root_slug()); if (!empty($page)) { $root_id = $page->ID; } $pre_root_text = dpa_get_achievement_archive_title(); } /** * Includes */ // Root slug is also the front page if (!empty($front_id) && $front_id === $root_id) { $pre_include_root = false; } // Don't show root if viewing achievement archive if (dpa_is_achievement_archive()) { $pre_include_root = false; } // Don't show root if viewing page in place of achievement archive if (!empty($root_id) && ((is_single() || is_page()) && $root_id === get_the_ID())) { $pre_include_root = false; } /** * Current text */ // Achievement archive if (dpa_is_achievement_archive()) { $pre_current_text = dpa_get_achievement_archive_title(); // Single achievement } elseif (dpa_is_single_achievement()) { $pre_current_text = dpa_get_achievement_title(); // Single object of some type } else { $pre_current_text = get_the_title(); } /** * Parse args */ // Parse args $defaults = array('before' => '<div class="dpa-breadcrumb"><p>', 'after' => '</p></div>', 'sep' => is_rtl() ? _x('‹', 'HTML entity for left single angle quotes', 'achievements') : _x('›', 'HTML entity for right single angle quotes', 'achievements'), 'pad_sep' => 1, 'sep_before' => '<span class="dpa-breadcrumb-sep">', 'sep_after' => '</span>', 'crumb_before' => '', 'crumb_after' => '', 'include_home' => $pre_include_home, 'home_text' => $pre_front_text, 'include_root' => $pre_include_root, 'root_text' => $pre_root_text, 'include_current' => $pre_include_current, 'current_text' => $pre_current_text, 'current_before' => '<span class="dpa-breadcrumb-current">', 'current_after' => '</span>'); $r = dpa_parse_args($args, $defaults, 'get_breadcrumb'); extract($r); /** * Ancestors */ // Get post ancestors if (is_singular()) { $ancestors = array_reverse(get_post_ancestors(get_the_ID())); } // Do we want to include a link to home? if (!empty($include_home) || empty($home_text)) { $crumbs[] = '<a href="' . esc_url(trailingslashit(home_url())) . '" class="dpa-breadcrumb-home">' . esc_html($home_text) . '</a>'; } // Do we want to include a link to the achievement root? if (!empty($include_root) || empty($root_text)) { // Page exists at root slug path, so use its permalink $page = dpa_get_page_by_path(dpa_get_root_slug()); if (!empty($page)) { $root_url = get_permalink($page->ID); } else { $root_url = get_post_type_archive_link(dpa_get_achievement_post_type()); } // Add the breadcrumb $crumbs[] = '<a href="' . esc_url($root_url) . '" class="dpa-breadcrumb-root">' . esc_html($root_text) . '</a>'; } // Ancestors exist if (!empty($ancestors)) { // Loop through parents foreach ((array) $ancestors as $parent_id) { // Parents $parent = get_post($parent_id); // Skip parent if empty or error if (empty($parent) || is_wp_error($parent)) { continue; } // Switch through post_type to ensure correct filters are applied switch ($parent->post_type) { // Achievement case dpa_get_achievement_post_type(): $crumbs[] = '<a href="' . esc_url(dpa_get_achievement_permalink($parent->ID)) . '" class="dpa-breadcrumb-achievement">' . esc_html(dpa_get_achievement_title($parent->ID)) . '</a>'; break; // WordPress Post/Page/Other // WordPress Post/Page/Other default: $crumbs[] = '<a href="' . esc_url(get_permalink($parent->ID)) . '" class="dpa-breadcrumb-item">' . esc_html(get_the_title($parent->ID)) . '</a>'; break; } } } /** * Current */ // Add current page to breadcrumb if (!empty($include_current) || empty($current_text)) { $crumbs[] = $current_before . $current_text . $current_after; } /** * Separator */ // Wrap the separator in before/after before padding and filter if (!empty($sep)) { $sep = $sep_before . $sep . $sep_after; } // Pad the separator if (!empty($pad_sep)) { $sep = str_pad($sep, strlen($sep) + (int) $pad_sep * 2, ' ', STR_PAD_BOTH); if (function_exists('mb_strlen')) { $sep = str_pad($sep, mb_strlen($sep) + (int) $r['pad_sep'] * 2, ' ', STR_PAD_BOTH); } else { $sep = str_pad($sep, strlen($sep) + (int) $r['pad_sep'] * 2, ' ', STR_PAD_BOTH); } } /** * And -- eventually -- we're done. */ // Filter the separator and breadcrumb $sep = apply_filters('dpa_breadcrumb_separator', $sep); $crumbs = apply_filters('dpa_breadcrumbs', $crumbs); // Build the trail $trail = !empty($crumbs) ? $before . $crumb_before . implode($sep . $crumb_after . $crumb_before, $crumbs) . $crumb_after . $after : ''; return apply_filters('dpa_get_breadcrumb', $trail, $crumbs, $r); }
/** * Return the excerpt of the achievement * * @param int $achievement_id Optional. Achievement ID. * @param int $length Optional. Length of the excerpt. Defaults to 200 letters * @return string Achievement excerpt * @since Achievements (3.0) * @todo Don't cut off part of a word; go to the nearest space */ function dpa_get_achievement_excerpt($achievement_id = 0, $length = 200) { $achievement_id = dpa_get_achievement_id($achievement_id); $excerpt = get_post_field('post_excerpt', $achievement_id); $length = (int) $length; // If you don't specify an excerpt when creating an achievement, we'll use the post content. if (empty($excerpt)) { $excerpt = dpa_get_achievement_content($achievement_id); } // Check the length of the excerpt $excerpt = trim(strip_tags($excerpt)); // Multibyte support if (function_exists('mb_strlen')) { $excerpt_length = mb_strlen($excerpt); } else { $excerpt_length = strlen($excerpt); } if (!empty($length) && $excerpt_length > $length) { // Trim the excerpt $excerpt = substr($excerpt, 0, $length - 1); // Build a "go here to read more" link // translators: first param is post permalink, second param is the "more" text. $more_link = sprintf(__('… (<a href="%1$s">%2$s</a>)', 'achievements'), esc_attr(dpa_get_achievement_permalink($achievement_id)), _x('more', 'Excerpt - click here to see more of the post', 'achievements')); $more_link = apply_filters('dpa_get_achievement_excerpt_more_link', $more_link, $achievement_id, $length); $excerpt .= $more_link; } return apply_filters('dpa_get_achievement_excerpt', $excerpt, $achievement_id, $length); }
/** * Custom user feedback messages for achievement post type * * @param array $messages * @return array * @since Achievements (3.4) */ function dpa_achievement_feedback_messages($messages) { global $post; // Bail out if we're not on the right screen if (dpa_get_achievement_post_type() !== get_current_screen()->post_type) { return; } $achievement_url = dpa_get_achievement_permalink($post); $post_date = sanitize_post_field('post_date', $post->post_date, $post->ID, 'raw'); $messages[dpa_get_achievement_post_type()] = array(0 => '', 1 => sprintf(__('Achievement updated. <a href="%s">View achievement</a>', 'achievements'), $achievement_url), 2 => __('Custom field updated.', 'achievements'), 3 => __('Custom field deleted.', 'achievements'), 4 => __('Achievement updated.', 'achievements'), 5 => isset($_GET['revision']) ? sprintf(__('Achievement restored to revision from %s', 'achievements'), wp_post_revision_title((int) $_GET['revision'], false)) : false, 6 => sprintf(__('Achievement created. <a href="%s">View achievement</a>', 'achievements'), $achievement_url), 7 => __('Achievement saved.', 'achievements'), 8 => sprintf(__('Achievement submitted. <a target="_blank" href="%s">Preview achievement</a>', 'achievements'), esc_url(add_query_arg('preview', 'true', $achievement_url))), 9 => sprintf(__('Achievement scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview achievement</a>', 'achievements'), date_i18n(__('M j, Y @ G:i', 'achievements'), strtotime($post_date)), $achievement_url), 10 => sprintf(__('Achievement draft updated. <a target="_blank" href="%s">Preview topic</a>', 'achievements'), esc_url(add_query_arg('preview', 'true', $achievement_url)))); return $messages; }