web-dev-qa-db-ja.com

The_contentの代わりにカスタムフィルタを適用しても埋め込みがレンダリングされない

テーマの中で、私はカスタマイザを使って投稿の前後(単一の投稿など)にコンテンツを表示しています。

/**
Page Before Category
*/
$wp_customize->add_setting( 'content_before_category', array(
    'default'           => 0,
    'sanitize_callback' => 'theme_name_sanitize_integer',
) );
$wp_customize->add_control( 'content_before_category', array(
    'label'       => esc_html__( 'Page Before Category', 'theme_name' ),
    'description' => esc_html__( 'Content of the selected page will be shown on Blog Page before all posts.', 'theme_name' ),
    'type'        => 'dropdown-pages',
    'section'     => 'section_blog',
) );

それから私が使ったindex.php

$content_before_category = get_theme_mod( 'content_before_category', false );

if ( $content_before_category ) {
    $page_id = get_page( $content_before_category );
    echo apply_filters( 'the_content', $page_id->post_content ); // WPCS: xss ok.
}

しかし、the_contentフィルタを直接使うのは、ここで説明されているようにプラグインを壊す可能性があるので 、良いことではないと言われました

それで、私は以下をしました:

私のfunctions.phpに追加しました

if ( ! function_exists( 'mytheme_content_filter' ) ) {
    /**
     * Default content filter
     *
     * @param  string $content Post content.
     * @return string          Post content.
     */
    function mytheme_content_filter( $content ) {
        return $content;
    }
}

/**
 * Adds custom filter that filters the content and is used instead of 'the_content' filter.
 */
add_filter( 'mytheme_content_filter', 'wptexturize' );
add_filter( 'mytheme_content_filter', 'convert_smilies' );
add_filter( 'mytheme_content_filter', 'convert_chars' );
add_filter( 'mytheme_content_filter', 'wpautop' );
add_filter( 'mytheme_content_filter', 'shortcode_unautop' );
add_filter( 'mytheme_content_filter', 'do_shortcode' );

そして、フィルタを

$content_before_category = get_theme_mod( 'content_before_category', false );

if ( $content_before_category ) {
    $page_id = get_page( $content_before_category );
    echo apply_filters( 'mytheme_content_filter', $page_id->post_content ); // WPCS: xss ok.
}

これは埋め込みコンテンツ以外のすべてに有効です。

YouTubeの動画、Twitterは通常のようには表示されません。

埋め込みフィルタを検索しようとしましたが、見つかりませんでした。

何かアドバイス?

1
dingo_d

the_contentフィルタは他のフィルタと同じくらい優れています。問題は、glogal $postがループ内の現在の投稿に正しく設定された状態で、ループ内で実行されることになっていることです。だから、あなたはこのようなことをすることができます(テストされていません、単に例としてここに書かれている):

$content_before_category = get_theme_mod( 'content_before_category', false );

if ( $content_before_category ) {

    global $post;

    // get_page() is deprecated; use get_post() instead
    // $page_id = get_page( $content_before_category );
    $post = get_post( $content_before_category );

    // Setup global post data with our page
    setup_postdata( $post );

    // Output the content
    the_content();

    // Reset global post data
    wp_reset_postdata();

}

カスタムフィルタを実行したい場合は、できます。埋め込みコンテンツに問題があるのは、自動埋め込みフィルタを実行していないことです。追加するだけです。

global $wp_embed;
add_filter( 'mytheme_content_filter', array( $wp_embed, 'autoembed') );
3
cybmeta