株式会社プロネット

 

WEBシステム開発、ITコンサルティング、自社サービス、教育事業 - これからのビジネスへのIT活用ソリューションをご提案致します。

【WordPress】カスタムフィールドの日付でカスタム投稿の年月別アーカイブ

2015.8.28(Fri) 09:49 | WordPress | sekiyama

環境

WordPress:4.2.3

参考にしたサイト

参考にしたサイトはこちらです。
ありがとうございました。

前回、カスタムフィールドの日付でカスタム投稿の年代別アーカイブについて投稿しましたが、今回は年月別です。

上記のサイトを参考に、以下のようにカスタマイズしましたー

function my_get_year_archives( $args = '' ) {
    global $wpdb, $wp_locale;
 
    $defaults = array(
        'date_field' => 'date',
        'format' => 'html',
        'echo' => true,
        'limit' => '',
        'before' => '',
        'after' => '', 
        'show_post_count' => true,
    );
 
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );
 
    if ( '' != $limit ) {
        $limit = absint( $limit );
        $limit = ' LIMIT '.$limit;
    }
 
    $field  = 'm.meta_value';
    $select = "SELECT SUBSTRING($field,1,4) AS `year`, SUBSTRING($field,6,2) AS `month`, count(p.ID) AS posts";
    $where  = "WHERE p.post_type = 'カスタム投稿名' AND p.post_status = 'publish'";
    $where .= $wpdb->prepare( ' AND m.meta_key = %s', $date_field );
    $join   = " INNER JOIN $wpdb->postmeta AS m ON m.post_id = p.ID";
     
    $where  = apply_filters( 'getarchives_where', $where, $r );
    $join   = apply_filters( 'getarchives_join' , $join , $r );
 
    $output = '';
    $query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4), SUBSTRING($field,6,2) ORDER BY $field DESC $limit";
    $key = md5( $query );
    $cache = wp_cache_get( 'my_get_year_archives' , 'general' );
    if ( !isset( $cache[ $key ] ) ) {
        $arcresults = $wpdb->get_results( $query );
        $cache[ $key ] = $arcresults;
        wp_cache_set( 'my_get_year_archives', $cache, 'general' );
    } else {
        $arcresults = $cache[ $key ];
    }
    if ( $arcresults ) {
        $afterafter = $after;
        foreach ( (array) $arcresults as $arcresult ) {
            //$url = add_query_arg( array( 'meta_key' => $date_field ), get_year_link( $arcresult->year ) );
            $url = add_query_arg( array( 'meta_key' => $date_field ), get_month_link( $arcresult->year, $arcresult->month) );
            $text = sprintf( '%d', $arcresult->year ).'/'.sprintf( '%d', $arcresult->month );
            if ($show_post_count)
                $after = ' ('.$arcresult->posts.')' . $afterafter;
            $output .= get_archives_link( $url, $text, $format, $before, $after );
        }
    }
         
    if ( $echo )
        echo $output;
    else
        return $output;
}
 
add_action( 'init', 'my_init' );
function my_init() {
    global $wp;
    $wp->add_query_var( 'meta_key' );
}
 
add_action( 'pre_get_posts', 'my_pre_get_posts' );
function my_pre_get_posts( $query ) {
    if ( $query->is_month ) {
        $meta_query = array(
            array( 
                'key'     => $query->get( 'meta_key' ),
                'value'   => $query->get( 'year'     ).'/'.sprintf('%02d', $query->get( 'monthnum'     )),
                'compare' => 'LIKE'
            ),
        );
 
        $query->set( 'meta_query' , $meta_query );
        $query->set( 'year'       , ''          );
        $query->set( 'monthnum'   , ''          );
        $query->set( 'date'       , ''          );
        $query->set( 'meta_key'   , ''          );
        $query->set( 'post_type'  , 'カスタム投稿名');
    }
}

ちなみに日付は2015/08/28とかで入ってるです。