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
'source' 카테고리의 다른 글
다른 조건이 있는 경우 도커 파일(외부 인수 포함) (0) | 2023.10.08 |
---|---|
Oracle Session이란? (0) | 2023.10.08 |
까다로운 쿼츠.NET 시나리오 (0) | 2023.10.03 |
무슨 일이 있어도 최대 절전 모드에서 MySQL INSERT 문을 배치할 수 없습니다. (0) | 2023.10.03 |
SQL 디코딩 Null 값 (0) | 2023.10.03 |