テーマの中で、私はカスタマイザを使って投稿の前後(単一の投稿など)にコンテンツを表示しています。
/**
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は通常のようには表示されません。
埋め込みフィルタを検索しようとしましたが、見つかりませんでした。
何かアドバイス?
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') );