web-dev-qa-db-ja.com

Wp_video_shortcode add_filterを使って出力に属性を追加する方法

私は内蔵のWPビデオショートコードを使用して投稿の内容とビデオタグの出力に「ミュート」オプションを追加しようとしています。この回答を見つけました [video]ショートコードを取得してクエリ文字列パラメータを許可する方法を教えてください。 私はadd_filterに私を導いたが、私は本当にそれを使う方法に苦労している?私は以下のコードがうまくいくと思いました:

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

Undefined変数が出ます。$ video、$ post_id、$ libraryの場合、ページ内の動画は空白です。それは彼らがビデオソースを持っていないがミュートがあるからです。

これは、ページ内の出力の1つです。

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

私は自分のビデオ用のショートコードを書くことができましたが、それはもうほとんどそこにあり、組み込まれているので、それをする必要はないようです。

私は同様にメディアライブラリのオプションにチェックボックスを追加したいと思いますが、持っているといいです。

任意の助けは大歓迎です。

2
user2078890

Undefined変数が出ます。$ video、$ post_id、$ libraryの場合、ページ内の動画は空白です。

交換します。

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

と:

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

フィルタのコールバック内の5つの入力引数すべてにアクセスします。

ps:my_はとても一般的な接頭辞なので、もっとユニークなものを検討します。

pps:これは、ショートコードを上書きすることによる別のアプローチです。

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

muted属性は次のもので有効になります。

[video muted="1" ... ]

あなたのニーズに合わせて調整できることを願っています!

2
birgire

このコードは自動的にすべてのビデオにミュートを追加します - クリーンでシンプル:

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

通常、動画の自動再生にのみこれを使用する必要があるため、そのようなものだけをターゲットにできます。

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