Zählen Sie die Anzahl der Beziehungsposts in ACF

Lesezeit: 6 Minuten

Benutzer-Avatar
Dennis

Ich arbeite an einer Website für eine Band, auf der Sie Gigs und die bei diesem bestimmten Gig gespielten Songs hinzufügen können.

Also habe ich zwei benutzerdefinierte Beitragstypen erstellt: – Gig – Song

Ich habe ein benutzerdefiniertes Feld “Songs” vom Typ “Beziehung”. Dieses Feld wird im benutzerdefinierten Beitragstyp angezeigt. Auf diese Weise kann ich Songs zu einem bestimmten Gig hinzufügen. Das funktioniert perfekt.

Aber ich möchte einige Statistiken auf der Startseite dieser Website zeigen: Ich möchte zählen, wie oft ein bestimmtes Lied gespielt wird, und die Top 10 anzeigen. Also muss ich wohl den benutzerdefinierten Gig-Posttyp durchlaufen und die Relation zählen mit „Liedern“.

Ich dachte, das würde den Trick machen:

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

Das Ergebnis von print_r finden Sie hier: http://snippi.com/s/njzg3uu

Zum Beispiel: Der Song „A memory“ ist auf 2 Gigs. Deshalb finden Sie es zweimal im Array. Der Song „Wasted“ ist nur einmal zu finden, da er auf 1 Gig ist.

  • versuchen zu var_dump(get_field('songs')) und sehen, was tatsächlich in Ihrem Bereich ist.

    – Ständer

    12. November 2019 um 11:22 Uhr

  • @Stender Ich bekomme NULL als Ergebnis.

    – Denis

    13. November 2019 um 11:25 Uhr

  • Okay, ich komme näher. Ich habe den Beitragstyp in der Schleife geändert. Ich muss nicht über die Songs schauen, sondern über Gigs. Weil ich checken muss, wie oft ein Song in einem Gig war. Sie können meine var_dump-Ausgabe hier überprüfen: snippi.com/s/njzg3uu Der Song “A Memory” ist in 2 Gigs. Sie sehen also, dass dieses Lied zweimal im Array angezeigt wird.

    – Denis

    13. November 2019 um 11:42 Uhr

  • @Stender Was ich letztendlich erreichen möchte, ist eine Liste der 10 meistgespielten Songs.

    – Denis

    13. November 2019 um 15:16 Uhr

Sie können diesen Code verwenden, um ein Array aller Songs zu erstellen:

<?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; ?>

Der obige Code erstellt ein Array von Post-IDs von Songs und der Häufigkeit, mit der sie im post_type “gig” verwendet werden.

Jetzt können Sie das Array verwenden $countArray und mach damit was du willst. In Ihrem Beispiel möchten Sie es sortieren, also müssen Sie es tun arsort($countArray); Auf diese Weise wird das Array nach seinem Wert (wie oft gespielt) von hoch nach niedrig sortiert.

Dann müssen Sie das Array durchlaufen:
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  
}

Der vollständige Code lautet also:

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

Sie könnten dies auf einfache und kurze Weise tun:

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

Ich habe es versucht, indem ich zwei benutzerdefinierte Beitragstypen (Gig, Songs) erstellt habe, und ich habe auf diese Weise die Anzahl der Songs erhalten, die Sie auf der Startseite anzeigen können, und Sie können auch die Bedingung zuletzt angeben für jede Schleife wenn Lied mehr als eins etc..

Hoffe das wird dir helfen!

Hoffe auf Hilfe:

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

  • Hallo Dmitry, es gibt immer noch 0 als Ergebnis. Ich habe auch versucht, “count: ” zu echoen. get_field(‘Lieder’, get_the_ID()); aber das druckt nichts.

    – Denis

    11. November 2019 um 17:28 Uhr

  • Nein, Sie müssen den cpt ‘gig’ anstelle von Songs überschleifen. Denn man muss prüfen, wie oft Songs bei einem Gig gespielt werden.

    – Denis

    13. November 2019 um 15:27 Uhr

Ich verstehe Ihre Frage so, dass Sie versuchen, eine Top-10-Liste der Songs zu erstellen, die die meisten Auftritte haben. Der beste Weg, dies anzugehen, wäre, einen Satz zu generieren, der eine eindeutige Kennung und einen Zählwert dafür abbildet, wie oft dieser Song gesehen wurde.

Hier ist ein Beispiel:

 <?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);
}

Anschließend können Sie die Dateien sortieren und manipulieren $set Variable, wie Sie möchten, um die gewünschten Daten zu erhalten.

Lassen Sie mich wissen, wenn ich Ihre Fragen falsch interpretiert habe, und ich kann eine andere Antwort geben.

1373580cookie-checkZählen Sie die Anzahl der Beziehungsposts in ACF

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy