web-dev-qa-db-fra.com

wp_embed_register_handler pour incorporer des fichiers HTML

Je crée un nouveau site Web Wordpress qui contiendra des milliers de livres et d'articles en ligne à lire, en plus d'autres supports, tels que des vidéos.

Je ne veux pas gonfler ma base de données en collant des dizaines de milliers de pages de texte. Je souhaite donc créer les chapitres de livres au format html, puis intégrer ces fichiers html dans les publications Wordpress. Je crois que cela réduira considérablement la taille de la base de données.

J'ai téléchargé un fichier HTML de test ici . Le fichier peut être lu par les navigateurs, il n'y a donc aucune erreur dans le fichier.

J'ai installé la dernière version de Gutenberg et essayé d'intégrer cette URL dans le bloc Embed URL, mais lorsque je clique sur Embed, je reçois le message suivant: Sorry, we could not embed that content.

J'ai suivi la réponse à cette question StackExchange (question n ° 238330) , et la réponse à cette autre question StackExchange (question n ° 277163) , mais sans chance.

Lorsque j'ai utilisé le code dans question # 238330 answer , j’ai réussi à intégrer des vidéos de forbes.com avec succès, en utilisant Gutenberg et l’éditeur de publications par défaut de WordPress.

Cependant, lorsque j'ai modifié le code pour qu'il soit lu sur mon site Web, rien ne se produit (c'est-à-dire que l'URL apparaît sous la forme d'une ligne de texte dans le message), de sorte que j'ai évidemment fait une erreur dans le code.

Voici le code que j'ai modifié:

    /**
 * Embed support for Coptic Treasures Texts
 *
 * Usage Example:
 *
 *     https://coptic-treasures.com/html-test-filed/02.html
 */
add_action( 'init', function()
{
    wp_embed_register_handler( 
        'coptic-treasures', 
        '#http://www\.coptic-treasures\.com/?#i', 
        'wp_embed_handler_coptic_treasures' 
    );

} );

function wp_embed_handler_coptic_treasures( $matches, $attr, $url, $rawattr )
{
    $embed = sprintf(
        '<iframe class="coptic-treasures-texts" src="https://coptic-treasures.com/html-test-filed/%1$s.html" width="600" height="400" frameborder="0" scrolling="no"></iframe>',
        esc_attr( $matches[1] ) 
     );

    return apply_filters( 'embed_coptic_treasures', $embed, $matches, $attr, $url, $rawattr );
}

Mes questions sont:

1- Quelqu'un peut-il m'indiquer quelles sont les erreurs dans le code modifié?

2- Puis-je intégrer sans iFrame? Mon site Web est réactif et je souhaite que le texte soit transparent dans la page et qu'il puisse être découvert par Google.

J'avais essayé un plugin qui obtenait les résultats requis auparavant, mais je n'ai finalement pas l'utiliser car son code contenait une erreur qui entraînait la consommation de toutes les ressources du serveur, si une seule URL était fausse. C'était aussi un plugin non maintenu.

Merci d'avance.

EDIT

J'ai légèrement modifié le code, et il intègre maintenant le texte. Cependant, je suis toujours confronté à un problème dans le code.

Le problème est que pour intégrer cette URL: https://coptic-treasures.com/html-test-filed/02.html, je dois utiliser ce code https://coptic-treasures.com/02.html

En effet, cette partie html-test-filed/ est ajoutée à la fonction que j'utilise. J'ai essayé de le remplacer par une variable, mais je n'ai pas réussi à le faire.

Je veux être capable de changer l'URL des fichiers incorporés.

Merci.

/**
 * Embed support for Coptic Treasures Texts
 *
 * Usage Example:
 *
 *     https://coptic-treasures.com/html-test-filed/02.html
 */
add_action( 'init', function()
{
    wp_embed_register_handler( 
        'coptic-treasures', 
        '#https://coptic-treasures.com/([a-z0-9_-]+)\.html$#i', 
        'wp_embed_handler_coptic_treasures' 
    );

} );

function wp_embed_handler_coptic_treasures( $matches, $attr, $url, $rawattr )
{
    $embed = sprintf(
        '<iframe class="coptic-treasures-texts" src="https://coptic-treasures.com/html-test-filed/%1$s.html" width="1200" height="1200" frameborder="0" scrolling="no"></iframe>',
        esc_attr( $matches[1] ) 
     );

    return apply_filters( 'embed_coptic_treasures', $embed, $matches, $attr, $url, $rawattr );
}
2
Atef Wagih

Correction du motif de regex

Pour faire correspondre une URL du type:

https://coptic-treasures.com/
{Some string with a mix of a-z letters and hyphen}/{Some number}.html

comme cet exemple:

https://coptic-treasures.com/html-test-filed/02.html

vous pouvez essayer ce type de modèle:

'#https://coptic-treasures.com/([a-z-]+)/([0-9]+)\.html$#i'

et vous devez ensuite mettre à jour la sortie iframe en conséquence:

... src="https://coptic-treasures.com/%1$s/%2$s.html" ...

avec les correspondances correspondantes.

Démo

Voici un test:

 text 

qui génère:

 embed 

Quelques notes

Autant que je me souvienne, les intégrations écrivent des méta-données postérieures, votre approche n'évite donc pas les actions de base de données.

Mais de nombreuses installations WordPress ont des dizaines de milliers de publications personnalisées non hiérarchiques sans problèmes majeurs, je ne voudrais donc pas exclure cette option. Assurez-vous d'avoir un bon hébergeur, qui vous fournit la dernière version de PHP, etc. Si la recherche devient trop lente, des solutions et des services tiers sont disponibles.

Notez que le problème pourrait être lié au nombre important de publications hiérarchiques dans l'interface d'administration de WordPress, car les listes déroulantes parent extraient toutes les pages.

Il est également probablement beaucoup plus facile de modifier les données dans le backend WordPress (à l'aide d'éléments tels que les révisions et les taxonomies), au lieu de rechercher le fichier nu correspondant à chaque fois, de l'ouvrir et de le modifier ainsi. Sauf si cela est exporté depuis un autre système que vous avez en place.

Une autre approche pourrait utiliser, par exemple, Vue/React/... JS et récupérez les données pures en tant que ressources JSON (p) et formatez-les au besoin, mais je ne suis pas sûr de la visibilité du moteur de recherche dans ce cas.

2
birgire