web-dev-qa-db-fra.com

Obtenir des résultats de wp_oembed_add_provider

Je ne parviens pas à obtenir les résultats de wp_oembed_add_provider () .

Je développe un site qui doit intégrer du contenu vidéo de Facebook et je suis tombé sur cette liste pratique des structures d'URL de Facebook.

Celle sur laquelle je me concentre pour commencer est #https?://(www\.)?facebook\.com/.*/videos/.*#i, car elle correspond à la vidéo que je teste.

Point secondaire:Cela peut être un problème ou non, mais je ne comprends pas pourquoi le # est présent et le / n'est pas échappé, car ces pratiques ne seraient généralement pas valides dans une regex (selon ma compréhension limitée des regex) Cependant, il correspond au format de l'exemple YouTube dans le codex .

Ceci est dans le functions.php de mon thème:

add_action("init", function(){

    wp_oembed_add_provider(
        '#https?://(www\.)?facebook\.com/.*/videos/.*#i',
        'https://www.facebook.com/plugins/video/oembed.json/',
        true
    );

});

L'URL que je tente de faire correspondre est la suivante: https://www.facebook.com/899lightfm/videos/972261526144646/

Et le point final de Facebook semble être correct, comme https://www.facebook.com/plugins/video/oembed.json/?url=https://www.facebook.com/899lightfm/videos/972261526144646/ renvoie une réponse valide.

Dans un message, j'ai l'URL de la vidéo sur sa propre ligne, suivie d'une URL similaire sur sa propre ligne. L'URL de YouTube a été détectée avec succès et transformée en un fichier Oembed - comme on peut s'y attendre, dans la mesure où Wordpress le prend en charge de manière native - mais l'URL de Facebook n'est pas modifiée et est simplement imprimée en texte brut.

Est-ce que j'utilise et accroche wp_oembed_add_provider() correctement? Y a-t-il autre chose que je devrais faire pour que Wordpress le prenne en charge?

EDIT: J'ai essayé de connecter after_setup_theme au cas où init serait trop tard, mais le même problème se pose. init semblait être l’action la plus courante à laquelle accrocher wp_oembed_add_provider().

2
Tim Malone

Ok j'ai réussi à résoudre ça!

Avez-vous essayé de comprendre le fonctionnement du système d'intégration, et il s'est avéré que l'utilisation de wp_oembed_add_provider() n'était pas erronée. Le débogage autoembed_callback() dans wp-includes\class-wp-embed.php a montré que mon URL YouTube était transmise, mais que mon URL Facebook ne permettait pas cette fonction.

Faire écho au contenu de la publication avant de passer par la fonction autoembed() (raccordée à the_content()) a montré que, pour une raison quelconque, l'URL de Facebook n'était "pas sur une nouvelle ligne" comme l'exigeait autoembed() et était encapsulée dans les balises <p></p> et faisait partie d'une autre ligne, même si elle était clairement sur sa propre nouvelle ligne dans l'éditeur.

Je ne sais pas pourquoi l'URL du FB n'a pas été insérée dans sa propre ligne, mais en prenant exemple sur le fonctionnement de autoembed(), j'ai ajouté ce qui suit à mon functions.php:

add_filter("the_content", function($content){

    // Find URLs that are on their own line but are wrapped in <p></p> tags

    return preg_replace_callback(
        '|^\<p\>(\s*)(https?://[^\s"]+)(\s*)\</p\>$|im',
        array($GLOBALS["wp_embed"], "autoembed_callback"),
        $content
    );

}, 11);

Tant que cela fonctionne après wpautop() (qui fonctionne sur the_content avec la priorité par défaut 10), les deux lienssontcorrectement déplacés vers une nouvelle ligne, encapsulés dans des balises <p></p>, et cette fonction envoie les URL détectées via au autoembed_callback, à quel point tout se déclenche comme il se doit.

Ouf. Le vrai problème est donc lié aux sauts de ligne et éventuellement à la manière dont Wordpress détecte les URL à intégrer automatiquement. J'imagine que les expressions rationnelles dans le noyau pourraient probablement être meilleures pour traiter les cas Edge, mais j'espère que cette fonction supplémentaire résoudra ce problème pour le moment. Je mettrai à jour ceci si je rencontre des problèmes supplémentaires que cela cause.

2
Tim Malone