wp_get_archives

Definition:
function wp_get_archives($args = '') {}

Display archive links based on type and format.
The ‘type’ argument offers a few choices and by default will display monthly archive links. The other options for values are ‘daily’, ‘weekly’, ‘monthly’, ‘yearly’, ‘postbypost’ or ‘alpha’. Both ‘postbypost’ and ‘alpha’ display the same archive link list, the difference between the two is that ‘alpha’ will order by post title and ‘postbypost’ will order by post date.

Parameters

  • string|array $args: Optional. Override defaults.

Defined filters

  • getarchives_where
    apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r )
  • getarchives_join
    apply_filters( 'getarchives_join', '', $r )
  • the_title
    apply_filters( 'the_title', $arcresult->post_title, $arcresult->ID )

Source code

function wp_get_archives($args = '') {

	global $wpdb, $wp_locale;



	$defaults = array(

		'type' => 'monthly', 'limit' => '',

		'format' => 'html', 'before' => '',

		'after' => '', 'show_post_count' => false,

		'echo' => 1

	);



	$r = wp_parse_args( $args, $defaults );

	extract( $r, EXTR_SKIP );



	if ( '' == $type )

		$type = 'monthly';



	if ( '' != $limit ) {

		$limit = absint($limit);

		$limit = ' LIMIT '.$limit;

	}



	// this is what will separate dates on weekly archive links

	$archive_week_separator = '–';



	// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride

	$archive_date_format_over_ride = 0;



	// options for daily archive (only if you over-ride the general date format)

	$archive_day_date_format = 'Y/m/d';



	// options for weekly archive (only if you over-ride the general date format)

	$archive_week_start_date_format = 'Y/m/d';

	$archive_week_end_date_format	= 'Y/m/d';



	if ( !$archive_date_format_over_ride ) {

		$archive_day_date_format = get_option('date_format');

		$archive_week_start_date_format = get_option('date_format');

		$archive_week_end_date_format = get_option('date_format');

	}



	//filters

	$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

	$join = apply_filters( 'getarchives_join', '', $r );



	$output = '';



	if ( 'monthly' == $type ) {

		$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";

		$key = md5($query);

		$cache = wp_cache_get( 'wp_get_archives' , 'general');

		if ( !isset( $cache[ $key ] ) ) {

			$arcresults = $wpdb->get_results($query);

			$cache[ $key ] = $arcresults;

			wp_cache_set( 'wp_get_archives', $cache, 'general' );

		} else {

			$arcresults = $cache[ $key ];

		}

		if ( $arcresults ) {

			$afterafter = $after;

			foreach ( (array) $arcresults as $arcresult ) {

				$url = get_month_link( $arcresult->year, $arcresult->month );

				/* translators: 1: month name, 2: 4-digit year */

				$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year);

				if ( $show_post_count )

					$after = ' ('.$arcresult->posts.')' . $afterafter;

				$output .= get_archives_link($url, $text, $format, $before, $after);

			}

		}

	} elseif ('yearly' == $type) {

		$query = "SELECT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC $limit";

		$key = md5($query);

		$cache = wp_cache_get( 'wp_get_archives' , 'general');

		if ( !isset( $cache[ $key ] ) ) {

			$arcresults = $wpdb->get_results($query);

			$cache[ $key ] = $arcresults;

			wp_cache_set( 'wp_get_archives', $cache, 'general' );

		} else {

			$arcresults = $cache[ $key ];

		}

		if ($arcresults) {

			$afterafter = $after;

			foreach ( (array) $arcresults as $arcresult) {

				$url = get_year_link($arcresult->year);

				$text = sprintf('%d', $arcresult->year);

				if ($show_post_count)

					$after = ' ('.$arcresult->posts.')' . $afterafter;

				$output .= get_archives_link($url, $text, $format, $before, $after);

			}

		}

	} elseif ( 'daily' == $type ) {

		$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC $limit";

		$key = md5($query);

		$cache = wp_cache_get( 'wp_get_archives' , 'general');

		if ( !isset( $cache[ $key ] ) ) {

			$arcresults = $wpdb->get_results($query);

			$cache[ $key ] = $arcresults;

			wp_cache_set( 'wp_get_archives', $cache, 'general' );

		} else {

			$arcresults = $cache[ $key ];

		}

		if ( $arcresults ) {

			$afterafter = $after;

			foreach ( (array) $arcresults as $arcresult ) {

				$url	= get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth);

				$date = sprintf('%1$d-%2$02d-%3$02d 00:00:00', $arcresult->year, $arcresult->month, $arcresult->dayofmonth);

				$text = mysql2date($archive_day_date_format, $date);

				if ($show_post_count)

					$after = ' ('.$arcresult->posts.')'.$afterafter;

				$output .= get_archives_link($url, $text, $format, $before, $after);

			}

		}

	} elseif ( 'weekly' == $type ) {

		$week = _wp_mysql_week( '`post_date`' );

		$query = "SELECT DISTINCT $week AS `week`, YEAR( `post_date` ) AS `yr`, DATE_FORMAT( `post_date`, '%Y-%m-%d' ) AS `yyyymmdd`, count( `ID` ) AS `posts` FROM `$wpdb->posts` $join $where GROUP BY $week, YEAR( `post_date` ) ORDER BY `post_date` DESC $limit";

		$key = md5($query);

		$cache = wp_cache_get( 'wp_get_archives' , 'general');

		if ( !isset( $cache[ $key ] ) ) {

			$arcresults = $wpdb->get_results($query);

			$cache[ $key ] = $arcresults;

			wp_cache_set( 'wp_get_archives', $cache, 'general' );

		} else {

			$arcresults = $cache[ $key ];

		}

		$arc_w_last = '';

		$afterafter = $after;

		if ( $arcresults ) {

				foreach ( (array) $arcresults as $arcresult ) {

					if ( $arcresult->week != $arc_w_last ) {

						$arc_year = $arcresult->yr;

						$arc_w_last = $arcresult->week;

						$arc_week = get_weekstartend($arcresult->yyyymmdd, get_option('start_of_week'));

						$arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']);

						$arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']);

						$url  = sprintf('%1$s/%2$s%3$sm%4$s%5$s%6$sw%7$s%8$d', home_url(), '', '?', '=', $arc_year, '&', '=', $arcresult->week);

						$text = $arc_week_start . $archive_week_separator . $arc_week_end;

						if ($show_post_count)

							$after = ' ('.$arcresult->posts.')'.$afterafter;

						$output .= get_archives_link($url, $text, $format, $before, $after);

					}

				}

		}

	} elseif ( ( 'postbypost' == $type ) || ('alpha' == $type) ) {

		$orderby = ('alpha' == $type) ? 'post_title ASC ' : 'post_date DESC ';

		$query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit";

		$key = md5($query);

		$cache = wp_cache_get( 'wp_get_archives' , 'general');

		if ( !isset( $cache[ $key ] ) ) {

			$arcresults = $wpdb->get_results($query);

			$cache[ $key ] = $arcresults;

			wp_cache_set( 'wp_get_archives', $cache, 'general' );

		} else {

			$arcresults = $cache[ $key ];

		}

		if ( $arcresults ) {

			foreach ( (array) $arcresults as $arcresult ) {

				if ( $arcresult->post_date != '0000-00-00 00:00:00' ) {

					$url  = get_permalink( $arcresult );

					if ( $arcresult->post_title )

						$text = strip_tags( apply_filters( 'the_title', $arcresult->post_title, $arcresult->ID ) );

					else

						$text = $arcresult->ID;

					$output .= get_archives_link($url, $text, $format, $before, $after);

				}

			}

		}

	}

	if ( $echo )

		echo $output;

	else

		return $output;

}

3677

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: