web-dev-qa-db-fra.com

Comment ajouter un attribut à la sortie avec wp_video_shortcode add_filter

J'essaie d'ajouter une option "muet" à la sortie de la balise video avec le contenu d'un message en utilisant le shortcode vidéo wp intégré. J'ai trouvé cette réponse Comment puis-je obtenir le shortcode [video] pour autoriser les paramètres de chaîne de requête? qui m’a conduit à add_filter mais j’ai vraiment du mal à l’utiliser? Je pensais que le code suivant pourrait fonctionner:

function my_video_shortcode( $output, $atts, $video, $post_id, $library  ) {
    /**
     * @param string $output  Video shortcode HTML output.
     * @param array  $atts    Array of video shortcode attributes.
     * @param string $video   Video file.
     * @param int    $post_id Post ID.
     * @param string $library Media library used for the video shortcode.
     */

     $html_atts = array(
        'class'    => apply_filters( 'wp_video_shortcode_class', 'wp-video-shortcode' ),
        'id'       => sprintf( 'video-%d-%d', $post_id, $instance ),
        'width'    => absint( $atts['width'] ),
        'height'   => absint( $atts['height'] ),
        'poster'   => esc_url( $atts['poster'] ),
        'loop'     => wp_validate_boolean( $atts['loop'] ),
        'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
        'preload'  => $atts['preload'],
        'muted'    => 'muted',
    );
    $attr_strings = array();

    foreach ( $html_atts as $k => $v ) {
            $attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
    }

    $html = '';
    if ( 'mediaelement' === $library && 1 === $instance ) {
            $html .= "<!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->\n";
    }
    $html .= sprintf( '<video %s controls="controls">', join( ' ', $attr_strings ) );

    $fileurl = '';
    $source = '<source type="%s" src="%s" />';
    foreach ( $default_types as $fallback ) {
        if ( ! empty( $atts[ $fallback ] ) ) {
            if ( empty( $fileurl ) ) {
                    $fileurl = $atts[ $fallback ];
            }
            if ( 'src' === $fallback && $is_youtube ) {
                    $type = array( 'type' => 'video/youtube' );
            } elseif ( 'src' === $fallback && $is_vimeo ) {
                    $type = array( 'type' => 'video/vimeo' );
            } else {
                    $type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
            }
            $url = add_query_arg( '_', $instance, $atts[ $fallback ] );
            $html .= sprintf( $source, $type['type'], esc_url( $url ) );
        }
    }

    if ( ! empty( $content ) ) {
            if ( false !== strpos( $content, "\n" ) ) {
                    $content = str_replace( array( "\r\n", "\n", "\t" ), '', $content );
            }
            $html .= trim( $content );
    }

    if ( 'mediaelement' === $library ) {
            $html .= wp_mediaelement_fallback( $fileurl );
    }
    $html .= '</video>';

    $width_rule = '';
    if ( ! empty( $atts['width'] ) ) {
            $width_rule = sprintf( 'width: %dpx; ', $atts['width'] );
    }
    $output = sprintf( '<div style="%s" class="wp-video">%s</div>', $width_rule, $html );

    return $output;

}
add_filter('wp_video_shortcode', 'my_video_shortcode', 10, 2);

J'obtiens une variable indéfinie: pour $ video, $ post_id et $ library et la vidéo de la page sont vides. C’est parce qu’ils n’ont pas de source vidéo mais que le son est en sourdine, même si je n’en ai pas conscience.

Voici l'une des sorties dans la page:

<div style="width: 1306px; " class="wp-video">
<video class="wp-video-shortcode" id="video-0-0" width="1306" height="882" poster="" loop="" autoplay="" preload="metadata" muted="muted" controls="controls"></video>

Je pourrais écrire mon propre shortcode pour les vidéos, mais il est déjà presque là et intégré, il semble donc inutile de le faire.

J'aimerais bien ajouter une case à cocher aux options de la médiathèque, mais c'est un plaisir d'avoir.

Toute aide très appréciée.

2
user2078890

J'obtiens une variable indéfinie: pour $ video, $ post_id et $ library et la vidéo de la page sont vides.

Remplacer:

add_filter( 'wp_video_shortcode', 'my_video_shortcode', 10, 2 );

avec:

add_filter( 'wp_video_shortcode', 'my_video_shortcode', 10, 5 );

pour accéder aux cinq arguments d'entrée dans le rappel de votre filtre.

ps: my_ est un préfixe si commun que je considérerais quelque chose de plus unique.

pps: Voici une autre approche en remplaçant le shortcode:

add_shortcode( 'video', function ( $atts, $content ) 
{
    $output = wp_video_shortcode( $atts, $content );

    if( ! isset( $atts['muted'] ) || ! wp_validate_boolean( $atts['muted'] ) ) 
        return $output;

    if( false !== stripos( $output, ' muted="1"' ) )
        return $output;

    return str_ireplace( '<video ', '<video muted="1" ', $output ); 
} );

où l'attribut muted est activé avec:

[video muted="1" ... ]

J'espère que vous pourrez l'adapter à vos besoins!

2
birgire

Ce code sera automatiquement ajouté en sourdine à toutes les vidéos - propre et simple:

add_filter( 'wp_video_shortcode', function( $output ) {
    $output = str_replace( '<video', '<video muted', $output );
    return $output;
} );

Et généralement, vous ne voudriez cela que pour la lecture automatique de vidéos, vous pouvez donc les cibler uniquement comme ce qui suit:

add_filter( 'wp_video_shortcode', function( $output ) {
    if ( false !== strpos( $output, 'autoplay="1"' ) ) {
        $output = str_replace( '<video', '<video muted', $output );
    }
    return $output;
} );
0
WPExplorer