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.
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!
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;
} );