web-dev-qa-db-ja.com

ループ内でthe_content()内のビデオと画像のみを表示する

私が解決しようとしている問題はWordPressループの中にあります、私はビデオ埋め込みまたは画像だけを表示したいです、どんなテキストでもないです。

現在、WordPressエディタで新しい投稿(標準フォーマット)を作成するとき、私の投稿のほとんどは次のようになります。

http://youtube.com/somevideo

Some supporting text below the video

そしてもちろん、WordPressはそこに入れたYouTubeやVimeoのリンクを使って自動的に埋め込まれたビデオを作成します。

投稿のリストを表示するとき、私はSome supporting text below the videoにビデオだけを表示させたくありません。

現在私のcontent.phpページはかなり基本的なもので、<?php the_content(); ?>を使って内容を表示しているだけです。

各投稿でこのテキストを削除する方法はありますか?

1
jamez14

これは get_media_embedded_in_content() 関数を使って行うことができます。

/**
 * Display only the first media item in the content
 *
 * @link http://wordpress.stackexchange.com/a/199398/26350
 */
! is_admin() && add_filter( 'the_content', function( $content )
{
    // Get the avialable media items from the content
    add_filter( 'media_embedded_in_content_allowed_types', 'wpse_media_types' );
    $media = get_media_embedded_in_content( $content );
    remove_filter( 'media_embedded_in_content_allowed_types', 'wpse_media_types' );

    // Only use the first media item if available 
    if( $media ) 
        $content = array_shift( $media );   

    return $content;
} , 99 );

カスタムのmedia typesを次のように定義することができます。

function wpse_media_types( $types )
{
   return [ 'audio', 'video', 'object', 'embed', 'iframe', 'img' ];
}

これは、コンテンツからすべてのURLを抽出し、それが使用可能なoEmbedであるかどうかを確認する別の方法です。

/**
 * Display only the first oEmbed in the content
 *
 * @link http://wordpress.stackexchange.com/a/199398/26350
 */
! is_admin() && add_filter( 'the_content', function( $content )
{
    require_once( ABSPATH . WPINC . '/class-oembed.php' );
    $wp_oembed = _wp_oembed_get_object();
    $urls = wp_extract_urls( $content );
    foreach( (array) $urls as $url )
    {
        if( $wp_oembed->get_provider( $url ) )
            $content = $url;
    }
    return $content;
}, 1 );

これを使用したい場所にさらに制限を追加することをお勧めします。

1
birgire