web-dev-qa-db-fra.com

L'application d'un filtre personnalisé à la place du contenu ne rend pas les incorporations

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?

1
dingo_d

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') );
3
cybmeta