Dans le thème, j'utilise un personnalisateur pour afficher le contenu avant (et après) les publications, les publications individuelles, etc.
/**
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',
) );
Et puis dans le index.php
j'ai utilisé
$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.
}
Mais on m'a dit qu'utiliser le filtre the_content
directement n'est pas bon, car cela pourrait casser les plugins comme décrit ici .
Alors j'ai fait ce qui suit:
Dans mon functions.php
j'ai ajouté
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' );
Et puis le changé le filtre à
$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.
}
Ce qui fonctionne pour tout sauf le contenu intégré.
Les vidéos youtube, Twitter ne seront pas rendus comme ils le font normalement.
J'ai essayé de rechercher un filtre intégré, mais je n'ai pas pu en trouver.
Aucun conseil?
Le filtre the_content
est aussi bon que les autres filtres. Le problème est qu'il est supposé être exécuté dans une boucle avec le $post
glogal correctement défini sur la publication en cours dans la boucle. Donc, vous pourriez faire quelque chose comme ceci (non testé, juste écrit ici à titre d'exemple):
$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();
}
Si vous préférez utiliser vos filtres personnalisés, vous pouvez le faire. Le problème que vous avez avec le contenu incorporé est que vous n'avez pas exécuté le filtre d'intégration automatique; juste l'ajouter:
global $wp_embed;
add_filter( 'mytheme_content_filter', array( $wp_embed, 'autoembed') );