skip to Main Content

I need help with a WordPress query to get posts.

I have an ACF-numeric-Field called "year".
I need a query to get posts who have entered a year, and the year is echoed as title.

Someting like

1925

  • Post A
  • Post B
  • Post D

1926

  • Post C
  • Post E

This is waht I have so far to get posts with a "year" set and ordered by.

<?php 
$args = array(
    'numberposts'   => -1,
    'post_type'     => 'artikel',
    
    'meta_query'    => array(
        'relation'      => 'AND',
        array(
            'key'       => 'year',
            'compare'   => 'EXISTS'
        ),
        array(
            'key'       => 'year',
            'value'     => 1900,
            'type'      => 'NUMERIC',
            'compare'   => '>'
        )
    )
);

$the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>

Can someone help me how to put the year as the title?

2

Answers


  1. You can try this one:

    <?php 
    $args = array(
        'posts_per_page' => -1,
        'post_type'     => 'artikel',
        'meta_key'      => 'year',
        'orderby'       => 'meta_value_num',
        'order' => 'DESC',
    );
    
    $the_query = new WP_Query( $args );
    ?>
    <?php if( $the_query->have_posts() ): ?>
    

    Hope it will be work!

    Login or Signup to reply.
  2. If $the_query has values than you can do this

    // assuming that all posts are sorted by year. 1925, 1926, 1930 etc...
    $the_query = new WP_Query($args);
    
    // will contain all posts sorted by year
    $posts_by_year = [];
    
    // start looping through the posts
    if ($the_query->have_posts()) {
        while ($the_query->have_posts()) {
            $the_query->the_post();
    
            // get year ACF field
            $year = get_field('year');
    
            // check if $posts_by_year already has year, if not create and add the post, if exists just add the post
            if (isset($posts_by_year[$year])) {
                $posts_by_year[$year][] = get_post();
            } else {
                $posts_by_year[$year] = [
                    get_post()
                ];
            }
    
        }
    }
    wp_reset_postdata();
    
    // check if we have any posts
    if (!empty($posts_by_year)) {
        foreach ($posts_by_year as $year => $posts) {
            echo '<div class="year-block">';
            echo   '<strong class="year-title">' . $year . '</strong>';
            echo   '<ul class="posts-by-year">';
    
            foreach ($posts as $post) {
                echo '<li>';
                echo   '<strong class="post-title">' . $post->post_title . '</strong>';
                echo '</li>';
            }
    
            echo   '</ul>';
            echo '</div>';
        }
    }
    

    Of course change the html formating how ever you want

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search