J'ai une page qui appelle le contenu d'autres publications (un type de publication personnalisé, en particulier) et l'insère dans la page. Tout fonctionne très bien, mais je perds la fonctionnalité de WordPress en prenant youtube (et d'autres liens incorporables) et en insérant automatiquement la vidéo intégrée.
J'ai essayé apply_filters( 'the_content', $my_content );
, mais je pense que ce filtre n'est même pas disponible via admin-ajax.php
.
Bien entendu, j’appelle déjà do_shortcode( $my_content )
, mais que puis-je utiliser de la même manière pour intégrer les liens intégrables?
METTRE À JOUR:
En réponse à la réponse de bonger, j'ai mis à jour le code comme suit:
wpautop( do_shortcode( $wp_embed->run_shortcode( $my_content ) ) )
($ wp_embed a été globalisé avant cette ligne de code)
Notez que les wpautop()
et do_shortcode()
sont totalement sans rapport avec ce problème, mais je les ai mises ici juste pour être complet. Ce code produit l'URL youtube sous forme de lien vers la vidéo youtube, mais n'intègre pas la vidéo dans la page.
Je pense que la solution est incroyablement simple ici:
Il ne vous manque qu'une seule ligne de code dans votre rappel ajax , à savoir:
global $post;
où je suppose que vous utilisez:
$post = get_post( $post_id );
La raison en est qu'il existe un post-contrôle global dans la méthode WP_Embed::shortcode()
.
Plus de détails dans ma réponse ici .
Je pense qu'il y a une certaine bizarrerie avec les shortcodes [embed]
dans lesquels vous devez les exécuter via WP_Embed::run_shortcode()
, par exemple
if ( strpos( $my_content, '[embed]' ) !== false ) {
global $wp_embed;
$my_content = $wp_embed->run_shortcode( $my_content );
}
$my_content = do_shortcode( $my_content );
Mise à jour : Cependant, comme aucun fournisseur n'est enregistré, cela ne fonctionnera pas comme vous l'avez remarqué (!). Je pense donc que la meilleure chose à faire est d'appeler directement wp_oembed_get()
:
$args = array();
global $content_width;
$args['width'] = $content_width ? $content_width : 300;
// Simplistic parse - look for a url on its own line.
$lines = explode( "\n", $my_content );
foreach ( $lines as $i => $line ) {
$line = trim( $line );
if ( stripos( $line, 'http' ) === 0 ) {
if ( $oembed_html = wp_oembed_get( $line, $args ) ) {
$lines[$i] = $oembed_html;
}
}
}
$my_content = implode( "\n", $lines );
Vous pouvez utiliser des éléments transitoires pour éviter les appels répétés au fournisseur. Voici une version des éléments que j'utilise:
// Wrapper around wp_oembed_get() to use transients.
function wpse175427_oembed_get( $url, $args ) {
global $wpse175427_oembed_transient_expiration;
if ( $wpse175427_oembed_transient_expiration ) {
$transient_key = md5( $url . '_' . wpse175427_reduce_array( $args ) );
if ( $oembed_html = get_transient( $transient_key ) ) {
return $oembed_html;
}
}
//add_filter( 'oembed_fetch_url', 'wpse175427_oembed_fetch_url', 10, 3 );
//add_filter( 'oembed_result', 'wpse175427_oembed_result', 10, 3 );
if ( $oembed_html = wp_oembed_get( $url, $args ) ) {
if ( $wpse175427_oembed_transient_expiration ) {
set_transient( $transient_key, $oembed_html, $wpse175427_oembed_transient_expiration );
}
return $oembed_html;
}
return '';
}
// Helper to stringify args array (for transient key).
function wpse175427_reduce_array( $arr ) {
$ret = array();
foreach ( $arr as $key => $val ) {
$ret[] = '`' . $key . '`=`' . $val . '`';
}
return implode( ',', $ret );
}
Puis définissez le global dans votre rappel ajax, par exemple
global $wpse175427_oembed_transient_expiration;
$wpse175427_oembed_transient_expiration = DAY_IN_SECONDS;
et appelez wpse175427_oembed_get()
au lieu de wp_oembed_get()
.