dennis
Estoy trabajando en un sitio web para una banda donde puedes agregar conciertos y agregar las canciones tocadas en ese concierto específico.
Así que he creado dos tipos de publicaciones personalizadas: – concierto – canción
Obtuve un campo personalizado “Canciones” del tipo “Relación”. Este campo se muestra en el tipo de publicación personalizada. De esta manera puedo agregar canciones a un concierto específico. Esto funciona perfectamente.
Pero quiero mostrar algunas estadísticas en la página de inicio de ese sitio web: quiero contar cuántas veces se reproduce una canción específica y mostrar el top 10. Así que supongo que tengo que recorrer el tipo de publicación personalizada del concierto y contar la relación. con ‘canciones’.
Pensé que esto haría el truco:
<?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(); ?>
Puede encontrar el resultado de print_r aquí: http://snippi.com/s/njzg3uu
Por ejemplo: la canción “Un recuerdo” está en 2 conciertos. Es por eso que puedes encontrarlo dos veces en la matriz. La canción “Wasted” solo se puede encontrar una vez, porque está en 1 concierto.
Puedes usar este código para crear una matriz de todas las canciones:
<?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; ?>
El código anterior creará una matriz de ID de canciones y la cantidad de veces que se usa en el “concierto” de post_type.
Ahora puedes usar la matriz $countArray
y haz lo que quieras con el. En su ejemplo, desea ordenarlo, por lo que debe hacer arsort($countArray);
De esta forma, la matriz se ordena por su valor (la cantidad de veces que se reproduce) de mayor a menor.
Luego tienes que recorrer la matriz:
foreach ($countArray como $clave => $valor) { ?>
<?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
}
Así que el código completo es:
<?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(); ?>
Podrías hacer esto de manera simple y breve:
$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;
}
Intenté hacer dos tipos de publicaciones personalizadas (concierto, canciones) y conseguí números de canciones de esta manera que puedes mostrar en la página de inicio y también puedes dar condiciones en el último bucle foreach si cancion mas de una etc..
¡Espero que esto te ayudará!
Espero ayuda:
<?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(); ?>
-
Hola Dmitry, todavía da 0 como resultado. También he intentado hacer eco de “contar:”. get_field(‘canciones’, get_the_ID()); pero esto no imprime nada.
-Dennis
11 de noviembre de 2019 a las 17:28
-
No, tienes que recorrer el cpt ‘gig’ en lugar de las canciones. Porque tienes que comprobar cuántas veces se tocan las canciones en un concierto.
-Dennis
13 de noviembre de 2019 a las 15:27
Según entiendo tu pregunta, estás buscando generar una lista de las 10 mejores canciones que tienen la mayor cantidad de conciertos asociados. La mejor manera de abordar esto sería generar un conjunto que asignaría un identificador único y un valor de conteo de cuántas veces se han visto esas canciones.
Aquí hay un ejemplo:
<?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);
}
Después puede ordenar y manipular los $set
variable sin embargo usted siente para obtener los datos que desea de él.
Avíseme si malinterpreté sus preguntas y puedo proporcionarle otra respuesta.
intentar
var_dump(get_field('songs'))
y ver lo que está realmente en su campo.– Stender
12 de noviembre de 2019 a las 11:22
@Stender Obtengo NULL como resultado.
-Dennis
13 de noviembre de 2019 a las 11:25
Está bien, me estoy acercando. He cambiado el tipo de publicación en el bucle. No tengo que mirar las canciones, sino los conciertos. Porque tengo que comprobar cuántas veces estuvo una canción en un concierto. Puede consultar mi salida var_dump aquí: snippi.com/s/njzg3uu La canción “A Memory” está en 2 conciertos. Entonces ves que esta canción se muestra dos veces en la matriz.
-Dennis
13 de noviembre de 2019 a las 11:42
@Stender Lo que finalmente quiero lograr es una lista de las 10 canciones más reproducidas.
-Dennis
13 de noviembre de 2019 a las 15:16