En tant que développeurs WordPress, nous rencontrons souvent des projets qui doivent inclure des données précédemment atteintes, que ce soit à partir de fichiers texte simples, de fichiers CSV ou même d'une ancienne base de données. La migration des données est quelque chose que tous les développeurs back-plans rencontrent. Il y a quelques mois, nous avions un projet qui avait besoin de près de 1 000 postes à générer à partir d'une pléthore de fichiers CSV. Maintenant, ce ne serait généralement pas que dur, mais ces données devaient également être sous son propre type de message et ce type de message personnalisé avait quelques champs personnalisés, y compris une pièce jointe pour un fichier MP3.
Je ne vous ennuierai pas avec le code pour créer des types de publiques personnalisés et des champs personnalisés, car il y a déjà une tonne d'articles flottant sur le Web sur ce sujet. Je vais simplement mentionner que j'utilise l'interface utilisateur de type post personnalisé et les champs personnalisés avancés pour chaque tâche respective. Comme le titre l'indique, ce que nous allons couvrir ici est de prendre des données par programme à partir d'un tas de fichiers CSV (certains contenant plusieurs messages), puis de transformer ces données en articles WordPress pour un type de publication personnalisé. Nous allons même passer en revue un fichier texte simple à chaque publication.
Afin d'obtenir toutes les données dont nous avons besoin dans les fichiers CSV, nous utiliserons quelques fonctions PHP Nifty, telles que: glob (), qui «globs» un répertoire et renvoie un tableau de noms de fichiers à l'intérieur de il; fopen (), qui ouvre un fichier afin que nous puissions lire son contenu et enfin, fGetcsv (), qui analyse un fichier CSV dans un joli tableau associatif abritant toutes nos données.
En réalité, la plupart des données que nous utiliserons pour cet article seraient probablement à l'intérieur d'un seul CSV, par opposition à la façon dont nous allons le faire aujourd'hui où les données sont dispersées tout au long de plusieurs multiples fichiers. Cela est fait pour que les techniques utilisées ici puissent être implémentées à l'aide d'autres types de données, tels que JSON, YAML ou même des fichiers texte brut. L'idée de tout cet article est venue du grave manque de tutoriels et d'articles concernant ce sujet, surtout lorsque vous utilisez des types de post personnalisés et des champs personnalisés.
Si vous souhaitez suivre, vous pouvez également saisir les fichiers CSV nécessaires (et tout le code utilisé dans cet article) à partir de ce dépôt. Très bien, d'abord, jetons un coup d'œil aux données CSV avec lesquelles nous allons faire face (veuillez noter que la colonne «Fichier» est là pour vous montrer que je répand toutes ces données sur plusieurs fichiers CSV).
assez simple, hein? Ensuite, nous allons jeter un œil au type de publication personnalisé que nous utiliserons. Je l'ai créé à l'aide de l'interface utilisateur de type post personnalisé, vous pouvez donc utiliser les mêmes paramètres si vous utilisez le plugin ou le faire vous-même avec les nombreuses fonctions de WordPress. Voici une capture d'écran rapide des options que nous utiliserons (je mets en évidence les limaces et autres champs que nous utiliserons tout au long de cet article, alors gardez cela à l'esprit):
Enfin, jetons un coup d'œil au champ personnalisé que nous utiliserons. Il est créé avec les beaux champs personnalisés avancés. Voici une autre capture d'écran rapide des paramètres que nous utiliserons.
Veuillez noter que l'ID de votre champ personnalisé sera probablement différent de celui utilisé dans cet article, alors assurez-vous de mettre à jour votre tableau $ SitePoint avec le bon ID. Cela peut être soit la clé de hachage réelle du champ, soit simplement le nom du champ. Je vais juste m'en tenir au nom, pour des raisons de clarté.
Il convient de mentionner que le code utilisé dans cet article nécessite au moins PHP 5.3. Nous allons utiliser des fonctions anonymes, ainsi que fGetCSV (), qui nécessitent tous les deux 5.3, donc avant de partir et l'utiliser sur un vieux serveur de production branlant (s'il vous plaît, ne le faites pas) , vous voudrez peut-être mettre à niveau.
Une autre chose à mentionner est que je ne vais pas entrer dans MAX_EXECUTURE_TREUT de PHP, ce qui peut entraîner des problèmes lors de l'insertion d'une grande quantité de messages en une seule fois. Le paramètre varie tellement d'un serveur à l'autre qu'il n'est pas possible d'en discuter dans cet article. Si vous souhaitez en savoir plus, il y a une tonne d'informations sur le débordement de pile, ainsi que sur les documents PHP officiels sur la façon d'augmenter votre temps d'exécution maximum.
Pour démarrer cela, créons un bouton simple qui exécute notre script dans le back-end de notre site. Cela garantira que notre code est uniquement exécuté par nous, l'administrateur. Pour ce faire, nous allons simplement utiliser le crochet admin_notices de WordPress. Fondamentalement, tout ce qu'il va faire est de créer une variable $ _POST que nous utiliserons pour déterminer si nous devons ou non insérer les messages dans la base de données.
<span>/** </span><span> * Show 'insert posts' button on backend </span><span> */ </span><span>add_action( "admin_notices", function() { </span> <span>echo "<div class='updated'>"; </span> <span>echo "<p>"; </span> <span>echo "To insert the posts into the database, click the button to the right."; </span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>"; </span> <span>echo "</p>"; </span> <span>echo "</div>"; </span><span>});</span>
J'ai mentionné plus tôt que nous utiliserions des fonctions anonymes (je les qualifierai de fermetures, pour la simplicité) tout au long de cet article, et la raison en est qu'il ne vaut pas vraiment la peine de polluer l'espace de noms global avec un tas de fonctions qui sont essentiellement des fonctions jet. Les fermetures sont super, et si vous ne les connaissez pas, je vous suggère fortement de les lire. Si vous venez d'un fond JavaScript ou Ruby, vous vous sentirez comme chez vous.
Si vous souhaitez mettre tout ce code dans votre fichier functions.php, c'est bien, bien que tout soit bien si vous souhaitez créer un modèle de page séparé, une page cachée ou autre. En fin de compte, cela n'a vraiment pas d'importance. Pour commencer, utilisons un autre crochet WordPress, admin_init. Nous inclurons également les $ WPDB Global, afin que nous puissions faire une requête de base de données personnalisée plus tard.
<span>/** </span><span> * Create and insert posts from CSV files </span><span> */ </span><span>add_action( "admin_init", function() { </span> <span>global $wpdb; </span> <span>// ... code will go here </span><span>});</span>
d'accord, alors que ensuite? Commençons par vérifier si notre variable $ _post $ est présente ou non, et si ce n'est pas le cas, nous pouvons quitter la fonction. Aucune utilisation dans le gaspillage de la mémoire sur rien. Pour vérifier si notre variable est présente, nous utiliserons la variable $ _get. Si vous n'êtes pas familier avec ces types de variables, vous pouvez les lire ici. En plus du chèque ci-dessus, nous définirons également notre tableau $ SitePoint que j'ai mentionné plus tôt. Il contiendra votre type de publication personnalisé et vos identifiants de champ personnalisés.
Il convient de noter que chaque fois que j'utilise // ... dans le code de cet article, c'est une continuation du dernier bloc de code que nous avons couvert. La plupart du code de cet article se situe dans la fermeture de l'action admin_init que nous venons de créer ci-dessus. À la fin de l'article, je vais vous fournir le code complet, alors ne vous inquiétez pas si vous vous perdez un peu.
<span>/** </span><span> * Show 'insert posts' button on backend </span><span> */ </span><span>add_action( "admin_notices", function() { </span> <span>echo "<div class='updated'>"; </span> <span>echo "<p>"; </span> <span>echo "To insert the posts into the database, click the button to the right."; </span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>"; </span> <span>echo "</p>"; </span> <span>echo "</div>"; </span><span>});</span>
Ensuite, créons une fermeture qui va récupérer nos données CSV et créer un joli tableau associatif de toutes les données. Maintenant, il serait bon de noter que selon le type de données que vous utilisez (que ce soit CSV, JSON, YAML, etc.), cette fermeture variera. Donc, je vous suggère d'ajuster cela pour s'adapter à vos données. J'ai commenté le code ci-dessous afin que vous puissiez mieux suivre ce qui se passe réellement.
quelques notes supplémentaires: * La syntaxe $ array [] = "Value" est abréci pour Array_push, qui pousse la valeur attribuée à l'extrémité du tableau. * Je stockage mes données CSV dans mon thème, à l'intérieur d'un répertoire. Vous pouvez le stocker où vous voulez, mais n'oubliez pas d'ajuster le chemin glob () à tout ce que vous choisissez.
<span>/** </span><span> * Create and insert posts from CSV files </span><span> */ </span><span>add_action( "admin_init", function() { </span> <span>global $wpdb; </span> <span>// ... code will go here </span><span>});</span>
Si vous êtes plus une personne visuelle (je sais que je le suis), les données renvoyées lorsque cette fermeture sera exécutée sera quelque chose dans le sens (et comme vous pouvez le voir ci-dessus, il y a déjà un modèle simple Pour une gestion des erreurs, juste au cas où vous voudriez faire quelque chose d'un peu fou):
<span>// ... </span> <span>global $wpdb; </span> <span>// I'd recommend replacing this with your own code to make sure </span><span>// the post creation _only_ happens when you want it to. </span><span>if ( ! isset( $_GET["insert_sitepoint_posts"] ) ) { </span> <span>return; </span><span>} </span> <span>// Change these to whatever you set </span><span>$sitepoint = array( </span> <span>"custom-field" => "sitepoint_post_attachment", </span> <span>"custom-post-type" => "sitepoint_posts" </span><span>); </span> <span>// ...</span>
Cela peut ne pas sembler beaucoup, mais il suffit de faire le travail. Ensuite, nous avons besoin d'une fonction qui peut vérifier si notre message est déjà dans la base de données. Rien n'est pire que l'exécution d'un script qui insère des centaines de messages, seulement pour réaliser qu'il a tout inséré deux fois. Cette petite fermeture astucieuse interrogera la base de données et assurez-vous que cela ne se produit pas. Dans cette fermeture, nous allons utiliser la fonction use () qui nous permet d'accéder aux variables en dehors de la portée de la fermeture.
<span>// ... </span> <span>// Get the data from all those CSVs! </span><span>$posts = function() { </span> <span>$data = array(); </span> <span>$errors = array(); </span> <span>// Get array of CSV files </span> <span>$files = glob( __DIR__ . "/data/*.csv" ); </span> <span>foreach ( $files as $file ) { </span> <span>// Attempt to change permissions if not readable </span> <span>if ( ! is_readable( $file ) ) { </span> <span>chmod( $file, 0744 ); </span> <span>} </span> <span>// Check if file is writable, then open it in 'read only' mode </span> <span>if ( is_readable( $file ) && $_file = fopen( $file, "r" ) ) { </span> <span>// To sum this part up, all it really does is go row by </span> <span>// row, column by column, saving all the data </span> <span>$post = array(); </span> <span>// Get first row in CSV, which is of course the headers </span> <span>$header = fgetcsv( $_file ); </span> <span>while ( $row = fgetcsv( $_file ) ) { </span> <span>foreach ( $header as $i => $key ) { </span> <span>$post[$key] = $row[$i]; </span> <span>} </span> <span>$data[] = $post; </span> <span>} </span> <span>fclose( $_file ); </span> <span>} else { </span> <span>$errors[] = "File '<span><span>$file</span>' could not be opened. Check the file's permissions to make sure it's readable by your server."</span>; </span> <span>} </span> <span>} </span> <span>if ( ! empty( $errors ) ) { </span> <span>// ... do stuff with the errors </span> <span>} </span> <span>return $data; </span><span>}; </span> <span>// ...</span>
Vous vous demandez probablement quand nous allons réellement insérer toutes ces données en tant que messages réels, hein? Eh bien, comme vous pouvez le voir, beaucoup de travail doit être consacré à s'assurer que toutes ces données sont organisées proprement et que nous avons les fonctions configurées pour effectuer les vérifications dont nous avons besoin. Pour faire fonctionner cela, nous allons exécuter notre fermeture $ post (), afin que nous puissions nous dérouler sur les données qui sont renvoyées. Ensuite, nous exécuterons notre fermeture $ post_exists () pour voir si le titre de poste actuel existe.
Ainsi, dans le code ci-dessous, il y a beaucoup de tableaux et de données qui sont passées. Je suis allé de l'avant et j'ai commenté le code pour que vous puissiez mieux comprendre. Fondamentalement, nous insérons le post dans la base de données avec WP_INSERT_POST et enregistrons l'ID de poste renvoyé pour une utilisation plus tard. Ensuite, nous saisissons le répertoire des téléchargements et créons les méta-données de pièce jointes nécessaires en créant le chemin d'accès au fichier téléchargé (qui est en téléchargement / plate-forme sitepoint); Et puis finalement saisir le nom et l'extension du fichier, que nous utiliserons pour insérer la pièce jointe dans notre message nouvellement créé.
<span>/** </span><span> * Show 'insert posts' button on backend </span><span> */ </span><span>add_action( "admin_notices", function() { </span> <span>echo "<div class='updated'>"; </span> <span>echo "<p>"; </span> <span>echo "To insert the posts into the database, click the button to the right."; </span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>"; </span> <span>echo "</p>"; </span> <span>echo "</div>"; </span><span>});</span>
Alors, quelle est la prochaine étape? Pour le dire aussi simplement que possible: nous appuyons sur le bouton. Tout notre travail acharné est sur le point de porter ses fruits (espérons-le!). Lorsque nous appuyons sur le bouton, notre code devrait vérifier la variable de publication, puis il exécutera notre script et inséra nos messages. Nice et facile. Voici une capture d'écran pour nous tous des personnes visuelles:
Et c'est tout! Comme je l'ai promis plus tôt, voici tout le code utilisé dans cet article:
<span>/** </span><span> * Create and insert posts from CSV files </span><span> */ </span><span>add_action( "admin_init", function() { </span> <span>global $wpdb; </span> <span>// ... code will go here </span><span>});</span>
Insertion programmatique des articles WordPress à partir de données CSV n'est pas aussi dur que nous le pensons initialement. Espérons que cela puisse agir comme une ressource pour beaucoup de gens lorsqu'ils ont besoin de migrer des données qui utilisent à la fois des types de messages personnalisés et des champs personnalisés. Comme je l'ai dit au début de l'article, une grande partie du code, comme notre bouton backend utilisant des variables $ _post, ne doit pas être utilisée dans un site de production. Le code utilisé dans cet article doit être utilisé comme point de départ, plutôt que comme une solution de plug-and-play.
J'espère que vous avez apprécié l'article. Si vous avez des questions ou des commentaires, n'hésitez pas à les laisser ci-dessous et je ferai de mon mieux pour y répondre et résoudre les problèmes que vous rencontrez. Codage heureux!
La création de messages WordPress à partir de données CSV est une fonctionnalité puissante qui vous permet d'importer une grande quantité de données dans votre site WordPress dans une structure et efficace manière. Ceci est particulièrement utile si vous migrez du contenu à partir d'une autre plate-forme ou si vous avez une grande quantité de données qui doivent être téléchargées en vrac. Il permet d'économiser du temps et des efforts car vous n'avez pas à créer manuellement chaque message. Il garantit également la cohérence et la précision des données car elle élimine le risque d'erreur humaine.
Oui, vous pouvez importer des images avec les messages Utilisation des fichiers CSV. Vous devez inclure l'URL de l'image dans le fichier CSV. Lorsque vous importez le fichier CSV, l'image sera récupérée à partir de l'URL spécifiée et jointe à la publication correspondante. Cette fonctionnalité est particulièrement utile lorsque vous importez des publications qui incluent le contenu multimédia.
pour s'assurer que les données de votre CSV Le fichier est correctement formaté pour l'importation, vous devez suivre le format CSV standard. Chaque ligne du fichier doit représenter un message et chaque colonne doit représenter un champ du message. La première ligne doit inclure les noms de champ, tels que «post_title», «post_content», «post_status», etc. Les lignes suivantes doivent inclure les données de chaque message. Assurez-vous d'utiliser une virgule pour séparer chaque champ et enfermer toutes les données de texte en guillemets.
S'il y a des erreurs pendant le processus d'importation, la fonction d'importation renvoie un objet WP_ERROR qui comprend des informations sur l'erreur. Vous pouvez utiliser ces informations pour dépanner le problème. Les problèmes communs incluent le format CSV incorrect, les champs requis manquants et les données non valides. Assurez-vous de vérifier attentivement votre fichier CSV avant d'importer pour minimiser le risque d'erreurs.
Oui, vous pouvez mettre à jour les publications existantes à l'aide de l'importation CSV. Vous devez inclure l'ID du message dans le fichier CSV. Lorsque vous importez le fichier CSV, si un message avec le même ID existe déjà, la publication existante sera mise à jour avec les nouvelles données. Cette fonctionnalité est particulièrement utile lorsque vous devez mettre à jour une grande quantité de messages en vrac.
Oui, vous pouvez importer des types de publication personnalisés à l'aide de CSV fichiers. Vous devez inclure le type de publication dans le fichier CSV. Lorsque vous importez le fichier CSV, les messages seront créés avec le type de publication spécifié. Cette fonctionnalité est particulièrement utile lorsque vous travaillez avec des types de publiques personnalisés et que vous devez importer une grande quantité de données.
Alors que la fonctionnalité WordPress de base le fait Ne prend pas en charge la planification de l'importation de fichiers CSV, il existe des plugins disponibles qui fournissent cette fonctionnalité. Ces plugins vous permettent de définir un calendrier pour le processus d'importation, qui peut être particulièrement utile si vous devez importer régulièrement des données à partir de fichiers CSV.
Oui, vous pouvez importer des fichiers CSV à partir d'un emplacement distant. Vous devez fournir l'URL du fichier CSV. Lorsque vous importez le fichier CSV, les données seront récupérées à partir de l'URL spécifiée. Cette fonctionnalité est particulièrement utile lorsque le fichier CSV est hébergé sur un serveur distant ou un service de stockage cloud.
Oui, vous pouvez exporter des messages WordPress WordPress à un fichier CSV. Cette fonctionnalité vous permet de créer une sauvegarde de vos messages ou de migrer votre contenu vers une autre plate-forme. Le fichier CSV exporté comprendra toutes les données des publications, y compris le titre, le contenu, le statut, etc. Fichiers CSV dans d'autres langues. WordPress prend en charge un contenu multilingue, vous pouvez donc importer des publications dans n'importe quelle langue. Cependant, vous devez vous assurer que votre fichier CSV est codé dans UTF-8 pour vous assurer que les caractères spéciaux dans d'autres langues sont correctement affichés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!