web-dev-qa-db-fra.com

comment utiliser preg_replace pour wordpress video?

J'essaie de formater la vidéo de mon blog wordpress pour mes pages d'amplis. Le code que j'utilise dans l'éditeur de contenu est:

[video width="768" height="576" mp4="https://mywebsite.com/wp-content/uploads/20**/0*/video-name.mp4"][/video]

Je souhaite afficher cette vidéo dans les pages AMP au format suivant:

<amp-video controls
width="640"
height="360"
layout="responsive">
  <source src="https://mywebsite.com/wp-content/uploads/20**/0*/video-name.mp4" />
</amp-video>

J'ai essayé de suivre des fonctions mais elles n'ont pas fonctionné pour moi.

Essayez 1:

function am_video_amp_format($content){
            global $post;
            $pattern ="~<video(.*?)></video>~i";
            $replacement = '<amp-video controls
                              width="640"
                              height="360"
                              layout="responsive">
                              <source src="$2" />
                            </amp-video>';
            $content = preg_replace($pattern, $replacement, $content);
            return $content;
        }
        add_filter('the_content', 'am_video_amp_format');

Essayez 2:

function am_video_amp_format($content){
            global $post;
            $pattern ="~<iframe(.*?)>(.*?)<video(.*?)src=\"(.*?)\">(.*?)</video>(.*?)</iframe>~i";
            $replacement = '<amp-video controls
                              width="640"
                              height="360"
                              layout="responsive">
                              <source src="$4" />
                            </amp-video>';
            $content = preg_replace($pattern, $replacement, $content);
            return $content;
        }
        add_filter('the_content', 'am_video_amp_format');

Essayez 3:

function am_video_amp_format($content){
            global $post;
            $pattern ="~<video(.*?)><source(.*?)src=\"(.*?)\"(.*?)></video>~i";
            $replacement = '<amp-video controls
                              width="640"
                              height="360"
                              layout="responsive">
                              <source src="$2" />
                            </amp-video>';
            $content = preg_replace($pattern, $replacement, $content);
            return $content;
        }
        add_filter('the_content', 'am_video_amp_format');

Aussi puis-je obtenir la hauteur et la largeur aussi?

Je vous remercie!

2
Ramesh Pardhi

Donc, vous utilisez le shortcode vidéo WordPress par défaut dans l'éditeur, non? Si tel est le cas, il n'est pas nécessaire de filtrer tout le contenu, en particulier le balisage de la vidéo serait déjà rendu et est assez compliqué:

<div style="width: 960px;" class="wp-video"><!--[if lt IE 9]> 
     <script>document.createElement('video');</script><![endif]-->
     <video class="wp-video-shortcode" id="video-160186-1" width="960" height="600" preload="metadata" controls="controls">
        <source type="video/mp4" src="YOUR_VIDEO_URL" />
        <a href="YOUR_VIDEO_URL">YOUR_VIDEO_URL</a>
     </video>
</div>

Ainsi, au lieu de lutter avec des expressions rationnelles trop compliquées, vous pouvez utiliser le filtre wp_video_shortcode. Alors ça devient facile:

function change_video_markup_to_amp( $output, $atts, $video, $post_id, $library ) {

    /* 
    change output only on 'post' post type, you might wanna get 
    rid of this if you want to change video markup everywhere 
    on your site
    */
    if ( ! 'post' === get_post_type( $post_id ) ) {
        return $output;
    }

    /* 
    get video data, you can also check other $atts array 
    keys for different video formats, by default you'll find:
    'mp4', 'm4v', 'webm', 'ogv', 'flv'.
    */
    $video_url = ! empty( $atts['mp4'] ) ? $atts['mp4'] : '';
    $height    = ! empty( $atts['height'] ) ? $atts['height'] : '';
    $width     = ! empty( $atts['width'] ) ? $atts['width'] : '';

    // return default shortcode output if no video url is found
    if ( empty( $video_url ) ) {
        return $output;
    }

    // now put the amp markup together
    $amp_output = sprintf( '<amp-video controls width="%1$d" height="%2$d" layout="responsive"><source src="%3$s" /></amp-video>', absint( $width ), absint( $height ), esc_url( $video_url ) );

    return $amp_output;
}

add_filter( 'wp_video_shortcode', 'change_video_markup_to_amp', 10, 5 );
1
Levi Dulstein