web-dev-qa-db-ja.com

投稿が公開された年のリストを取得する

カスタム投稿タイプから投稿のリストを作成し、ユーザーがリストをフィルタリングするためにクリックできるフィルタを追加します。

Get_terms()関数を使用して、すべてのカテゴリにフィルタを追加しました。今、私は年ごとにフィルタを追加したいので、少なくとも1つの投稿が公開されているすべての年のリストを取得する方法が必要です...

私はちょうど何かが必要です:

$years = get_all_years_with_posts();
// returns array( 2011, 2013, 2014 )

すべての投稿を取得し、自分の年を確認し、自分でリストを作成することはできますが、他に方法はありませんか。

4
MikO

あなたの質問はかなり古くなっていますが、私はあなたの質問に本当の解決策を加えたいだけでした。投稿された投稿の年数を返す関数があります。この関数はfunctions.phpやプラグイン、あるいはその他何でも構いません。

function get_posts_years_array() {
    global $wpdb;
    $result = array();
    $years = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT YEAR(post_date) FROM {$wpdb->posts} WHERE post_status = 'publish' GROUP BY YEAR(post_date) DESC"
        ),
        ARRAY_N
    );
    if ( is_array( $years ) && count( $years ) > 0 ) {
        foreach ( $years as $year ) {
            $result[] = $year[0];
        }
    }
    return $result;
}

あなたはカスタム投稿タイプのためにそれをわずかに修正する必要があるでしょう...ただどこかにAND wp_posts.post_type = 'my_cpt'を追加してください。

8
Gavin

このようにWP関数とショートコードを使うことができます:

add_shortcode( 'archives', '_get_archived_posts' );
function _get_archived_posts( $atts ) {

 $a = shortcode_atts( array(
    'type'            => 'yearly',
    'limit'           => '',
    'format'          => '', 
    'before'          => '',
    'after'           => '',
    'show_post_count' => false,
    'echo'            => 0,
    'order'           => 'DESC'
), $atts, 'filter_archives_sc' );

    return wp_get_archives($a);
}

出典

2
JMau

この関数を使用して、投稿年数をすべて配列で取得し、それを使用してループすることができます。

$terms_year = array(
    'post_type'         => array('YOUR_CPT'),
);

$years = array();
$query_year = new WP_Query( $terms_year );

if ( $query_jaar->have_posts() ) :
    while ( $query_year->have_posts() ) : $query_year->the_post();
        $year = get_the_date('Y');
        if(!in_array($year, $years)){
            $years[] = $year;
        }
    endwhile;
    wp_reset_postdata();
endif;

// Echo the years

echo '<pre>';
print_r($years);
echo '</pre>';
1
Lou Jonker