Généralement, l’import automatisé de posts/pages avec champs ACF est un casse tête pour beaucoup, car ACF sérialise les réponses multiples (checkbox) dans la base de données. Cependant, après quelques heures de lutte, nous y sommes arrivés.
Le plugin Really Simple CSV Importer, qui au premier abord semble désuet puisqu’il n’est pas maintenu à jour depuis des années est notre ami pour ce job. En effet, avec toujours plus de 70 000 installations actives, ce plugin ne touche quasi pas au coeur de WordPress, si ce n’est pour l’utilisation de “wp_insert_post()” ou de “update_field()” en cas de champs ACF, fonctionne à merveille.
Ce qui permet donc d’éviter de débourser 200€ pour le module WP-All-Import qui actuellement est le seul à réellement faire ce job sans toucher au code de celui-ci.
Plan de l'article
TogglePréparer son fichier CSV
Le plus important c’est de bien préparer son fichier CSV. La doc du plugin propose un hook permettant de gérer cet import, mais celui-ci n’est pas suffisamment clair et ne parle que des champs à données multiples, sans se soucier des champs classiques.
Ce qu’il faut absolument faire :
Pour importer des données multiples (checkbox) dans les champs ACF, il faut que ces champs soient sérialisés. Pour ce faire, le plugin doit utiliser la fonction update_field de ACF.
Pour cela, nous allons créer une colonne dans notre CSV pour chacune des valeurs du champ personnalisé (meta_key).
Dans l’exemple ci-dessous, je dois enregistrer les jours de marchés pour différentes villes. J’ai donc un champ personnalisé intitulé “marche_jours” avec comme valeur possibles : “lundi, mardi, mercredi, jeudi, vendredi, samedi & dimanche”.
Il est donc impératif de créer une colonne CSV pour chaque jour. Dans mon exemple, mes colonnes s’appellent : jour_un, jour_deux, etc… jusqu’à jour_sept. Et c’est dans mon hook que je vais renseigner le nom de ma meta_key finale (à savoir marche_jours) afin que le plugin puisse les regrouper et les sérialiser dans ce champs.
Si vous avez plusieurs champs à valeur multiple, il suffit de reproduire le schéma comme pour “marche_types” en deuxième ligne, et ajouter les lignes nécessaires dans votre cas.
Le format d’export idéal :
N’utilisez pas EXCEL pour vos CSV ! En effet, Excel définit très mal les en-têtes CSV et n’est pas reconnu par Really Simple CSV Importer. Préférez-lui OpenOffice !
Remarque importante : votre fichier CSV doit être sauvegardé en UTF-8, sinon vous risquez de vous retrouver avec pas mal d’erreur !
Pour exporter en UTF-8, voici ce que vous devez-faire lorsque vous sauvegarder votre fichier CSV sous OpenOffice :
La fonction PHP pour filtrer les champs à valeurs multiples :
C’est je pense ce que vous attendez-tous ! La fonction. Avant toute chose, j’aimerais remercier mon pote @Spout, qui code plus vite et mieux que son ombre, sans qui ce code n’aurait jamais vu le jour. Si vous cherchez un excellent développeur fullstack freelance, c’est l’homme qu’il vous faut !
Ajoutez ce code dans votre fichier functions.php et le filtre sera automatique lors de l’import :
// ajout de la compatibilité avec les champs sérialisés pour Really Simple CSV Importer & ACF
function wppln_really_simple_csv_importer_save_meta_filter( $meta, $post, $is_update ) {
$meta_array = array();
$groups = [
'marche_jours' => ['jour_un', 'jour_deux', 'jour_trois', 'jour_quatre', 'jour_cinq', 'jour_six', 'jour_sept'],
'marche_type' => ['type_un', 'type_deux', 'type_trois'],
];
foreach ($meta as $k => &$m) {
$inGroup = false;
foreach ($groups as $group => $fields) {
if (in_array($k, $fields)) {
$inGroup = true;
foreach ($fields as $field) {
if (isset($meta[$field])) {
$meta_array[$group][] = $meta[$field];
}
}
}
}
if (!$inGroup) {
$meta_array[$k] = $m;
}
}
return $meta_array;
}
add_filter( 'really_simple_csv_importer_save_meta', 'wppln_really_simple_csv_importer_save_meta_filter', 10, 3 );
J’espère avoir été clair et vous avoir fait gagner du temps précieux. Si vous avez d’autres idées d’évolution, n’hésitez pas à les partager en commentaires !