web-dev-qa-db-fra.com

Obtenir la première vidéo de la publication (codes courts intégrés et vidéo)

Le but est de récupérer la première vidéo (incorporée ou shortcode) à partir de la publication. Nous devons donc vérifier le contenu du post s'il contient des vidéos incorporées (prises en charge par WP) ou des codes courts [vidéo]. Plusieurs vidéos et intégrations pourraient exister dans un seul post. Si vous en trouvez, retournez le tout premier d'entre eux, non pas en fonction de l'ordre de correspondance des motifs, mais en ordre, ils ont été insérés dans le message.

Voici mes progrès jusqu'à présent ...

Celui-ci retourne le premier shortcode [vidéo]. Existe-t-il un moyen de faire en sorte qu’il recherche non seulement des codes courts vidéo, mais également des opérations intégrées?

function theme_self_hosted_videos() {
global $post;
$pattern = get_shortcode_regex();
  if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) && array_key_exists( 2, $matches ) && in_array( 'video', $matches[2] ) ) {
    $videos = $matches[0];
    $i = 0;
    foreach ($videos as $video ) {
        if($i == 0) {
            echo do_shortcode($video);
        }
        $i++;
    }
  }
  return false;
}
add_action( 'wp', 'theme_self_hosted_videos' );

Voici ma progression actuelle d'une fonction pour retourner la première vidéo intégrée à partir du message. Ne fonctionne pas comme prévu, cependant. Cela dépend évidemment de l'ordre de pattern_array et peut-être des patterns eux-mêmes ...

function theme_oembed_videos() {

global $post;

// Here is a sample array of patterns for supported video embeds from wp-includes/class-wp-embed.php
$pattern_array = array(
    '#https://youtu\.be/.*#i',
    '#https://(www\.)?youtube\.com/playlist.*#i',
    '#https://(www\.)?youtube\.com/watch.*#i',
    '#http://(www\.)?youtube\.com/watch.*#i',
    '#http://(www\.)?youtube\.com/playlist.*#i',
    '#http://youtu\.be/.*#i',
    '#https?://wordpress.tv/.*#i',
    '#https?://(.+\.)?vimeo\.com/.*#i'
);

foreach ($pattern_array as $pattern) {

    if (preg_match_all($pattern, $post->post_content, $matches)) {
        return wp_oembed_get( $matches[0] );
    }
    return false;

}

}
6
Nikita

Vous pouvez essayer de mélanger tous les modèles ensemble dans une grande expression rationnelle ou de procéder à une analyse ligne par ligne simple du contenu:

function theme_oembed_videos() {

    global $post;

    if ( $post && $post->post_content ) {

        global $shortcode_tags;
        // Make a copy of global shortcode tags - we'll temporarily overwrite it.
        $theme_shortcode_tags = $shortcode_tags;

        // The shortcodes we're interested in.
        $shortcode_tags = array(
            'video' => $theme_shortcode_tags['video'],
            'embed' => $theme_shortcode_tags['embed']
        );
        // Get the absurd shortcode regexp.
        $video_regex = '#' . get_shortcode_regex() . '#i';

        // Restore global shortcode tags.
        $shortcode_tags = $theme_shortcode_tags;

        $pattern_array = array( $video_regex );

        // Get the patterns from the embed object.
        if ( ! function_exists( '_wp_oembed_get_object' ) ) {
            include ABSPATH . WPINC . '/class-oembed.php';
        }
        $oembed = _wp_oembed_get_object();
        $pattern_array = array_merge( $pattern_array, array_keys( $oembed->providers ) );

        // Or all the patterns together.
        $pattern = '#(' . array_reduce( $pattern_array, function ( $carry, $item ) {
            if ( strpos( $item, '#' ) === 0 ) {
                // Assuming '#...#i' regexps.
                $item = substr( $item, 1, -2 );
            } else {
                // Assuming glob patterns.
                $item = str_replace( '*', '(.+)', $item );
            }
            return $carry ? $carry . ')|('  . $item : $item;
        } ) . ')#is';

        // Simplistic parse of content line by line.
        $lines = explode( "\n", $post->post_content );
        foreach ( $lines as $line ) {
            $line = trim( $line );
            if ( preg_match( $pattern, $line, $matches ) ) {
                if ( strpos( $matches[0], '[' ) === 0 ) {
                    $ret = do_shortcode( $matches[0] );
                } else {
                    $ret = wp_oembed_get( $matches[0] );
                }
                return $ret;
            }
        }
    }
}

Vous pouvez également utiliser des transitoires pour les intégrations - voir cette réponse j’ai donné.

2
bonger

Vous pouvez utiliser la fonction get_media_embedded_in_content() pour les médias shortcode et incorporés (elle recherche les balises HTML suivantes: audio, vidéo, objet, incorporer ou iframe), veillez simplement à utiliser le contenu avec les filtres appliqués et le shortcode exécuté.

Par exemple:

$post_id = 125;
$post = get_post($post_id);

//Get the content, apply filters and execute shortcodes
$content = apply_filters( 'the_content', $post->post_content );
$embeds = get_media_embedded_in_content( $content );

//$embeds is an array and each item is the HTML of an embedded media.
//The first item of the array is the first embedded media in the content
$fist_embedded = $embeds[0];

Ajouter le code ci-dessus à une fonction similaire à la vôtre:

function get_first_embed_media($post_id) {

    $post = get_post($post_id);
    $content = do_shortcode( apply_filters( 'the_content', $post->post_content ) );
    $embeds = get_media_embedded_in_content( $content );

    if( !empty($embeds) ) {
        //return first embed
        return $embeds[0];

    } else {
        //No embeds found
        return false;
    }

}

Pour limiter les vidéos, vous pouvez faire quelque chose comme ceci:

function get_first_embed_media($post_id) {

    $post = get_post($post_id);
    $content = do_shortcode( apply_filters( 'the_content', $post->post_content ) );
    $embeds = get_media_embedded_in_content( $content );

    if( !empty($embeds) ) {
        //check what is the first embed containg video tag, youtube or vimeo
        foreach( $embeds as $embed ) {
            if( strpos( $embed, 'video' ) || strpos( $embed, 'youtube' ) || strpos( $embed, 'vimeo' ) ) {
                return $embed;
            }
        }

    } else {
        //No video embedded found
        return false;
    }

}

Remarque: Il y avait un bogue dans get_media_embedded_in_content() qui faisait que cette réponse ne fonctionnait pas comme prévu bellow WP 4.2.

12
cybmeta