Created
November 8, 2017 08:47
-
-
Save jjjjcccjjf/2b1135c429676f0bf0468c1a5de00c8d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function wp_get_archives( $args = '' ) { | |
global $wpdb, $wp_locale; | |
$defaults = array( | |
'type' => 'monthly', 'limit' => '', | |
'format' => 'html', 'before' => '', | |
'after' => '', 'show_post_count' => false, | |
'echo' => 1, 'order' => 'DESC', | |
'post_type' => 'post' | |
); | |
$r = wp_parse_args( $args, $defaults ); | |
$post_type_object = get_post_type_object( $r['post_type'] ); | |
if ( ! is_post_type_viewable( $post_type_object ) ) { | |
return; | |
} | |
$r['post_type'] = $post_type_object->name; | |
if ( '' == $r['type'] ) { | |
$r['type'] = 'monthly'; | |
} | |
if ( ! empty( $r['limit'] ) ) { | |
$r['limit'] = absint( $r['limit'] ); | |
$r['limit'] = ' LIMIT ' . $r['limit']; | |
} | |
$order = strtoupper( $r['order'] ); | |
if ( $order !== 'ASC' ) { | |
$order = 'DESC'; | |
} | |
// this is what will separate dates on weekly archive links | |
$archive_week_separator = '–'; | |
$sql_where = $wpdb->prepare( "WHERE post_type = %s AND post_status = 'publish'", $r['post_type'] ); | |
/** | |
* Filters the SQL WHERE clause for retrieving archives. | |
* | |
* @since 2.2.0 | |
* | |
* @param string $sql_where Portion of SQL query containing the WHERE clause. | |
* @param array $r An array of default arguments. | |
*/ | |
$where = apply_filters( 'getarchives_where', $sql_where, $r ); | |
/** | |
* Filters the SQL JOIN clause for retrieving archives. | |
* | |
* @since 2.2.0 | |
* | |
* @param string $sql_join Portion of SQL query containing JOIN clause. | |
* @param array $r An array of default arguments. | |
*/ | |
$join = apply_filters( 'getarchives_join', '', $r ); | |
$output = ''; | |
$last_changed = wp_cache_get_last_changed( 'posts' ); | |
$limit = $r['limit']; | |
if ( 'monthly' == $r['type'] ) { | |
$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts WHERE `post_type` = '$r[post_type]' $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit"; | |
$key = md5( $query ); | |
// var_dump($query); die(); | |
$key = "wp_get_archives:$key:$last_changed"; | |
if ( ! $results = wp_cache_get( $key, 'posts' ) ) { | |
$results = $wpdb->get_results( $query ); | |
wp_cache_set( $key, $results, 'posts' ); | |
} | |
if ( $results ) { | |
$after = $r['after']; | |
foreach ( (array) $results as $result ) { | |
$url = get_month_link( $result->year, $result->month ); | |
if ( 'post' !== $r['post_type'] ) { | |
$url = add_query_arg( 'post_type', $r['post_type'], $url ); | |
} | |
/* translators: 1: month name, 2: 4-digit year */ | |
$text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $result->month ), $result->year ); | |
if ( $r['show_post_count'] ) { | |
$r['after'] = ' <span>' . $result->posts . '</span>' . $after; # @jjjjcccjjf was here | |
} | |
$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] ); | |
} | |
} | |
} elseif ( 'yearly' == $r['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 $order $limit"; | |
$key = md5( $query ); | |
$key = "wp_get_archives:$key:$last_changed"; | |
if ( ! $results = wp_cache_get( $key, 'posts' ) ) { | |
$results = $wpdb->get_results( $query ); | |
wp_cache_set( $key, $results, 'posts' ); | |
} | |
if ( $results ) { | |
$after = $r['after']; | |
foreach ( (array) $results as $result) { | |
$url = get_year_link( $result->year ); | |
if ( 'post' !== $r['post_type'] ) { | |
$url = add_query_arg( 'post_type', $r['post_type'], $url ); | |
} | |
$text = sprintf( '%d', $result->year ); | |
if ( $r['show_post_count'] ) { | |
$r['after'] = ' (' . $result->posts . ')' . $after; | |
} | |
$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] ); | |
} | |
} | |
} elseif ( 'daily' == $r['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 $order $limit"; | |
$key = md5( $query ); | |
$key = "wp_get_archives:$key:$last_changed"; | |
if ( ! $results = wp_cache_get( $key, 'posts' ) ) { | |
$results = $wpdb->get_results( $query ); | |
wp_cache_set( $key, $results, 'posts' ); | |
} | |
if ( $results ) { | |
$after = $r['after']; | |
foreach ( (array) $results as $result ) { | |
$url = get_day_link( $result->year, $result->month, $result->dayofmonth ); | |
if ( 'post' !== $r['post_type'] ) { | |
$url = add_query_arg( 'post_type', $r['post_type'], $url ); | |
} | |
$date = sprintf( '%1$d-%2$02d-%3$02d 00:00:00', $result->year, $result->month, $result->dayofmonth ); | |
$text = mysql2date( get_option( 'date_format' ), $date ); | |
if ( $r['show_post_count'] ) { | |
$r['after'] = ' (' . $result->posts . ')' . $after; | |
} | |
$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] ); | |
} | |
} | |
} elseif ( 'weekly' == $r['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` $order $limit"; | |
$key = md5( $query ); | |
$key = "wp_get_archives:$key:$last_changed"; | |
if ( ! $results = wp_cache_get( $key, 'posts' ) ) { | |
$results = $wpdb->get_results( $query ); | |
wp_cache_set( $key, $results, 'posts' ); | |
} | |
$arc_w_last = ''; | |
if ( $results ) { | |
$after = $r['after']; | |
foreach ( (array) $results as $result ) { | |
if ( $result->week != $arc_w_last ) { | |
$arc_year = $result->yr; | |
$arc_w_last = $result->week; | |
$arc_week = get_weekstartend( $result->yyyymmdd, get_option( 'start_of_week' ) ); | |
$arc_week_start = date_i18n( get_option( 'date_format' ), $arc_week['start'] ); | |
$arc_week_end = date_i18n( get_option( 'date_format' ), $arc_week['end'] ); | |
$url = add_query_arg( array( 'm' => $arc_year, 'w' => $result->week, ), home_url( '/' ) ); | |
if ( 'post' !== $r['post_type'] ) { | |
$url = add_query_arg( 'post_type', $r['post_type'], $url ); | |
} | |
$text = $arc_week_start . $archive_week_separator . $arc_week_end; | |
if ( $r['show_post_count'] ) { | |
$r['after'] = ' (' . $result->posts . ')' . $after; | |
} | |
$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] ); | |
} | |
} | |
} | |
} elseif ( ( 'postbypost' == $r['type'] ) || ('alpha' == $r['type'] ) ) { | |
$orderby = ( 'alpha' == $r['type'] ) ? 'post_title ASC ' : 'post_date DESC, ID DESC '; | |
$query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit"; | |
$key = md5( $query ); | |
$key = "wp_get_archives:$key:$last_changed"; | |
if ( ! $results = wp_cache_get( $key, 'posts' ) ) { | |
$results = $wpdb->get_results( $query ); | |
wp_cache_set( $key, $results, 'posts' ); | |
} | |
if ( $results ) { | |
foreach ( (array) $results as $result ) { | |
if ( $result->post_date != '0000-00-00 00:00:00' ) { | |
$url = get_permalink( $result ); | |
if ( $result->post_title ) { | |
/** This filter is documented in wp-includes/post-template.php */ | |
$text = strip_tags( apply_filters( 'the_title', $result->post_title, $result->ID ) ); | |
} else { | |
$text = $result->ID; | |
} | |
$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] ); | |
} | |
} | |
} | |
} | |
if ( $r['echo'] ) { | |
echo $output; | |
} else { | |
return $output; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment