本章内容:
➤了解WordPress資料庫
➤學習資料庫表的關系
➤使用WordPress資料庫類
➤調試自定義查詢
如今,幾乎網際網路上的每個網站都連接配接到存儲該網站資訊的資料庫。WordPress也不例外,它的背景是MySQL資料庫。這個資料庫存儲網站的所有資料,包括内容、使用者、連結、中繼資料、設定等等。本章涵蓋了如何存儲資料,存儲什麼資料,以及如何在WordPress中使用這些資料來幫助你建立令人驚歎的網站。
資料庫表
預設安裝的WordPress包含11個資料庫表。WordPress以輕量級而自豪,而資料庫是輕量級的基礎。在開發和設計WordPress時,資料庫結構被設計得非常小,但允許無限的靈活性。要了解資料庫模式,檢視資料庫關系圖是有幫助的。
圖6-1展示了WordPress标準安裝過程中建立的資料庫結構和表的概述。記住,插件和主題有能力建立自定義表。WordPress Multisite 還會建立額外的表,是以你的WordPress資料庫可能包含更多的表,而不僅僅是預設的表。

當WordPress釋出一個新的主要版本時,通常會對資料庫進行一些更改。這些更改通常非常小,例如更改表字段資料類型或删除不再使用的字段。向後相容性是WordPress開發社群的一個主要關注點,是以對資料庫的任何更改都要經過嚴格的審查,很少會影響到正在運作的插件和主題。Codex有一個特點是一個非常徹底的資料庫更新日志,你可以參考WordPress的新版本釋出:http://codex.wordpress.org/Database_Description#Changelog
WordPress中的表格結構是非常一緻的。資料庫中的每個表都包含一個惟一的ID字段,它是表的主鍵。每個表還包含字段上的一個或多個索引,這提高了對資料執行查詢時的資料檢索速度。正如在第5章中所看到的,在一個主題中,每次周遊Loop都會生成至少一個(可能是幾個)查詢,以提取文章、頁面及其相關的中繼資料或評論。
每個表中最重要的字段是惟一的ID字段。這個字段并不總是命名為ID,而是一個自動遞增的字段,用于給表中的每條記錄一個唯一的辨別符。例如,當你第一次安裝WordPress時,預設的文章标題是“Hello world!” 因為這是在wp_posts表中建立的第一個文章,是以這個文章的ID是1。每個文章都有一個唯一的ID,可以用來加載特定的文章資訊,也可以作為資料庫中其他表的連接配接字段。
表細節
目前已經為WordPress建立了11個資料庫表。以下是這些表的清單和它們存儲的資料的詳細資訊:
➤wp_commentmeta -包含所有評論的中繼資料。
➤wp_comments -包含WordPress内的所有評論。個人評論通過一個文章ID連結回文章。
➤wp_links-包含所有通過連結管理器添加的連結。該表仍然存在,但是核心功能在WordPress 3.5中已棄用。欲了解更多資訊,請通路http://codex.wordpress.org/Links_Manager。
➤wp_options -存儲設定界面下定義的所有網站選項。還存儲插件選項,活動插件和主題,以及其他。
➤wp_postmeta -包含所有post中繼資料(自定義字段)。
➤wp_posts -包含所有類型的文章(預設和自定義的文章類型)、頁面、多媒體和修訂積累。在大多數情況下,這是資料庫中最大的表。
➤wp_terms -包含你的網站定義的所有分類術語,将它們的文本描述映射到術語編号,可以作為其他表格的唯一索引。
➤wp_term_relationships—将分類法術語與内容連接配接起來,提供一個成員關系表。它将标簽或類别名稱等術語映射到引用它的頁面或文章。
➤wp_term_taxonomy—定義每個術語被配置設定到的分類。這個表允許使用相同名稱的類别和标記,将它們放在不同的命名分類法中。
➤wp_users -包含在你的網站中建立的所有使用者(登入名,密碼,e-mail)。
➤wp_usermeta -包含使用者的中繼資料(firstst /last name,昵稱,使用者級别等等)。
每個資料庫表在WordPress中都有特定的用途。下一節将分解一些更常見的表,還有檢視使用每個表的一些示例。
WordPress 内容表
要檢索你網站的所有内容,你需要通路wp _ posts表。該表存儲您的所有文章、頁面、附件、修訂等等。附件記錄存儲在該表中,但實際的附件不存儲在該表中。它們以标準檔案的形式實體存儲在主機伺服器上。下面的SQL查詢是一個如何從資料庫中提取你的所有文章的例子,并且是預設的WordPress循環中的簡短形式:
SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC
這個查詢從wp_posts中選擇post類型為'post'的所有記錄。post_type字段指定正在檢視的post的類型。要傳回所有頁面,隻需将該值更改為'page'。在這個例子中,你想要釋出的文章,是以確定post _ status設定為'publish'。還将按post _ date降序排清單記錄,是以的文章将按反時間順序顯示。查詢資料和可用的工具将在本章的後面讨論。
讓我們來看看wp_posts表中一些更有用的字段。你已經知道你的ID字段包含你的文章的唯一ID。post_author字段是文章作者的唯一ID。你可以使用它從wp_users表中檢索作者指定的資料。post_date是文章建立的日期。post_content字段存儲文章或頁面的主要内容,post_title是内容的标題。
一個非常重要的字段是post - status字段。目前,在WordPress中定義了八種不同的發帖狀态:
➤publish——已釋出的文章或頁面。
➤inherit—修改後的内容。
➤pending -等待管理者或編輯稽核的文章。
➤private——私有的文章。
➤future -計劃在未來的日期和時間釋出的文章。
➤draft——一篇尚未發表的正在創作中的文章。
➤auto-draft——當你編輯的時候WordPress會自動儲存的一篇文章。
➤trash——内容在垃圾桶裡,仍然可以被回收。
當貢獻者角色被用來限制其文章釋出或編輯現有内容的能力時,文章狀态就起作用了。和WordPress中的幾乎所有東西一樣,自定義釋出狀态可以通過插件和主題建立。
注:user 角色的使用将在第12章讨論,角色對内容管理工作流程的影響将在第15章讨論
post_type也存儲在wp_posts表中。這個值區分了不同類型的内容:文章、頁面、修訂、菜單和附件。自從WordPress 2.9釋出以來,可以建立自定義文章類型,這為在WordPress中定義自定義内容打開了無限可能的大門。
wp_users表包含注冊成員帳戶資料。同樣你将看到ID字段,該字段代表使用者記錄的惟一辨別符。其中user_login為使用者的使用者名。使用者登入WordPress時必須輸入。user_ pass字段包含加密後的使用者密碼。注冊使用者的電子郵件存儲在user_email字段中。user_url字段包含成員的網站,使用者的注冊日期儲存在user_ registered中。
接下來将探索wp_comments表。該表存儲網站的所有評論、pingback和trackback。在檢視注釋記錄時,您會注意到ID字段名為comment_ID。即使這個字段沒有命名為ID,它仍然是表中此記錄的唯一辨別符。comment_post_ID是添加的文章評論唯一ID。記住,預設情況下,你不需要登入就能在WordPress上發表評論。是以,您将看到與使用者表中類似的字段。
comment _ author字段存儲注釋者的名稱。如果評論是pingback或trackback,它将包含發送ping的文章的名稱。comment_author_email包含了評論者的電子郵件位址,他或她的網站存儲在comment_author_url中。另一個重要的字段是comment_date,這是評論建立的日期。此字段用于按正确的順序顯示您的文章評論。
WordPress分類表
術語、關系和分類法被分解成三個不同的表,以允許在類别、标簽、自定義分類法中的項目和文章之間有多到一的關系。這些關系是有層次的、多重價值的。
雖然可以為wp_posts表中的每一行添加标記數組或類别辨別符,但這種方法将限制每個文章顯式描述關系的數量,同時也因為配置設定給标簽或沒有配置設定内容類别而浪費空間。
如果你建立一個名為“恐怖故事”的類别,并在該類别中放置四篇文章,所有三個與分類法相關的表格都會被更新:
wp_terms表中的一行定義了“恐怖故事”和其slug或者是在url中使用的diminutive格式。此關系将獲得一個惟一辨別符(鍵),用于将術語比對到其他表。
wp_term_taxonom表中的一行将“恐怖故事”映射到“類别”分類。這種映射關系将獲得一個唯一的鍵,表示“category”中的“恐怖故事”組合。如果還建立了自定義分類法,并且在其中有一個“可怕的故事”條目,那麼在wp_term_taxonom表中就會有對應該映射的另一行,以及它的惟一鍵。
wp_term_relationships表中的四行将“類别中的恐怖故事”辨別符映射類别中每一篇文章的post辨別符。
處理分類法表的主要操作符是SQL JOIN,有時将兩個(或更多)表的稱為“産品”。JOIN建構臨時表,将一個表中的每一行映射到第二個和後續表中的每一行;然後JOIN操作的WHERE部分選擇每一行中特定字段比對的行。要找到“恐怖故事”類别中的所有文章,WordPress首先找到這個術語和分類對的辨別符,選擇
從wp_term_relationships表中适當的行,然後對wp_posts和從relationships表中選擇的行進行JOIN:最後一個JOIN是SQL- ese,用于“提取此清單中具有辨別符的所有posts”,其中清單是動态計算的。
圖6-2顯示了WordPress中wp _ posts表和分類taxonomy表之間的連接配接。
雖然這使得選擇SQL内容關聯到一個特定的标簽或類别更複雜,因為要求使用一個多表連接配接操作來實作“名字和分類關系”比對,不過允許豐富和多種有價值的描述,類别,分類,标記名具有獨立的名稱空間這就是WordPress 強大的之處。
WORDPRESS資料庫類
WordPress提供了一個帶有方法函數的對象類,可以直接使用資料庫。這個資料庫類叫做wpdb,位于wp‐includes/wp‐db.php中。任何時候在PHP代碼中查詢WordPress資料庫,都應該使用wpdb類。使用這個類的主要原因是它允許WordPress以最安全的方式執行查詢。
簡單資料庫查詢
在使用wpdb類時,必須首先将$wpdb定義為全局變量,然後才能使用它。要做到這一點,隻需将這行代碼直接放在$wpdb函數調用的前面:
global $wpdb;
wpdb類中最重要的函數之一是prepare()函數。這個函數用于轉義傳遞給SQL查詢的變量。這是防止網站遭受SQL注入攻擊的關鍵步驟。
注意:所有查詢在執行之前都應該通過prepare()函數傳遞。prepare()函數接受至少兩個參數:
$wpdb->prepare( $query, $value1 );
$query參數是要運作的資料庫查詢。$value1參數是要在查詢中替換的第一個值。可以根據需要添加額外的值參數。讓我們來看一個例子:
<?php
global $wpdb;
$field_key = "address";
$field_value = "1428 Elm St";
$wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->my_custom_table
( id, field_key, field_value ) VALUES ( %d, %s, %s )", 1,
$field_key, $field_value ) );
?>
這個例子将資料添加到你之前建立的非預設的自定義表格中。當使用prepare()時,請確定将查詢中的任何變量替換為%s(字元串)、%d(整數)和%f(浮點數)。
然後按照完全相同的順序将變量作為prepare()函數的參數列出。在上面的例子中,%d表示1,%s表示$field_key,第二個%s表示$ field_value。本節中的示例都使用prepare()函數,這突出了它在處理資料庫查詢時的重要性。
注意,這個例子使用$wpdb‐>my_custom_table來引用WordPress中的表格。如果wp_是表字首,則轉換為wp_my_custom_table。這是在使用WordPress資料庫中的表時确定正确的表字首的正确方法。
安裝WordPress時,可以設定自定義的資料庫表字首。預設情況下,這是wp_,但出于安全目的,許多人選擇更改這個字首。使用$wpdb-> 對于任何WordPress安裝來說,确定這個表字首是什麼,是很正确的方法。
wpdb query()方法用于執行一個簡單的查詢。該函數主要用于SELECT語句。不管它的名字是什麼,它不僅用于SQL SELECT查詢,還可以對資料庫執行任何SQL語句。下面是一個基本的查詢函數示例:
<?php
global $wpdb;
$wpdb->query( $wpdb->prepare( " DELETE FROM $wpdb->my_custom_table WHERE
id = %d AND field_key = %d ", 1, 'address' ) );
?>
如你所見使用wpdb類query()函數執行查詢,删除ID為1的字段“address”。雖然query()函數允許在WordPress資料庫上執行任何SQL查詢,但其他資料庫對象類函數更适合于SELECT查詢。例如,get_ var()函數用于從資料庫中檢索單個變量:
<?php
global $wpdb;
$comment_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*)
FROM $wpdb->comments
WHERE comment_approved = %d;", 1 ) );
echo '<p>Total comments: ' . $comment_count . '</p>';
?>
這個例子檢索WordPress中所有被準許的評論的數量并顯示總數。盡管隻傳回一個标量變量,但會緩存查詢的整個結果集。最好嘗試使用WHERE子句來限制查詢傳回的結果集,隻檢索實際需要的記錄。在本例中,傳回所有注釋記錄行,即使顯示注釋的總數。這在大型網站上是一個巨大的記憶體沖擊。
複雜資料庫操作
要檢索整個表行,需要使用get_ row()函數。函數可以以對象、關聯數組或數字索引數組的形式傳回行資料。預設情況下,行作為一個對象傳回,在這種情況下是每個post資料的執行個體。這裡有一個例子:
<?php
global $wpdb;
$thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", 1 ) );
echo $thepost->post_title;
?>
這将檢索post ID 1的整個行資料并顯示post标題。$thepost對象的屬性是你查詢的表的列名,在這個例子中是wp_posts。為了以數組的形式檢索結果,你可以向get_row()函數發送一個額外的參數:
<?php
global $wpdb;
$thepost = $wpdb->get_row( $wpdb->prepare( "SELECT* FROM $wpdb->posts WHERE ID = %d", 1 ), ARRAY_print_r ( $thepost );
?>
通過使用get_ row()中的ARRAY_A參數,post資料将作為一個關聯數組傳回。或者可以使用array_ N參數傳回釋出資料在一個數字索引數組。
标準的SELECT查詢應該使用get_results()函數從資料庫檢索多行資料。下面的函數以數組的形式傳回SQL結果資料:
<?php
global $wpdb;
$liveposts = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title
FROM $wpdb->posts WHERE post_status = %d ", 'publish' ) );
foreach ( $liveposts as $livepost ) {
echo '<p>' .$livepost->post_title. '</p>';
}?
>
上面的示例是在WordPress中查詢所有已釋出的文章并顯示文章标題。查詢結果以數組的形式傳回并存儲在$liveposts中,然後可以通過該數組進行循環以顯示查詢值。WordPress資料庫類還具有用于UPDATE、INSERT和DELETE語句的特定函數。這三個函數消除了自定義SQL查詢的需求,因為WordPress将根據傳入函數的值為你建立它們。下面是insert()函數的結構:
$wpdb->insert( $table, $data, $format );
$table變量是想要插入值的表的名稱。$data變量是一個字段名和要插入到這些字段名中的資料的數組。最後一個參數是$format,它定義了一個要映射到$data中的每個值的格式數組。例如,如果你想在post元表中插入資料,你可以這樣執行:
<?php
global $wpdb;
$wpdb->insert(
$wpdb->postmeta,
array(
'post_id' => '1',
'meta_key' => 'address',
'meta_value' => '1428 Elm St.'
),
array(
'%d',
'%s',
'%s'
)
);
?>
在這個例子中,執行insert()函數,通過數組傳入三個變量。注意如何設定post _id、meta_key和meta _value作為要插入的三個字段。你可以将要插入的表中的任何可用字段和資料傳遞到該字段中。最後一個值是格式化數組,它的工作方式與我們在本章前面讨論的prepare()函數格式化非常相似。該數組包含插入到資料庫中的三個值的格式。
update()函數的工作原理與insert()函數非常相似,除了還需要設定$where子句和$where_ format變量,以便WordPress知道哪些記錄需要更新以及如何格式化:
$wpdb->update( $table, $data, $where, $format, $where_format );
$where變量是SQL where子句的字段名和資料數組。這通常設定為正在更新的字段的惟一ID,但也可以包含表中的其他字段名。
<?php
global $wpdb;
$wpdb->update(
$wpdb->postmeta,
array(
'meta_value' => '333 Wonderview Ave'
),
array(
'post_id' => '1',
'meta_key' => 'address'
),
array(
'%s'
),
array(
'%d',
'%s'
)
);
?>
$where變量是SQL where子句的字段名和資料數組。這通常設定為正在更新的字段的惟一ID,但也可以包含表中的其他字段名。
delete()函數的作用是:删除WordPress資料庫表中的資料。這個函數的結構類似于前面兩個函數,如下所示:
$wpdb->delete( $table, $where, $where_format );
$where參數設定查詢中的where子句,該子句決定要删除哪些資料。$where_format參數用于設定傳遞給函數的值的格式。讓我們删除你在前面的例子中建立的post位址中繼資料:
$wpdb->delete(
$wpdb->postmeta,
array(
'post_id' => '1',
'meta_key' => 'address'
),
array(
'%d',
'%s'
)
);
當你删除資料時,在虛拟資料上徹底測試你的代碼來驗證它是否如預期的那樣工作是非常重要的。在真實生産網站上運作未經測試的代碼可能會帶來災難性的結果。
上面介紹的insert()、update()和delete()函數不需要用prepare()函數包裝。這些函數在連接配接傳遞給它們的值的查詢之後實際上使用了prepare()函數。這比在WordPress中手動建立INSERT、UPDATE和DELETE查詢要簡單得多。
處理錯誤
每當處理查詢時,看到錯誤消息都是件好事。預設情況下,如果自定義查詢失敗,則不會傳回任何内容,是以很難确定查詢出現了什麼問題。wpdb類提供了向頁面顯示MySQL錯誤的函數。下面是使用這些函數的例子:
<?php
$wpdb->show_errors();
$liveposts = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_title
FROM $wpdb->posts_FAKE WHERE post_status = 'publish'") );
$wpdb->print_error();
?>
在執行查詢之前必須直接調用show_errors()函數。在執行查詢之後,必須直接調用print_error()函數。如果SQL語句中有任何錯誤,則會顯示錯誤消息。你也可以調用$wpdb‐->hide_errors()函數來隐藏所有MySQL錯誤,或者調用$wpdb‐>flush()函數來删除緩存的查詢結果。
資料庫類包含額外的變量來存儲關于WordPress查詢的資訊。下面是一些比較常見的變量清單:
var_dump($wpdb->num_queries);//運作查詢的總數
var_dump($wpdb->num_rows);//最後一個查詢傳回的行數
var_dump($wpdb->last_result);//最近的查詢結果
var_dump($wpdb->last_query);//最近執行的查詢
var_dump($wpdb->col_info);//最近查詢的列資訊
在執行查詢後直接添加上述代碼以檢視結果。這在确定為什麼資料庫查詢不能按預期工作時非常有用。另一個非常強大的資料庫變量是$queries變量。它存儲了WordPress運作的所有查詢。要啟用該變量,必須首先在wp-config.php檔案中将常量SAVEQUERIES設定為true。這告訴WordPress将每個頁面加載時執行的所有查詢存儲在$queries變量中。首先在你的wp-config.php檔案中删除這行代碼:
define( 'SAVEQUERIES', true );
現在,所有查詢都将存儲在$queries變量中。你可以像這樣顯示所有的查詢資訊:
var_dump( $wpdb->queries );//顯示頁面加載期間執行的所有查詢
當排除緩慢的加載時間故障時,這特别友善。如果一個插件執行了大量的查詢,這會大大降低WordPress的加載速度。記住在檢視完查詢後禁用SAVEQUERIES常量選項,因為存儲所有查詢也會減慢加載時間。
正如你在開發插件或建構更複雜的Loop時所看到的那樣當直接使用WordPress資料庫時,資料庫查詢類是一個重要的資産。前面提到的所有資料庫類函數都使用特定的轉義技術來驗證查詢是以盡可能安全的方式執行。借用Randall Munroe的“Little Bobby Tables”xkcd joke(xkcd #327),你不希望使用者手工制作一個包含DROP Tables的輸入項,作為惡意SQL注入進而導緻WordPress資料庫表丢失。查詢準備和轉義函數確定輸入不會變成SQL函數,無論它們的設定多麼巧妙。你必須遵循以下方法來查詢資料,以確定你的網站是最有效的,并盡可能使用最安全的技術。
直接資料庫操作
有些時候,你可能想直接使用WordPress資料庫資料。這可以包括通路插件或主題建立的自定義資料庫表。為此需要使用SQL語句從MySQL資料庫查詢資料。請記住,WordPress api提供了對所有WordPress表的通路,并且你隻是偶爾需要通路直接的表。本章中的所有示例查詢都使用wp _字首來表示表,但是你安裝WordPress時,資料庫表可能使用與wp-config.php檔案中定義的不同字首。
直接使用WordPress資料庫最常見的方法之一是使用phpMyAdmin。如第三章所述,phpMyAdmin是大多數托管公司提供的免費軟體工具,通過web界面管理MySQL資料庫。本節中的大多數示例都涉及到與MySQL的直接互動,将需要使用SQL指令行來執行它們。使用phpMyAdmin的預設資料庫視圖如圖6-3所示。
要在phpMyAdmin中運作SQL語句,隻需單擊頂部的SQL頁籤。在這裡你可以對你的WordPress資料庫執行任何查詢。我們總是建議在将查詢轉移到PHP腳本之前,先在phpMyAdmin中直接建立查詢。這背後的原因是直接在phpMyAdmin中調試SQL語句比在WordPress中使用PHP代碼要快得多。一旦完善了查詢,就可以在PHP代碼中使用它,并且可以确信結果将如預期的那樣。在下面的示例中,将使用原始SQL查詢。請記住,如果想在主題或插件中運作這些查詢,需要将查詢包裝在WordPress資料庫類中。
最常被通路的表之一是wp_posts表。該表存儲所有的文章、頁面、自定義文章類型、修訂,甚至附件記錄。不同類型的内容由post_type字段定義。WordPress 2.9為開發者引入了定義自定義文章類型的能力,這将在第7章中詳細讨論。這意味着在這個字段中可能存在額外的post _ type值。要檢視資料庫中的所有後期版本,可以運作以下查詢:
SELECT * FROM wp_posts
WHERE post_type = 'revision'
這将傳回wp_貼子中所有修訂貼子類型的記錄。你可以修改前面的查詢來檢視所有已經上傳到WordPress上的文章附件:
SELECT guid, wp_posts.* FROM wp_posts
WHERE post_type = 'attachment'
本例将字段guid作為查詢中傳回的第一個值。guid字段包含伺服器上附件檔案的完整URL。wp_option表包含為你的WordPress安裝儲存的所有設定。儲存在該表中的選項以option_name和option_value儲存。是以調用的實際字段名稱将始終是這兩個名稱,而不是基于選項值的特定字段。以下是本表中兩個極為重要的記錄:
SELECT * FROM wp_options
WHERE option_name IN ( 'siteurl','home' )
這個查詢傳回兩條記錄,一條是option_name是home,另一條是option_name是siteurl。這兩個設定告訴WordPress你的網站的域名是什麼。如果你需要改變你的網站的域名,你可以運作一個查詢來更新這兩個值,像這樣:
UPDATE wp_options
SET option_value = 'http://yournewdomain.com'
WHERE option_name IN ('siteurl','home')
一旦這個查詢運作,你的網站将立即運作在新的域名下。記住,這隻是在WordPress中更新網站的域名。文章和頁面中的附件url也需要更新以指向新域。插件也可以存儲域資訊,是以在更新産品網站之前,請確定在開發環境中進行測試。如果通路舊域,将被重定向到新域。如果已登入cookie和會話将無效,使用者将不得不再次登入。一個值得推崇的技術是在子域名(例如http://new.example.com)下建立一個新網站,并将url更新到網站。
wp_options表包含其他非常重要的字段。
要檢視你網站上的所有活動插件,你可以檢視active_plugins option_name,像這樣:
SELECT * FROM wp_options WHERE option_name = 'active_plugins'
選項表還存儲了插件定義的所有選項。在WordPress中激活的大多數插件都會有一些設定頁面。這些設定通常儲存在wp_option中,以便插件可以在需要時檢索這些設定。例如,Akismet插件存儲了一個名為Akismet _spam_count的選項,該選項存儲了垃圾評論的總數。可以通過執行以下查詢檢視該選項:
SELECT * FROM wp_options WHERE option_name = 'akismet_spam_count'
wp_users表包含了你目前在WordPress中設定的所有使用者。如果你允許在你的網站上開放注冊,當新使用者加入網站時,将在此表中建立新使用者。wp_users表存儲了非常重要的使用者資訊,包括使用者名、密碼、電子郵件、網站URL和注冊日期。假設想導出所有使用者的電子郵件位址。可以通過運作以下查詢輕松做到這一點:
SELECT DISTINCT user_email FROM wp_users
現在你可以輕松地導出所有加載到WordPress中的電子郵件位址!在wp_users中使用的另一個常見查詢是重置使用者的密碼。你可以用幾種不同的方法來做到這一點,但是如果你完全被鎖定在WordPress之外,你總是可以直接在資料庫中重置密碼。要做到這一點,你需要從MySQL指令行更新user_ pass字段:
UPDATE wp_users SET user_pass = MD5('Hall0w33n') WHERE user_login ='admin' LIMIT 1;
執行該查詢将管理者密碼重置為Hall0w33n。注意如何在MD5()中封裝新密碼。這将密碼轉換為MD5哈希。自從WordPress 2.5以來,密碼現在使用phpass加密庫而不是MD5進行加鹽和哈希處理。不過,不用擔心,因為WordPress是用來檢測MD5哈希密碼并将其轉換為phpass加密的。是以,前面的查詢将成功重置你在WordPress中的密碼。wp_comments表存儲送出到您網站的所有評論。該表包含評論、作者、電子郵件、網站URL、IP位址等。下面是一個顯示注釋的查詢示例:
SELECT wc.* FROM wp_posts wp
INNER JOIN wp_comments wc ON wp.ID = wc.comment_post_ID
WHERE wp.ID = '1554'
這個查詢傳回post ID 1554的所有注釋。wp_comments中的另一個重要字段是user_id字段。如果使用者登入到你的網站并發表了評論,該字段将包含他或她的使用者ID。考慮下面的代碼,它顯示了使用者admin留下的所有注釋:
SELECT wc.* FROM wp_comments wc
INNER JOIN wp_users wu ON wc.user_id = wu.ID
WHERE wu.user_login = 'admin'
在圖6-1的資料庫圖中,箭頭表示各表之間的關系。在編寫自定義查詢以直接從資料庫檢索資料時,這非常有用。例如,要檢索特定文章的所有評論,可以運作以下查詢:
SELECT * FROM wp_comments
INNER JOIN wp_posts ON wp_comments.comment_post_id = wp_posts.ID
WHERE wp_posts.ID = '1'
這個查詢傳回post ID 1的所有注釋。注意如何将wp_ comments.comment post_ID字段加入到wp_posts.ID字段。SQL JOIN是必要的,因為評論和文章之間是N:1的關系;每一篇文章可能有許多評論,但評論隻适用于一篇文章。這兩個字段在關系圖中顯示為這些表的連接配接字段。還考慮下面的示例,它示範了如何加入wp users和wp_ usermeta表:
SELECT * FROM wp_users
INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE wp_users.ID = '1'
正如你在資料庫圖中看到的那樣,wp _ users。ID字段被加入到wp_ usermeta . user_ ID字段。前面的查詢檢索使用者ID 1的所有使用者資訊,包括使用者中繼資料,該使用者ID 1是預設的admin帳戶。同樣,通過資料庫圖可以非常容易地确定如何通過WordPress資料庫中的索引值來連接配接表,以及邏輯INNER JOIN操作如何建構相關表行的結果集。如果你有興趣學習更多關于SQL的知識,你可以在http://www.w3schools.com/sql/上閱讀一些優秀的教程。也可以通路 https://www.chenxiaofang.site/ 閱讀更多WordPress教程
本章總結:
本章涵蓋了WordPress資料庫模式、資料庫表關系、WordPress資料庫類以及調試資料庫查詢的正确方法。無論是使用主題、插件還是自定義函數,了解如何使用WordPress資料庫是非常重要的。了解WordPress在資料庫中存儲資料的位置和方式可以幫助你開發更複雜的網站功能。
接下來,我們将介紹使用自定義文章類型的WordPress自定義内容。我們還将介紹自定義分類法、自定義中繼資料,以及這兩種方法在開發WordPress網站時的作用和重要性。