source

ACF의 관련 게시물 수를 계산합니다.

manycodes 2023. 10. 3. 11:07
반응형

ACF의 관련 게시물 수를 계산합니다.

저는 밴드의 웹사이트에서 공연을 추가하고 그 공연에서 연주된 곡들을 추가할 수 있는 웹사이트를 만들고 있습니다.

그래서 저는 두 가지 맞춤형 게시물 유형을 만들었습니다. - gig - song.

'관계' 유형의 사용자 지정 필드 '노래'를 받았습니다.이 필드는 Custom Post Type에 표시됩니다.이렇게 하면 특정 공연에 노래를 추가할 수 있습니다.이것은 완벽하게 작동합니다.

하지만 저는 그 웹사이트의 홈페이지에 몇 가지 통계를 보여주고 싶습니다.특정 곡이 몇 번 재생되는지 세어보고 톱10을 보여주고 싶습니다.그래서 저는 긱 커스텀 포스트 타입을 반복해서 '노래'와의 관계를 세어봐야 할 것 같습니다.

이렇게 하면 효과가 있을 거라 생각했습니다.

<?php 
    $args = array(
        'post_type' => 'gig'
    ); 
?>

<?php $loop = new WP_Query($args); ?>

<?php if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <?php 
    print_r(get_field('songs'))
    //$song_count = count(get_field('songs')); 
    //echo $song_count . " ";

    the_title(); 

    ?><br />

<?php endwhile; ?>

<?php else: ?>
    <!-- No gigs available -->
<?php endif; ?>
<?php wp_reset_postdata(); ?>

print_r의 결과는 여기 http://snippi.com/s/njzg3uu 에서 확인할 수 있습니다.

예를 들어 "A memory"라는 노래가 2g에 나와 있습니다.그렇기 때문에 배열에서 두 번 찾을 수 있습니다.'Wasted'라는 곡은 한 번밖에 볼 수 없는 곡인데, 1g에 나오기 때문입니다.

이 코드를 사용하여 모든 곡의 배열을 만들 수 있습니다.

<?php 
    $args = array(
        'post_type' => 'gig'
    ); 

    $countArray = []; //create an array where you can put all the song id's and the number of times played
?>

<?php $loop = new WP_Query($args); ?>

<?php if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <?php
        $posts = get_field('songs');

        if( $posts ): 
                foreach( $posts as $post):
                    setup_postdata($post); 

                    //if the song id already exists -> count + 1
                    if (array_key_exists($post->ID, $countArray)){
                        $countArray[$post->ID]++;
                    }
                    else { // otherwise the song is played 1 time
                        $countArray[$post->ID] = 1;    
                    } 
                endforeach;

            wp_reset_postdata();
        endif;
    ?>

<?php endwhile; ?>

위의 코드는 post_type "gig"에 사용된 횟수와 노래의 post ID 배열을 만듭니다.

이제 배열을 사용할 수 있습니다.$countArray하고 싶은 거 다 해요예제에서는 정렬을 원하므로 다음 작업을 수행해야 합니다.arsort($countArray);이렇게 배열이 높은 값(재생 횟수)에서 낮은 값으로 정렬됩니다.

그런 다음 배열을 순환해야 합니다. 각 배열($count)에 대해배열은 $key => $value) {?>

<?php echo get_post_permalink($key); //=the permalink of the song ?>
<?php echo get_the_title($key); //= the title of the song ?>
<?php echo $value; //number of times play in a gig ?>

<?php  
}

전체 코드는 다음과 같습니다.

<?php 
    $args = array(
        'post_type' => 'gig'
    ); 

    $countArray = [];
?>

<?php $loop = new WP_Query($args); ?>

<?php if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <?php
        $posts = get_field('songs');

        if( $posts ): 
                foreach( $posts as $post):
                    setup_postdata($post); 

                    if (array_key_exists($post->ID, $countArray)){
                        $countArray[$post->ID]++;
                    }
                    else {
                        $countArray[$post->ID] = 1;    
                    } 
                endforeach;

            wp_reset_postdata();
        endif;
    ?>

<?php endwhile; ?>

<?php
    arsort($countArray);

    foreach ($countArray as $key => $value) {
    ?>

        <?php echo get_post_permalink($key); //=the permalink of the song ?>
        <?php echo get_the_title($key); //= the title of the song ?>
        <?php echo $value; //number of times play in a gig ?>

    <?php  
    }
?>

<?php else: ?>
    <!-- No gigs available -->
<?php endif; ?>
<?php wp_reset_postdata(); ?>

단순하고 짧은 방법으로 이를 수행할 수 있습니다.

$args = array(
    'post_type' => 'gig'
); 
$gigs =  get_posts($args);
$songsarr = array();
foreach($gigs  as $gig) {
   $posts = get_field('songs', $gig->ID);
   array_push($songsarr,$posts[0]);
}
//echo "<pre>;
//print_r($songsarr);

$countsongs = array_count_values($songsarr);
echo 'No. of Duplicate Items: '.count($countsongs).'<br><br>';
// print_r($countsongs);

foreach($countsongs as $songID => $songname){
    echo get_the_title( $songID );
    echo $songname;
}

나는 두 개의 사용자 지정 게시물 유형(긱, 노래)을 만들어 시도했고 홈 페이지에서 보여줄 수 있는 노래의 개수를 세었고 또한 하나 이상의 노래가 나오면 각 루프마다 마지막에 조건을 부여할 수 있습니다.

이것이 당신에게 도움이 되기를 바랍니다!

도움말을 희망합니다.

<?php 
    $args = array(
        'post_type' => 'song'
    ); 
?>

<?php $loop = new WP_Query($args); ?>

<?php if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <?php 
    $song_count = count(get_field('songs', get_the_ID())); <-- add 
    echo $song_count . " ";

    the_title(); 

    ?><br />

<?php endwhile; ?>

<?php else: ?>
    <!-- No gigs available -->
<?php endif; ?>
<?php wp_reset_postdata(); ?>

당신의 질문에 대해 이해하자면, 당신은 가장 많은 연관성을 가진 노래들의 상위 10개 목록을 생성하려고 하는 것입니다.이에 접근하는 가장 좋은 방법은 고유한 식별자와 해당 노래를 몇 번 봤는지에 대한 카운트 값을 매핑하는 집합을 생성하는 것입니다.

다음은 예입니다.

 <?php

// Get all the posts
$gigs = get_posts([
    'post_type' => 'gigs',
    'numberposts' => -1
]);

// We will use this array to key a running tally of
$set = [];

// If the key doesn't exist yet on the array, then we will initialize it, otherwise, increment the count
function add_set_element(&$set, $key) {
    if (!isset($set[$key])) {
        $set[$key] = 1;
    } else {
        $set[$key]++;
    }
}

function iterate_songs($songs, &$set){
    /** @var WP_Post $song */
    foreach($songs as $song) {
        $key = $song->post_title;// This can be what ever unique identifier you want to get from $song object, such as ID or title
        add_set_element($set, $key);
    }
}

foreach($gigs as $gig) {
    setup_postdata($gig);
    $songs = get_the_field('songs');
    iterate_songs($songs, $set);
}

그 후에 당신은 분류하고 조작할 수 있습니다.$set변수에서 원하는 데이터를 얻을 수 있습니다.

제가 당신의 질문을 잘못 이해한 것이 있으면 알려주시면 다른 답변을 드릴 수 있습니다.

언급URL : https://stackoverflow.com/questions/58800667/count-the-number-of-relation-posts-in-acf

반응형