GG資源網

wordpress資料庫操作類wpdb的詳細用法(純代碼解決WordPress發布文章ID不連續問題的方法)

wordpress資料庫操作類wpdb的詳細用法

wordpress提供了一系列用於資料庫操作的函數類 $wpdb,此類是一個全局變數,每次使用時都需要先global $wpdb。

執行資料庫查詢

你可以通過query函數在WordPress資料庫中執行任何SQL查詢。不過我們推薦為SELECT查詢使用更為具體的函數。

<?php $wpdb->query(『query』); ?>

query

(字元串)你希望執行的SQL語句。

函數返回一個與選定內容的行數相應的整數。如果發生MySQL錯誤,函數返回FALSE。(注意:0和FALSE都可能被返回,確保使用正確的比較運算符:equality == vs. identicality ===)。

注意:使用wpdb類中所有可執行SQL查詢的函數時,都需要將所有輸入內容/inputs進行字元轉義(如wpdb->escape($user_entered_data_string))。見下文。

示例

刪除ID為13的文章的「gargle」元關鍵字和值。

$wpdb->query(」
DELETE FROM $wpdb->postmeta WHERE post_id = 』13』
AND meta_key = 『gargle'」);

由delete_post_meta執行。

將頁面7設為頁面15的父級。

$wpdb->query(」
UPDATE $wpdb->posts SET post_parent = 7
WHERE ID = 15 AND post_status = 『static'」);

選擇一個變數

get_var函數返回一個來自資料庫的變數。雖然只返回一個變數,但查詢結果會被整體緩存,供後期使用。如果沒有查詢結果,返回NULL。

<?php $wpdb->get_var(『query』,column_offset,row_offset); ?>

query

(字元串)你希望執行的查詢。將該參數設為null會使函數返回上一個查詢緩存結果中的具體變數。

column_offset

(整數)預計的資料庫表的列數(0為表中第一列)。默認值為0。

row_offset

(整數)預計的資料庫表的行數(0為表中第一行)。默認值為0。

示例

檢索並返回用戶數量。

<?php
$user_count = $wpdb->get_var($wpdb->prepare(「SELECT COUNT(*) FROM $wpdb->users;」));
echo 『<p>User count is 『 . $user_count . 『</p>』;
?>

檢索並返回自定義欄位值得總數。

<?php
$meta_key = 『miles』;//set this to appropriate custom field meta key
$allmiles=$wpdb->get_var($wpdb->prepare(「SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s」, $meta_key));
echo 『<p>Total miles is 『.$allmiles . 『</p>』;
?>

選擇錶行

從某個查詢中檢索一整行內容,可使用get_row函數。該函數可將行作為對象、關聯數組或數值索引數組返回。如果查詢返回了多個行,函數只返回指定行,但所有返回的行都將被緩存以供日後使用。

<?php $wpdb->get_row(『query』, output_type, row_offset); ?>

query

(字元串)你希望執行的查詢語句。

output_type

三個預定義的常量之一。默認值為OBJECT。

OBJECT —— 返回的結果以對象形式輸出
ARRAY_A ——返回的結果以關聯數組形式輸出
ARRAY_N —— 返回的結果以數值索引數組形式輸出
row_offset

(整數)預計的資料庫表的行數(0為表中第一行)。默認值為0。

示例

獲取ID為10的鏈接的所有資料。

$mylink = $wpdb->get_row(「SELECT * FROM $wpdb->links WHERE link_id = 10」);
$mylink對象的屬性即SQL查詢結果的行名稱(在該例中,即 $wpdb->links表中的所有行)。

echo $mylink->link_id; // prints 「10」
使用

$mylink = $wpdb->get_row(「SELECT * FROM $wpdb->links WHERE link_id = 10」, ARRAY_A);
則會生成一個關聯數組:

echo $mylink[『link_id』]; // prints 「10」

$mylink = $wpdb->get_row(「SELECT * FROM $wpdb->links WHERE link_id = 10」, ARRAY_N);
則會生成一個數值索引數組:

echo $mylink[1]; // prints 「10」

選擇表列

要選擇資料庫表中的一列內容,可使用get_col函數。該函數輸出一個空間數組,如果查詢返回了多個列,函數只返回指定列,但所有返回的列都將被緩存以供日後使用。

<?php $wpdb->get_col(『query』,column_offset); ?>

query

(字元串)你希望執行的查詢。將該參數設為null會使函數返回上一個查詢的緩存結果中的執行表列。

column_offset

(整數)預計的資料庫表的列數(0為表中第一列)。默認值為0。

示例

在這個例子中,我們假設有一個專註於發布汽車資訊的博客,博客中每篇文章都介紹了一輛特別的汽車(如1969 Ford Mustang)。此外我們將三個自定義欄位——manufacture、model和year指定給各篇文章。這裡我們的目的是顯示manufacturer(生產商)為Ford的所有文章的標題,各個標題按模型和年份排列。

可以利用wpdb類的get_col形式返回一個符合要求、以正確順序排列的文章ID數組。然後通過foreach構造函數重複該文章ID數組,顯示每篇文章的標題。本示例的SQL查詢由 Andomar編寫。

<?php
$meta_key1 = 『model』;
$meta_key2 = 『year』;
$meta_key3 = 『manufacturer』;
$meta_key3_value = 『Ford』;

$postids=$wpdb->get_col($wpdb->prepare(」
SELECT key3.post_id
FROM $wpdb->postmeta key3
INNER JOIN $wpdb->postmeta key1
on key1.post_id = key3.post_id
and key1.meta_key = %s
INNER JOIN $wpdb->postmeta key2
on key2.post_id = key3.post_id
and key2.meta_key = %s
WHERE key3.meta_key = %s
and key3.meta_value = %s
ORDER BY key1.meta_value, key2.meta_value」,$meta_key1, $meta_key2, $meta_key3, $meta_key3_value));

if ($postids) {
echo 『List of $meta_key3_value . 『(s), sorted by 『 . $meta_key1 . 『, 『 . $meta_key2;
foreach ($postids as $id) {
$post=get_post(intval($id));
setup_postdata($post);?>
<p><a href=」<?php the_permalink() ?>」 rel=」bookmark」 title=」Permanent Link to <?php the_title_attribute(); ?>」><?php the_title(); ?></a></p>
<?php
}
}
?>

選擇生成的結果

get_results可以從資料庫中抽取函數生成的多行結果。Wpdb函數以數組形式返回整個查詢結果。數組中每個元素都對應查詢結果中的一行,如get_row既可以是對象,也可以是關聯數組或數值型數組。

<?php $wpdb->get_results(『query』, output_type); ?>

query

(字元串)你希望執行的查詢語句。將該參數設為null會使函數返回上一個查詢的緩存結果中的信息。

output_type

三個預定義的常量之一。默認值為OBJECT。更多信息請見上文中的「選擇錶行」。

OBJECT —— 以對象形式輸出返回的結果
ARRAY_A ——以關聯數組形式輸出返回的結果
ARRAY_N —— 以數值索引數組形式輸出返回的結果
示例

獲取ID為5的用戶的所有文章草稿的ID和標題並回應標題。

$fivesdrafts = $wpdb->get_results(「SELECT ID, post_title FROM $wpdb->posts
WHERE post_status = 『draft』 AND post_author = 5」);

foreach ($fivesdrafts as $fivesdraft) {
echo $fivesdraft->post_title;
}

獲取ID為5的用戶的所有文章草稿信息。

<?php
$fivesdrafts = $wpdb->get_results(「SELECT * FROM $wpdb->posts
WHERE post_status = 『draft』 AND post_author = 5″);
if ($fivesdrafts) :
foreach ($fivesdrafts as $post) :
setup_postdata($post);
?>
<h2><a href=」<?php the_permalink(); ?>」 rel=」bookmark」
title=」Permanent Link to <?php the_title(); ?>」><?php the_title(); ?></a></h2>
<?php
endforeach;
else :
?>
<h2> Not Found</h2>
<?php endif; ?>

插入錶行/列

在資料庫表中插入一行/列內容。

示例

在一行中插入兩列內容,第一個列的值為字元串,第二列的值為數字:

$wpdb->insert( 『table』, array( 『column1』 => 『value1』, 『column2』 => 123 ), array( 『%s』, 『%d』 ) )
可能的值:- %s 為字元串,- %d 為十進位數字,- %f 為浮點。

更新錶行/列

更新資料庫表中某行/列的內容。

示例

要更新一個錶行,其ID為1,該行第一列中的值是一個字元串,第二列中的值是一個數字:

$wpdb->update( 『table』, array( 『column1』 => 『value1』, 『column2』 => 『value2』 ), array( 『ID』 => 1 ), array( 『%s』, 『%d』 ), array( 『%d』 ) )
防止資料庫查詢遭到SQL注入式攻擊
更多在WordPress中避免SQL攻擊的信息,請看數據驗證。這是WordPress代碼編寫者和插件開發者的必讀文章。

簡單地說,執行SQL查詢以阻止SQL注入式攻擊前,SQL查詢中的所有數據都需要經過SQL字元轉義。可以通過prepare方法快速完成字元轉義,該方法使用 sprintf()-like語句。

<?php $sql = $wpdb->prepare( 『query'[, value_parameter, value_parameter … ] ); ?>

query

(字元串)你希望執行的SQL查詢,以 %s 與%d作為佔位符。

value_parameter

(字元串)提交到佔位符中的值。該值此時必須沒有被SQL轉義。

示例

將Meta key => value pair 「Harriet』s Adages」 => 「WordPress』 database interface is like Sunday Morning: Easy.」添加到ID為10的文章。

$metakey = 「Harriet』s Adages」;
$metavalue = 「WordPress』 database interface is like Sunday Morning: Easy.」;

$wpdb->query( $wpdb->prepare( 」
INSERT INTO $wpdb->postmeta
( post_id, meta_key, meta_value )
VALUES ( %d, %s, %s )」,
10, $metakey, $metavalue ) );

由add_meta()執行。

注意,這時你無須擔心引用字元串。不要直接將變數傳遞給SQL查詢,可將 %s作為字元串的佔位符, %d作為整數的佔位符。你可以傳遞任意個值,每一個都可以作為prepare()方法的新參數。

顯示/隱藏SQL錯誤

你可以用show_errors來顯示SQL錯誤,也可以用hide_errors隱藏SQL錯誤。

<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?>

同樣也可以用print_error輸出近期的查詢所生成的錯誤。

<?php $wpdb->print_error(); ?>

獲取資料庫表中某列信息
利用get_col_info可以檢索到近期查詢的表列信息。當你不了解某個函數返回的對象的屬性時,就可以通過get_col_info函數獲取信息。該函數從指定列中輸出所需信息,如果沒有指定某列,則函數輸出一個以查詢結果中所有列的信息為內容的數組。

<?php $wpdb->get_col_info(『type』, offset); ?>

type

(字元串)你希望檢索的信息。可能為以下任何值之一(摘自 ezSQL文檔)。默認值為name。

name ——表列的名稱。默認值
table ——列所屬表格的表格名稱
max_length —— 表列的最大長度
not_null —— 若表列不為Null則值為1
primary_key —— 若表列是一個主鍵,值為1
unique_key —— 若表列是唯一鍵,值為1
multiple_key —— 若表列是非唯一鍵,值為1
numeric —— 若表列是數值型,值為1
blob —— 若表列為BLOB,值為1
type —— 表列的類型
unsigned —— 若表列無符號,值為1
zerofill —— 若表列為zero-filled,值為1
offset

(整數)從某個檢索信息的表中指定表列(0為表中第一列)。默認值為-1。

-1 —— 從所有表列中檢索信息。輸出一個數組。默認值。
非負整數 —— 從指定的表列中檢索信息(0為表中第一列)。

清除緩存

用flush清除SQL結果緩存。

<?php $wpdb->flush(); ?>

這會清除$wpdb->last_result、$wpdb->last_query以及$wpdb->col_info信息。

類變數
$show_errors

是否顯示SQL錯誤信息。默認為TRUE。

$num_queries

已經被執行的查詢次數

$last_query

最近一次已經被執行的查詢

$queries

將SAVEQUERIES常量設為TRUE(該常量默認值為FALSE),可以保存所有資料庫查詢及其停止時間。如果SAVEQUERIES值為TRUE,你的查詢會被作為數組保存在$queries變數中。

$last_result

最近一次查詢結果。

$col_info

最近一次查詢結果的表列信息。參見獲取表列信息。

$insert_id

最近一次INSERT查詢為AUTO_INCREMENT列生成的ID。

$num_rows

最近一次查詢返回的行數。


在wpdb類中可以引用WordPress資料庫表。

$posts

關於文章的資料庫表

$users

關於用戶的資料庫表

$comments

評論表

$links

鏈接表

$options

選項表

$postmeta

元數據(自定義欄位)表

$usermate

usermeta表中含有用戶的其它信息,如昵稱、個人說明與許可權。

$terms

terms表中包括對分類目錄、鏈接分類、標籤的「說明」(description)

$term_taxonomy

term_taxonomy表介紹了WordPress的不同分類(taxonomy)。分類目錄、鏈接分類、標籤都是一種分類。

$term_relationships

term_relationships表中含有術語以及使用術語的對象之間的鏈接,即該表可以指向日誌所屬的分類目錄。

純代碼解決WordPress發布文章ID不連續問題的方法

WordPress因為歷史修訂版本(revision)、自動保存(autosave)和自動草稿(auto-draft)功能會非常討厭的增加文章ID的數字,會造成連續的兩篇文章,ID數值可能會相差很多,所以默認情況下發布的文章ID不是連續的,使用ID做為Permalink結構的用戶將會看到一個地址越來越混亂的WordPress。讓希望文章ID連續的人感到非常不舒服,尤其是使用了文章 ID 作為固定連接之後,每篇文章的 ID 並不連續,非常不好。

除了上述的這些可能造成文章ID不連續外,WordPress還會在「修改文章/頁面、添加導航菜單、添加/新建頁面、上傳的圖片/附件(上傳新媒體文件)」等情況下佔用ID,是造成文章 ID 不連續的罪魁禍首。這種佔用沒有太好的方法進行解決。

網上的解決步驟一般是「禁止/關閉自動草稿及歷史修訂版本保持文章ID連續的方法」,這種方法能優化資料庫,但並沒有完全解決文章ID不連續的問題(有時會出現間隔一個ID不連續的問題)。還有,不在媒體庫上傳媒體、不建立頁面等等,但這種方法會導致使用上的不便利,而且很有局限性。所以,本文將介紹一個完美解決WordPress文章ID不連續問題的兩種方法。(在 WordPress 4.9 版本中測試有效)

由於網站搬家,部分鏈接失效,如無法下載,請聯繫站長!謝謝支持!
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » wordpress資料庫操作類wpdb的詳細用法(純代碼解決WordPress發布文章ID不連續問題的方法)

發表回復

CAPTCHAis initialing...