web-dev-qa-db-fra.com

Condition de shortcode audio ou playlist en fonction de la quantité de fichiers sur la page de pièce jointe

Mon objectif est de créer un site de musique et de divertissement où les utilisateurs auront la possibilité de partager de la musique et des vidéos sur d’autres sites Web via un code intégré. J'utilise les pages de pièce jointe audio.php et video.php pour charger le lecteur HTML5 MediaElement.js par défaut avec tous les médias joints de sa publication parent. Je me connecte ensuite à cette page de pièce jointe via Iframe, ce qui crée un code intégré pour chaque publication audio et vidéo.

Je suis sûr qu'un plugin serait une bien meilleure solution mais c'est ce que je peux faire avec mon niveau de compétence actuel.

C'est ce que j'ai eu jusqu'à présent.

Pour la playlist:

<?php
 global $post; 
    $args = array(
    'post_parent' => $post->post_parent, 
    'numberposts' => -1, 
    'post_status' => 'null', 
    'post_type' => 'attachment', 
    'post_mime_type' => array('audio'), 
    'order' => 'ASC' ); 

    $attachments = get_posts($args);
    $medias = $attachments;

    if (count($medias) > 0) {
        $array = array();
        foreach($medias as $media) {
            $array[] = $media->ID;
        }

        $id_comma_separated = implode(',', $array);
        echo do_shortcode('[playlist ids="' . $id_comma_separated . '"]');
    }
?>

Et pour l'audio unique.

<?php
 global $post; 
    $args = array(
    'post_parent' => $post->post_parent, 
    'numberposts' => 1, 
    'post_status' => 'null', 
    'post_type' => 'attachment', 
    'post_mime_type' => array('audio'), 
    'order' => 'ASC' ); 

    $attachments = get_posts($args);
    $medias = $attachments;

    $medias = wp_get_attachment_url( $attachment_id, 'full' );
    echo do_shortcode('[audio src="' . $medias . '"]');
?>

Maintenant, évidemment, cela renvoie toujours deux lecteurs quoi qu'il en soit, je dois en faire une requête unique qui exécute le shortcode [audio] si un seul fichier audio est disponible et la liste de lecture s'il y a plus d'une pièce jointe audio dans la publication parent. .

C’est ce que j’ai eu, tout ce que j’ai essayé après cela a brisé la page des pièces jointes audio.

Je suis un designer et non un développeur, donc mes PHP sont très limitées. Par conséquent, s’il existe un meilleur moyen de faire tout ce processus, ce serait formidable.

Merci.

3
Chozen

Quelques idées pour votre fichier de pièces jointes:

Une simplification:

$tmp   = $post;                          // Store the current global post object
$post  = get_post( $post->post_parent ); // Use the post parent post object
$media = get_attached_media( 'audio' );
if( $media )
{
    $sc = "[audio]";
    if( count( $media ) > 1 )
    {
        $ids = join( ',', wp_list_pluck( $media, 'ID' ) );
        $sc = "[playlist ids=\"{$ids}\"]";      
    }
    echo do_shortcode( $sc );
}
$post = $tmp;                            // restore the right global $post object

où nous utilisons que le shortcode [audio] dépouillé, lit le fichier audio joint de la publication en cours.

Nous pouvons le simplifier davantage:

$tmp  = $post;  
$post = get_post( $post->post_parent ); 
if( $media = get_attached_media( 'audio' ) )
{
    $sc = "[audio]";
    if( count( $media ) > 1 )
        $sc = '[playlist]';
    echo do_shortcode( $sc );
}
$post = $tmp; 

où le shortcode [playlist] décodé lit les fichiers audio joints de la publication en cours.

Même version plus courte:

$tmp  = $post;  
$post = get_post( $post->post_parent );
if( $media = get_attached_media( 'audio' ) )            
    echo count( $media ) > 1 ? wp_playlist_shortcode() : wp_audio_shortcode();
$post = $tmp; 

où nous utilisons le audio et playlist les rappels en shortcode directement.

... et enfin:

$tmp  = $post;  
$post = get_post( $post->post_parent ); 
echo count( get_attached_media( 'audio' ) ) > 1 ? wp_playlist_shortcode() : wp_audio_shortcode();
$post = $tmp; 

Notez que nous supposons que nous sommes dans la boucle.

Modifiez la page de la pièce jointe via un filtre:

Si vous souhaitez ajouter le lecteur audio/playlist au contenu de la pièce jointe, vous pouvez par exemple:

/**
 * Append the audio/playlist from the parent post, to the attachment's content.
 *
 * @see http://wordpress.stackexchange.com/a/176600/26350
 */

add_filter( 'the_content', function( $content )
{
    if( is_attachment() )
    {
        global $post;
        $tmp = $post;
        $post = get_post( $post->post_parent );
        $content .= count( get_attached_media( 'audio' ) ) > 1 ? wp_playlist_shortcode() : wp_audio_shortcode();
        $post = $tmp;
    }
    return $content;
});            
2
birgire

OK, donc j'ai compris, je suis sûr que ce sont des façons beaucoup plus élégantes de faire cela, mais cela fonctionne pour ce que je devais faire.

    <?php
        // Single Audio & Playlist player   
     global $post; 
        $args = array(
        'post_parent' => $post->post_parent, 
        'numberposts' => -1, 
        'post_status' => 'null', 
        'post_type' => 'attachment', 
        'post_mime_type' => array('audio', 'video'), 
        'order' => 'ASC' ); 

        $medias = get_posts($args);

        // If the available audio attachments are less than or equal to 1   
        if (count($medias) <= 1) {

            $medias = wp_get_attachment_url( $attachment_id, 'full' );
            echo do_shortcode('[audio src="' . $medias . '"]'); 

            // Get the artwork for single audio
            $attachment_id = $attachment->ID;
            $attachment_page = get_attachment_link( $attachment_id );   
            echo wp_get_attachment_image( $attachment_id );

            // The parent post link and title
            $parentTitle = get_the_title($post->post_parent);
            echo '<div class="parent-post-name">' . $parentTitle . '</div>';                        
            echo '<a class="parent-post-link" href=" ' . get_permalink($post->post_parent) . ' "> ' . $parentTitle . ' </a>';

        }

        // If the available audio attachments are more than or equal to 2
        elseif (count($medias) >= 2) {
            $array = array();
            foreach($medias as $media) {
                $array[] = $media->ID;
            }

            $id_comma_separated = implode(',', $array);
            echo do_shortcode('[playlist ids="' . $id_comma_separated . '"]');  
        } 

    ?> 

Espérons que cela soit utile pour quelqu'un, j'ai repris quelques éléments dont j'avais besoin pour l'audio unique, mais pas pour la liste de lecture, qui est la déclaration conditionnelle dont j'avais le plus besoin pour styliser chaque joueur d'une certaine manière.

0
Chozen