Roman
Roman

Reputation: 45

Wordpress query odererd by acf-field with title

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

1926

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?

Upvotes: 0

Views: 145

Answers (2)

Buttered_Toast
Buttered_Toast

Reputation: 991

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

Upvotes: 1

Sharanjit Singh
Sharanjit Singh

Reputation: 136

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!

Upvotes: 0

Related Questions