從CSV數據編程中創建WordPress帖子
Feb 18, 2025 am 09:46 AM
鑰匙要點
- >利用php函數(例如glog(),fopen()和fgetCsv()從CSV文件中提取數據並為WordPress Post Creation做好準備。 >使用諸如自定義帖子類型UI和高級自定義字段之類的插件實現自定義帖子類型和字段,以有效地管理特定的內容要求。
- 通過使用PHP版本5.3或更高版本來確保兼容性,以利用必要的功能(例如匿名功能)。
- >僅通過管理啟動操作執行腳本,保護未經授權的訪問和數據損壞。
- >通過用清晰的標頭構造CSV文件來優化數據處理,並始終格式化以簡化導入過程。 >通過檢查文件權限並在數據導入過程之前和期間驗證數據完整性來優雅地處理潛在錯誤。
- 作為WordPress開發人員,我們經常遇到需要包括先前獲得的數據的項目,無論是來自簡單的文本文件,CSV文件,甚至是舊數據庫。數據遷移是任何後端開發人員都會遇到的東西。幾個月前,我們進行了一個項目,需要從大量CSV文件中生成近1,000個帖子。現在,通常這不是很難的
- ,但是此數據也需要在其自己的帖子類型下,並且自定義帖子類型具有一些自定義字段,包括mp3文件的媒體附件。 > >我不會為您提供用於創建自定義帖子類型和自定義字段的代碼,因為該主題上的網絡周圍已經有大量文章。我只想提到我正在為每個任務使用自定義帖子類型UI和高級自定義字段。正如標題所暗示的那樣,我們將要在這裡介紹的內容是從編程中獲取來自一堆CSV文件(有些包含多個帖子)的數據,然後將該數據轉換為自定義帖子類型的WordPress帖子。我們甚至會瀏覽每個帖子的簡單文本文件。
>實際上,我們將在本文中使用的大多數數據可能在單個CSV內文件。這樣做是為了使此處使用的技術可以使用其他類型的數據(例如JSON,YAML甚至純文本文件)實現。整篇文章的想法來自嚴重缺乏有關此主題的教程和文章,尤其是當您使用自定義帖子類型和自定義字段時。
了解我們的數據 >如果您想關注,則可以從此存儲庫中獲取所需的CSV文件(以及本文中使用的所有代碼)。好的,首先,讓我們看一下我們要處理的CSV數據(請注意,“文件”列在那裡,以表明我正在跨多個CSV文件傳播所有這些數據)。
>文件
>標題
請注意,您的自定義字段的ID可能與本文中使用的ID不同,因此請務必使用正確的ID更新$ SITEPONT數組。這可以是該字段的實際哈希鍵,也可以是字段的名稱。為了清楚起見

>值得一提的是,本文中使用的代碼至少需要PHP 5.3。我們將利用匿名函數以及FGETCSV(),這兩個都需要5.3,因此在您關閉並在舊的Rickety Production Server上使用此功能(請不要那樣做)
,您可能需要升級。 >要提到的另一件事是,我不會進入PHP的max_execution_time,這在一次插入大量帖子時可能會引起一些問題。該設置因服務器而異,因此在本文中討論它是不可行的。如果您想了解更多信息,請提供有關堆棧溢出的大量信息,以及有關如何增加最大執行時間的官方PHP文檔的信息。
>我前面提到過,我們將在本文中使用匿名函數(為簡單起見,我將它們稱為關閉),其原因是,它並不值得用一堆函數污染全局名稱空間本質上是投擲功能。關閉很棒,如果您不熟悉它們,我強烈建議您閱讀它們。如果您來自JavaScript或Ruby背景,您會感到賓至如歸。 >
>
>
>
>因此,在下面的代碼中,有很多數組和數據正在傳遞。我繼續評論代碼,以便您更好地了解所有內容。基本上,我們將帖子插入使用WP_INSERT_POST,並保存返回的帖子ID以供以後使用。然後,我們抓住上傳目錄,並通過創建上傳文件的路徑來創建所需的附件元數據(在上傳/sitepoint-atcharthments中);然後最終抓住文件的名稱和擴展名,我們將用來將附件插入我們新創建的帖子中。 >那麼,下一步是什麼?盡可能簡單地說:我們按下按鈕。我們所有的辛勤工作都將獲得回報(希望如此!)。當我們按下按鈕時,我們的代碼應檢查帖子變量,然後將其貫穿我們的腳本並插入我們的帖子。很好,容易。這是我們所有人的視覺人員的屏幕截圖: 就是這樣!就像我之前承諾的那樣,這是本文中使用的所有代碼: 不像我們最初想像的那樣硬。希望當需要遷移使用自定義帖子類型和自定義字段的數據時,這可以作為許多人的資源。就像我在文章開頭所述的那樣,許多代碼(例如使用$ _POST變量的後端按鈕)不應在生產站點中使用。本文中使用的代碼應用作起點,而不是插件解決方案。 >
我希望您喜歡這篇文章。如果您有任何疑問或評論,請隨時將它們留在下面,我會盡力回答它們並解決您遇到的任何問題。快樂的編碼! >經常詢問的問題(常見問題解答)從CSV數據中創建WordPress帖子
文件的格式正確以進行導入,您應遵循標準CSV格式。文件中的每一行應代表帖子,每列應代表帖子的字段。第一行應包括字段名稱,例如“ post_title”,“ post_content”,“ post_status”等。隨後的行應包括每個帖子的數據。確保使用逗號將每個字段分開,並將所有文本數據包裝在引號中。 如果導入過程中存在錯誤,則導入函數將返回一個WP_ERROR對象,其中包含有關錯誤信息的信息。您可以使用此信息來解決問題。常見問題包括不正確的CSV格式,缺少所需字段和無效數據。請確保在導入之前仔細檢查您的CSV文件以最大程度地降低錯誤的風險。 我可以使用CSV文件導入自定義帖子類型嗎? 是的,您可以導出WordPress帖子到CSV文件。此功能使您可以創建帖子的備份或將內容遷移到另一個平台。導出的CSV文件將包括帖子的所有數據,包括標題,內容,狀態等。 開始,讓我們創建一個簡單的按鈕,該按鈕在我們網站的後端
中執行我們的腳本。這將確保我們的代碼僅由管理員我們執行。為此,我們將使用WordPress的admin_notices鉤子。基本上,它要做的就是創建一個$ _ post變量,我們將使用該變量來確定我們是否應該將帖子插入數據庫。
<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>
<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>
<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>
<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>
<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>
<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>
<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>
結論
從CSV數據中插入WordPress帖子的編程>如果導入過程中存在錯誤,會發生什麼?
可以使用CSV導入更新現有帖子?您需要在CSV文件中包含帖子的ID。導入CSV文件時,如果已經存在具有相同ID的帖子,則現有帖子將使用新數據更新。當您需要大量更新大量帖子時,此功能特別有用。
>
>我可以安排CSV文件的導入嗎?不支持安排CSV文件的導入,而是提供此功能的可用插件。這些插件允許您為導入過程設置時間表,如果您需要定期從CSV文件導入數據,這可能特別有用。
我可以將WordPress帖子導出到CSV文件嗎? 我可以用其他語言導入CSV文件嗎?其他語言的CSV文件。 WordPress支持多語言內容,因此您可以用任何語言導入帖子。但是,您需要確保在UTF-8中對CSV文件進行編碼,以確保正確顯示其他語言中的特殊字符。
>
以上是從CSV數據編程中創建WordPress帖子的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱門文章

熱門文章

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)