我想创建一个日期档案,所有包含帖子的现有年份都出现在一个列表中,另一个列表包含一年中的12个月。
基本上是这样的:
2020、2019、2018、2017、2016
1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、12月
如果单击2019,它将显示2019年的所有帖子,如果单击2月,它将仅显示2月的帖子。但是你可以点击六月,显示2019年六月的帖子。其他的都一样。
我成功地显示了所有年份和月份,但我不希望每年都重复月份,而是让它们更像一个过滤器。
以下是我目前的代码:
function wp_custom_archive($args = \'\') {
global $wpdb, $wp_locale;
$defaults = array(
\'limit\' => \'\',
\'format\' => \'html\', \'before\' => \'\',
\'after\' => \'\', \'show_post_count\' => false,
\'echo\' => 1
);
$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );
if ( \'\' != $limit ) {
$limit = absint($limit);
$limit = \' LIMIT \'.$limit;
}
// 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(\'customarchives_where\', "WHERE post_type = \'post\' AND post_status = \'publish\'", $r );
$join = apply_filters(\'customarchives_join\', "", $r);
$output = \'<ul>\';
$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_custom_archive\' , \'general\');
if ( !isset( $cache[ $key ] ) ) {
$arcresults = $wpdb->get_results($query);
$cache[ $key ] = $arcresults;
wp_cache_set( \'wp_custom_archive\', $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(__(\'%s\'), $wp_locale->get_month($arcresult->month));
$year_text = sprintf(\'<li>%d</li>\', $arcresult->year);
if ( $show_post_count )
$after = \' (\'.$arcresult->posts.\')\' . $afterafter;
$output .= ( $arcresult->year != $temp_year ) ? $year_text : \'\';
$output .= get_archives_link($url, $text, $format, $before, $after);
$temp_year = $arcresult->year;
}
}
$output .= \'</ul>\';
if ( $echo )
echo $output;
else
return $output;
}
编辑:
在设法使功能正常工作后,月份过滤器将“刷新”并返回到最近一年,但会正确重定向到特定的存档页面。是否可以获取该月的选定年份?
最合适的回答,由SO网友:Tom J Nowell 整理而成
这很简单,我们可以利用WordPress URL的工作方式,直接在URL中传递查询变量:
<form action="/" method="GET">
<select name="year">
<option value="2017>2017</option>
... etc ..
</select>
<select name="month">
<option value="01>01</option>
... etc ..
</select>
<input type="submit" value="Filter"/>
</form>
WP将看到它是一个日期档案,它甚至可能301重定向到相应的日期档案(我的网站重定向
?year=2019&m=01
到
/2019/?m=01
).
We can similarly make hyperlink versions 具有get_year_link
和get_month_link
.
重要的是,如果你想要一个单一的年份列表和一个单一的月份列表,then you must restrict the months to a single year. 用户需要单击年份,然后单击年份存档中的月份。
首先,显示年份:
wp_get_archives( [
\'type\' => \'yearly\',
\'format\' => \'html\',
\'show_post_count\' => 0,
] );
然后通过指定年份显示各个月份:
wp_get_archives( [
\'type\' => \'monthly\',
\'year\' => is_year() ? get_query_var( \'year\' ) : date(\'Y\'),
\'format\' => \'html\',
\'show_post_count\' => 0,
] );
最后,我们可以使用以下内容将月份过滤到当年:
add_filter( \'getarchives_where\', \'wp_get_archives_month_filter\', 10, 2 );
function wp_get_archives_month_filter($where, $args){
if ( \'monthly\' !== $args[\'type\'] ) {
return $where;
}
$year = $args[\'year\'];
$start = date( \'Y-m-d\', strtotime( $year . \'-01-01\' ) );
$end = date( \'Y-m-d\', strtotime( $year . \'-12-31\' ) );
$where.= \' AND `post_date` BETWEEN "\' . $start . \'" AND "\'. $end . \'"\';
return $where;
}