it-swarm.com.de

Holen Sie sich das erste Video von der Post (sowohl eingebettete als auch Video-Shortcodes)

Ziel ist es, das erste Video (Embed oder Shortcode) aus dem Beitrag zu holen. Wir müssen also prüfen, ob der Inhalt der Posts eingebettete Videos (unterstützt von WP) oder [video] -Verknüpfungscodes enthält. In einem Beitrag können mehrere Videos und Einbettungen vorhanden sein. Falls vorhanden - gib das allererste von ihnen zurück, nicht abhängig von der Reihenfolge der übereinstimmenden Muster, sondern von der Reihenfolge, in der sie in den Beitrag eingefügt wurden.

Hier ist mein Fortschritt bis jetzt ...

Dieser gibt den ersten [Video] Shortcode zurück. Gibt es eine Möglichkeit, nicht nur nach Video-Shortcodes, sondern auch nach Einbettungen zu suchen?

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' );

Hier ist mein aktueller Fortschritt einer Funktion zum Zurückgeben des ersten eingebetteten Videos aus dem Beitrag. Funktioniert jedoch nicht wie erwartet. Kommt natürlich auf die Reihenfolge von $ pattern_array und vielleicht auf die Muster selbst an ...

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

Sie können versuchen, alle Muster in einem großen regulären Ausdruck zusammenzufassen oder den Inhalt einfach zeilenweise zu analysieren:

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

Vielleicht möchten Sie auch Transienten für die Einbettungen verwenden - siehe diese Antwort , die ich gegeben habe.

2
bonger

Sie können die Funktion get_media_embedded_in_content() sowohl für Shortcode- als auch für eingebettete Medien verwenden (es werden die folgenden HTML-Tags gesucht: Audio, Video, Objekt, Einbettung oder Iframe). Verwenden Sie nur den Inhalt mit angewendeten Filtern und ausgeführtem Shortcode.

Zum Beispiel:

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

Hinzufügen des obigen Codes zu einer ähnlichen Funktion wie Ihrer:

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

}

Um nur Videos einzuschränken, können Sie Folgendes tun:

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

}

Hinweis: Es gab einen Fehler in get_media_embedded_in_content(), der dazu führte, dass diese Antwort nicht wie erwartet funktionierte bellow WP 4.2.

12
cybmeta