按年和月对帖子进行存档过滤

时间:2020-11-13 作者:Anta

我想创建一个日期档案,所有包含帖子的现有年份都出现在一个列表中,另一个列表包含一年中的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 = \'&nbsp;(\'.$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;
}
编辑:

在设法使功能正常工作后,月份过滤器将“刷新”并返回到最近一年,但会正确重定向到特定的存档页面。是否可以获取该月的选定年份?

1 个回复
最合适的回答,由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_linkget_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;
    }

相关推荐

ACF Date Based wp_query

我一直在尝试根据使用高级自定义字段创建的end\\u date自定义字段订购这些展览。我无法正常工作。我首先需要最近的约会。我也只需要在exhibition_status 属于past. 对于我的生活,我不能让这个工作,下面的代码只是最新的非工作互动。$args = array ( \'post_type\' => \'exhibitions\', \'meta_query\' => array( \'rel