Подсчитайте количество постов отношения в ACF - PullRequest
5 голосов
/ 11 ноября 2019

Я работаю над сайтом для группы, где вы можете добавлять концерты и добавлять песни, исполняемые на этом конкретном концерте.

Итак, я создал два пользовательских типа постов: - гиг - песня

Я получил настраиваемое поле «Песни» типа «Отношения». Это поле отображается в пользовательском типе сообщения. Таким образом, я могу добавлять песни на конкретный концерт. Это прекрасно работает.

Но я хочу показать некоторую статистику на домашней странице этого сайта: я хочу посчитать, сколько раз конкретная песня воспроизводится, и показать топ-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

Например: песня "Память" идет на 2 концерта. Вот почему вы можете найти его дважды в массиве. Песню "Wasted" можно найти только один раз, потому что она на 1 концерте.

Ответы [ 4 ]

4 голосов
/ 19 ноября 2019

Вы можете использовать этот код для создания массива всех песен:

<?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 ".

Теперь вы можете использовать массив $countArray и делать с ним все, что захотите. В вашем примере вы хотите отсортировать его, поэтому вы должны сделать arsort($countArray); Таким образом, массив будет отсортирован по его значению (количество раз воспроизведено) от высокого к низкому.

Тогда у вас естьцикл по массиву: foreach ($ countArray как $ 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(); ?>
2 голосов
/ 19 ноября 2019

Вы могли бы сделать это простым и коротким способом:

$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;
}

Я попробовал сделать два пользовательских типа поста (концерт, песни), и я получил подсчет количества песен таким способом, который вы можете показатьна домашней странице, а также вы можете указать условие в последнем цикле foreach , если песня более одного и т. д.

Надеюсь, это поможет вам!

1 голос
/ 14 ноября 2019

Насколько я понимаю, ваш вопрос заключается в том, что вы пытаетесь создать список из 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 и манипулировать ею по своему усмотрению, чтобы получить необходимые данные.

Дайте мне знать, если я неверно истолковал ваши вопросы, и я могу дать другой ответ.

1 голос
/ 11 ноября 2019

Надежда поможет:

<?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(); ?>
...