web-dev-qa-db-ja.com

添付ページのファイル数に応じたオーディオまたはプレイリストのショートコード条件

私がこれをする理由は、ユーザーが埋め込みコードを介して他のウェブサイトで音楽やビデオを共有することができる音楽&エンターテイメントサイトのためです。私はaudio.phpとvideo.phpの添付ページを使用して、デフォルトのMediaElement.js HTML5プレーヤーをその親投稿からのすべての添付メディアと共にロードします。それから私はIframeを通してその添付ファイルページにリンクします、その結果、それぞれのオーディオとビデオ投稿のための埋め込みコードになります。

私はプラグインがはるかに良い解決策になると確信していますが、これは私が私の現在のスキルレベルでできることです。

これは私がこれまでに得たものです。

プレイリストの場合:

<?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 . '"]');
    }
?>

そしてシングルオーディオ用です。

<?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 . '"]');
?>

これは明らかにこれは常に2人のプレーヤーを返します、私はこれを1つのオーディオのみが利用可能な場合は[audio]ショートコードを、親の投稿に複数のオーディオ添付ファイルがある場合は[playlist]を実行する単一クエリー。

これは私が得た限りでは、これ以降に試したすべてがオーディオ添付ファイルのページを壊した。

私は開発者ではないデザイナーなので、私のPHPスキルは非常に限られています。そのため、これをすべて行うためのより良い方法があれば、それは素晴らしいことです。

ありがとう。

3
Chozen

添付ファイルのいくつかのアイデア:

単純化

$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

ここでは、削除された[audio]ショートコードが、現在の投稿に添付されているオーディオファイルを再生します。

もっと単純化することができます。

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

削除された[playlist]ショートコードは、現在の投稿に添付されているオーディオファイルを再生します。

もっと短いバージョン:

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

ここでは、オーディオプレイリストのショートコードコールバックを直接使用します。

... そして最後に:

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

ループに入っていると仮定していることに注意してください。

フィルタを使用して添付ファイルのページを変更します。

添付ファイルのコンテンツにオーディオ/プレイリストプレーヤーを追加する場合は、次のように試すことができます。

/**
 * 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

わかりました、私はそれを考え出しました、私は彼らがこれをすることのはるかにエレガントな方法であると確信しています、しかしそれは私がする必要があることのために働きます。

    <?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 . '"]');  
        } 

    ?> 

これが誰かに役立つことを願っています、私は私が私がそれぞれのプレーヤーを特定の方法でスタイルするために最も必要とした条件ステートメントであるプレイリストではなく、私が必要としたいくつかの事柄をエコーし​​ました。

0
Chozen