/** * The achievement post type loop. * * Most of the values that $args can accept are documented in {@link WP_Query}. The custom * values added by Achievements are as follows: * * 'ach_event' - string - Loads achievements for a specific event. Matches a slug from the dpa_event tax. Default is empty. * 'ach_populate_progress' - bool|int - Populate a user/users' progress for the results. * - bool: True - uses the logged in user (default). False - don't fetch progress. * - int: pass a user ID (single user). * 'ach_progress_status' - array - array: Post status IDs for the Progress post type. * * @param array|string $args All the arguments supported by {@link WP_Query}, and some more. * @return bool Returns true if the query has any results to loop over * @since Achievements (1.0) */ function dpa_has_achievements($args = array()) { // If multisite and running network-wide, switch_to_blog to the data store site if (is_multisite() && dpa_is_running_networkwide()) { switch_to_blog(DPA_DATA_STORE); } $default_post_parent = dpa_is_single_achievement() ? dpa_get_achievement_id() : 'any'; $default_progress_status = dpa_is_single_user_achievements() ? array(dpa_get_unlocked_status_id()) : array(dpa_get_locked_status_id(), dpa_get_unlocked_status_id()); $defaults = array('ignore_sticky_posts' => true, 'order' => 'ASC', 'orderby' => 'title', 'max_num_pages' => false, 'paged' => dpa_get_paged(), 'perm' => 'readable', 'post_parent' => $default_post_parent, 'post_type' => dpa_get_achievement_post_type(), 'posts_per_page' => dpa_get_achievements_per_page(), 'ach_progress_status' => $default_progress_status, 's' => !empty($_GET['achievements']) ? wp_unslash($_GET['achievements']) : '', 'ach_event' => '', 'ach_populate_progress' => false); // Load achievements for a specific event if (!empty($args['ach_event'])) { $args['tax_query'] = array(array('field' => 'slug', 'taxonomy' => dpa_get_event_tax_id(), 'terms' => $args['ach_event'])); unset($args['ach_event']); } $args = dpa_parse_args($args, $defaults, 'has_achievements'); extract($args); // Run the query achievements()->achievement_query = new WP_Query($args); // User to popular progress for $progress_user_ids = false; if (isset($args['ach_populate_progress'])) { if (true === $args['ach_populate_progress']) { if (dpa_is_single_user_achievements()) { $progress_user_ids = dpa_get_displayed_user_id(); } elseif (is_user_logged_in()) { $progress_user_ids = get_current_user_id(); } } else { $progress_user_ids = (int) $args['ach_populate_progress']; } } // If no limit to posts per page, set it to the current post_count if (-1 === $posts_per_page) { $posts_per_page = achievements()->achievement_query->post_count; } // Add pagination values to query object achievements()->achievement_query->posts_per_page = $posts_per_page; achievements()->achievement_query->paged = $paged; // Only add pagination if query returned results if (((int) achievements()->achievement_query->post_count || (int) achievements()->achievement_query->found_posts) && (int) achievements()->achievement_query->posts_per_page) { // Limit the number of achievements shown based on maximum allowed pages if (!empty($max_num_pages) && achievements()->achievement_query->found_posts > achievements()->achievement_query->max_num_pages * achievements()->achievement_query->post_count) { achievements()->achievement_query->found_posts = achievements()->achievement_query->max_num_pages * achievements()->achievement_query->post_count; } // If pretty permalinks are enabled, make our pagination pretty if ($GLOBALS['wp_rewrite']->using_permalinks()) { // Page or single post if (is_page() || is_single()) { $base = get_permalink(); } elseif (dpa_is_achievement_archive()) { $base = dpa_get_achievements_url(); } else { $base = get_permalink($post_parent); } // Use pagination base $base = trailingslashit($base) . user_trailingslashit($GLOBALS['wp_rewrite']->pagination_base . '/%#%/'); // Unpretty pagination } else { $base = add_query_arg('paged', '%#%'); } // Pagination settings with filter $achievement_pagination = apply_filters('dpa_achievement_pagination', array('base' => $base, 'current' => (int) achievements()->achievement_query->paged, 'format' => '', 'mid_size' => 1, 'next_text' => is_rtl() ? '←' : '→', 'prev_text' => is_rtl() ? '→' : '←', 'total' => $posts_per_page == achievements()->achievement_query->found_posts ? 1 : ceil((int) achievements()->achievement_query->found_posts / (int) $posts_per_page))); // Add pagination to query object achievements()->achievement_query->pagination_links = paginate_links($achievement_pagination); // Remove first page from pagination achievements()->achievement_query->pagination_links = str_replace($GLOBALS['wp_rewrite']->pagination_base . "/1/'", "'", achievements()->achievement_query->pagination_links); } // Populate extra progress information for the achievements if (!empty($progress_user_ids) && achievements()->achievement_query->have_posts()) { $progress_post_ids = wp_list_pluck((array) achievements()->achievement_query->posts, 'ID'); // Args for progress query $progress_args = array('author' => $progress_user_ids, 'no_found_rows' => true, 'post_parent' => $progress_post_ids, 'post_status' => $args['ach_progress_status'], 'posts_per_page' => -1); // Run the query dpa_has_progress($progress_args); } // If multisite and running network-wide, undo the switch_to_blog if (is_multisite() && dpa_is_running_networkwide()) { restore_current_blog(); } return apply_filters('dpa_has_achievements', achievements()->achievement_query->have_posts()); }
/** * Achievements per page setting field. * * @since Achievements (3.6) */ function dpa_admin_setting_callback_achievements_per_page() { ?> <input name="_dpa_achievements_per_page" id="_dpa_achievements_per_page" type="number" min="1" step="1" value="<?php echo (int) dpa_get_achievements_per_page(); ?> " class="small-text" required <?php dpa_maybe_admin_setting_disabled('_dpa_achievements_per_page'); ?> /> <label for="_dpa_achievements_per_page"><?php _ex('per page', 'achievements pagination', 'achievements'); ?> </label> <?php }
/** * Add checks for Achievements conditions to parse_query action * * @param WP_Query $posts_query * @since Achievements (3.0) */ function dpa_parse_query(WP_Query $posts_query) { // Bail if not the main loop, if filters are suppressed, or if in WP admin. if (!$posts_query->is_main_query() || true === $posts_query->get('suppress_filters') || is_admin()) { return; } // Set the per-page pagination value the same as the dpa_has_achievements() template loop's setting. if (dpa_is_achievement_archive()) { $posts_query->set('posts_per_page', dpa_get_achievements_per_page()); } }