import-articles/ccc-import-articles.php
2020-08-23 18:15:33 +02:00

225 lines
7.2 KiB
PHP

<?php
/*
Plugin Name: Import de mesures
Description: Ajoute automatiquement les mesures depuis le site des propositions
Author: Matt Marcha
Version: 0.1
*/
/* Script permettant de récupérer les données des proposition d'une URL donnée, et de les intérger en tant qu'articles sur le site WP pour éviter de tout copier/coller
1 / Récupérer la page html (en ligne)
2/ séparer et identifier le conteneur commun aux articles
3/ Déclencher une action pour chaque article :
a - séparer et stocker le titre, le contenu, la date, l'url du pdf
b - formater la date pour qu'elle colle avec les besoins de WP
c - créer un nouveau média à partir de l'url du pdf et le stocker en tant qu'objet
d - Créer un nouvel article avec :
auteur = les150
catégorie = par défaut
tag = récupérer le groupe de travail ou l'indiquer manuellement
titre = titre récupéré
contenu = premier paragraphe récupéré ?
date = date de l'import
meta-url du pdf = url de l'objet pdf
e - enregistrer l'article
*/
// Avant tout, on crée une page spcéifique dans l'interface d'admin avec un gros bouton pour lancer le bouzin
function ccc_register_import_page() {
add_menu_page('Import de mesures', 'Import mesures', 'import', 'ccc-import', 'ccc_import_page', 'dashicons-migrate', 85);
}
add_action('admin_menu', 'ccc_register_import_page');
function ccc_import_page() {
//Si on a validé le formulaire avec une URI, on lance la fonction d'import
if (isset($_POST['ccc-url'])) {
import_posts($_POST['ccc-url']);
}
//Affichage de la page
$out = '
<h1>Import des mesures</h1>
<form method="POST">
<label for="ccc-url">URI de la page contenant les mesures</label><br />
<input id="ccc-url" name="ccc-url" type="text" size="100"/><br />
<input type="submit" value="Lancer l\'import !"/>
</form>';
echo $out;
return true;
}
//Récupération et traitement du fichier HTML
function import_posts($url) {
//on inclut le DOM Parser
include_once('simple_html_dom.php');
//et on récupère le dOM du document
$dom = file_get_html($url);
//Structure : div globale = .panel-container
//puis pour chaque année une div
//puis div.news-wrap
// p.news-date
// h2.news-title
// p.lead-in !!exclure le a !!
// p.led-in a >> choper le href et rajouter http:://erytech.com/ au début
// Structure : en deux pages
//Page 1 : catégorie globale, sous catégorie (deux tags à stocker) et URL
// Page 2 à partir de l'URL : titre de la mesure, ID de l'ancre à ajouter à l'url, premier paragraphe
$i = 0;
$errors = "";
$nb_err = 0;
// On récupère la famille globale
$family = $dom->find("h1.elementor-heading-title", 0)->plaintext;
foreach ($dom->find("div.jet-listing-grid__item") as $main){
// On récupère le titre de la grande catégorie
$cat = $main->find("section", 0);
$cat_title = $cat->find('div.jet-listing-dynamic-field__content', 0)->plaintext;
// puis le nom et le lien de la sous-cat
$ss_cat = $main->find("section", 1);
$ss_cat_title = $ss_cat->find("a.jet-listing-dynamic-link__link", 0)->plaintext;
$link = $ss_cat->find("a.jet-listing-dynamic-link__link", 0)->href;
sleep(5);
//on va chercher les mesures maintenant
$dom2 = file_get_html($link);
foreach ($dom2->find("div.elementor-accordion div.elementor-accordion-item") as $measure) {
$measure_title = preg_replace("/^[0-99]\. /", "", $measure->find("a.elementor-accordion-title", 0)->plaintext);
$measure_link = $link . "#" . $measure->find("div.elementor-tab-title", 0)->id;
$measure_desc = $measure->find("div.elementor-tab-content p", 0)->plaintext . "...";
// On a tout, on peut créer la mesure en bdd!
$id_post = wp_insert_post([
'post_title' => $measure_title,
'post_excerpt' => $measure_desc,
'post_status' => 'publish',
'tags_input' => [$family, $cat_title, $ss_cat_title],
'post_author' => 2
], true);
if ($id_post != 0) {
update_field("proposition-url", $measure_link, $id_post);
$i++;
}
else {
$nb_err++;
$errors .= "<li> $measure_title </li>";
}
}
}
/*foreach ($dom->find('div.news-wrap') as $article) {
//On récupère les données pour chaque article
$title = $article->find('h2.news-title', 0)->plaintext;
$date = $article->first_child()->plaintext;
$content = $article->find('p.lead-in', 0) ?? $article->find('p.news-body', 0) ?? " ";
$pdf = $article->find('a.sec-01-btn', 0);
//Traitement de la date pour la mettre au bon format
$date_ok = false;
//définition deséléments à remplacer dans la date
$month = ["1", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
$mois = ["/1er/", "/Janvier/i", "/Février/i", "/Mars/i", "/Avril/i", "/Mai/i", "/Juin/i", "/Juillet/i", "/Ao[û|u]t/i", "/Septembre/i", "/Octobre/i", "/Novembre/i", "/Décembre/i"];
// C'est parti !
$date = preg_replace($mois,$month,$date);
$date = explode(" ", $date);
$date = strtotime("$date[0] $date[1] $date[2]");
if (date('Y', $date) > '2010') {
$date_ok = true;
//pis on la transforme
$date = date("Y-m-d H:i:s", $date);
}
//Nettoyage de la section content pour virer le lien et le saut de ligne
if ($content != " ") {
if ($content->find('a', 0)) {
$content->find('a', 0)->outertext = "";
}
if ($content->find('br', -1)) {
$content->find('br', -1)->outertext = "";
}
}
$content = addslashes($content);
//Récupération du fichier PDF, ajout en mediathèque et génération du lien
//on récupère le nom du fichier
if(isset($pdf->href)) {
$pdf_name = explode("/", $pdf->href);
$pdf_name = end($pdf_name);
//on récupère l'url complète du fichier
$pdf_url = "http://erytech.com/" . str_replace(["../", "./"], "", $pdf->href);
//et on copie le distant sur le serveur
$upload_dir = wp_upload_dir();
$pdf_local_path = $upload_dir['basedir'] . "/pdf/" . $pdf_name;
// on récupère le retour dans une fonction pour vérifier que tout est ok
$pdf_ok = copy($pdf_url, $pdf_local_path);
}
//Ajout de l'article !
if($pdf_ok && $date_ok ){
$id_post = wp_insert_post([
'post_date' => $date,
'post_title' => $title,
'post_content' => $content,
'meta_input' => ["_url_pdf" => substr($pdf_local_path, 39)],
'post_status' => 'publish',
// ajout de la catégorie
'post_category' => ['16'],
], true);
if ($id_post != 0) {
//définition de la langue
pll_set_post_language($id_post, 'en');
$i++;
}
else {
$nb_err++;
$errors .= "<li>
$date : $title
</li>";
}
} // Sinon on recense l'erreur
else {
$nb_err++;
$errors .= "<li>
$date : $title
</li>";
}
}*/
// Affichage du récap'
echo "$i mesure(s) importé(s)<br />
$nb_err erreurs d'import :<br /><ul>
$errors
</ul>";
}