當(dāng)前位置:首頁>WordPress建站>WordPress開發(fā)>為WordPress主題或插件創(chuàng)建和使用自己的表

為WordPress主題或插件創(chuàng)建和使用自己的表

前幾天百度知道中有人問如何在Wordpress中使用自己的表,我看他已采納的答案,能用,但是可能會報錯,可能報的錯是:頭部已發(fā)送之類的,這篇文章就我為某個客戶寫過的一個插件聊一下如何在Wordpress數(shù)據(jù)庫中使用自己的表而不出錯:2個知識點分別是數(shù)據(jù)庫的創(chuàng)建、查詢、更新、刪除,另外一個是正確處理文件頭的輸出,不讓瀏覽器報錯。

提示:插件的常量和全局變量定義、i18n、業(yè)務(wù)部分等細(xì)節(jié),這里就不提供了,僅提供與數(shù)據(jù)庫操作相關(guān)的代碼和經(jīng)驗。

1.在插件被啟用后創(chuàng)建表,這個不需要后臺選項,直接上代碼:

//Active
register_activation_hook(__FILE__,'coolwp_message_active');
/**
*return:Creat my table when my plugin be activated.
*parameter:none
*@author:Suifengtec suoling.net
*/
function coolwp_message_active() {
	global $wpdb;
	$table_name = CWP_PLUGIN_PM_TABLE;
	if($wpdb->get_var("show tables like '$table_name'") != $table_name){
		$sql = 'CREATE TABLE IF NOT EXISTS `'.$table_name.'` (
			`id` int(11) NOT NULL auto_increment,
			`from_id` text default NULL,
			`from_time` datetime default NULL,
			`to_id` varchar(200) default NULL,
			`viewed` varchar(10) default NULL,
			`subject` varchar(200) default NULL,
			`content` text,
			UNIQUE KEY `id` (`id`)
			) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;';
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
dbDelta($sql);
}
}

2.在禁用插件時,刪除自用數(shù)據(jù)庫的表,建議加上后臺選項,因為我提供的是FTP升級,所以,這個插件就沒考慮,上代碼:

//Deactive
register_deactivation_hook( __FILE__, 'coolwp_message_deactive' );
/**
*return:Delete my table when my plugin be deactivated.
*parameter:none
*@author:Suifengtec suoling.net
*/
function coolwp_message_deactive() {
	global $wpdb;
	$table_name = CWP_PLUGIN_PM_TABLE;
	if($wpdb->get_var("show tables like '$table_name'")== $table_name){
		$sql = 'DROP TABLE  `'.$table_name.'`';
		$wpdb->query($sql);
	}
}

3.此部分代碼為表單中為具有相應(yīng)權(quán)限的用戶顯示的的按鈕(這不是重點,但是下面要用,此部分代碼中的常量CWP_PLUGIN_PM_SLUG已經(jīng)被定義,是用于插件本地化的slug):

編輯按鈕:

<?php if(current_user_can( 'manage_options' )): ?>
<input type="submit" name="alp_edit" value="確定" class="button-primary" /> |
<?php endif; ?>

4.進(jìn)行編輯操作,因為此文件開頭已經(jīng)拒絕了來自來自別處的請求,所以就不用再次考慮安全性的問題了,但是,變量是一定要過濾的:

if($_POST['cwp_pm_edit']){
	$sql = 'update '.$table_name.' set  content="'.$data['content'].'" ,subject = "'.$data['subject'].'" where id = '.$data['id'];
	if($wpdb->query($sql)){
		coolwp_alp_message_LastUrl('update');
	}else{
		cwp_alp_message_sql_error('update');
	};
}//edit

上面的$sql中的變量已經(jīng)經(jīng)過過濾。上面這個判斷的意思是:如果那個編輯按鈕被點擊,就修改數(shù)據(jù)庫中的值,修改后的值來自于被過濾后的表單輸入,當(dāng)然了,如果你想來點兒高級的,你可以用ajax判斷下被修改的值與新值是否一致,如果全部一致,那就返回并提示不用修改,我的處理簡單而粗暴:成功了就重定向,不成功了就拋出一個錯誤。

重點來了:重定向函數(shù)coolwp_alp_message_LastUrl('update');

/**  
*return: Redirect.  
*parameter:the action name.  
*@author:Suifengtec suoling.net  
*/  
function coolwp_alp_message_LastUrl($str){
/*
php.ini中有一段話:  
; Output buffering allows you to send header lines (including cookies) even  
; after you send body content, at the price of slowing PHP's output layer a  
; bit.  You can enable output buffering during runtime by calling the output  
; buffering functions.  You can also enable output buffering for all files by  
; setting this directive to On.  If you wish to limit the size of the buffer  
; to a certain size - you can use a maximum number of bytes instead of 'On', as  
; a value for this directive (e.g., output_buffering=4096).  
output_buffering = Off  
,我調(diào)試用的php環(huán)境的output_buffering是關(guān)閉的,output_buffering的作用是緩沖輸出,如果是output_buffering=XXXX(比如是4096,那么,緩沖區(qū)大小是4096b,),那么就需要ob_end_clean();這一句了。  
ob_end_flush()或者ob_end_clean()的作用是終止緩沖;  
ob_flush()的作用是將緩沖輸出出去,但是不會終止緩沖,所以在flush()之前使用;  
如不想使用ob_end_clean()、ob_end_flush()、ob_flush(),就需要把php.ini里的output_buffering設(shè)得足夠小,例如0,也可以關(guān)閉了,也就是output_buffering = Off。  
注意:  
ob_flush()和flush()是有區(qū)別的:前者是把數(shù)據(jù)從PHP的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數(shù)據(jù)發(fā)送到瀏覽器。所以當(dāng)緩沖存在的時候,我們必須ob_flush()和flush()同時使用。  
當(dāng)然flush()也并不是不可或缺的,你如果決定在有數(shù)據(jù)輸出時,馬上輸出到瀏覽器的話,可以上去flush();  
當(dāng)你把output_buffering設(shè)為0或者Off的時候,連ob_flush()和ob_end_clean()都不需要了.  
OVER  
by Suifengtec 2014.02.23 Suoling.net  
*/  
	ob_end_clean();   //清空(擦除)緩沖區(qū)并關(guān)閉輸出緩沖。此函數(shù)丟棄最頂層輸出緩沖區(qū)的內(nèi)容并關(guān)閉這個緩沖區(qū)。如果想要進(jìn)一步處理緩沖區(qū)的內(nèi)容,必須在ob_end_clean()之前調(diào)用ob_get_contents(),因為當(dāng)調(diào)用ob_end_clean()時緩沖區(qū)內(nèi)容將被丟棄。
	if('save'==$str){   
		header("Location:".$_SERVER ['HTTP_REFERER' ].'#send');   
	}elseif('delete'==$str||'update'==$str){   
		header("Location:".$_SERVER ['HTTP_REFERER' ].'#list');   
	}
	//正確下面兩個函數(shù)的順序是: 先ob_flush, 然后flush
	ob_flush();   //取出PHP buffering中的數(shù)據(jù),放入server buffering
	flush();   // 取出Server buffering的數(shù)據(jù),放入browser buffering,簡單說,就是刷新輸出緩沖
}

上面的注釋應(yīng)該已經(jīng)很清楚了吧?如果沒看明白,請自行到php.net查看官方文檔。

不成功了就拋出錯誤:

//Throw a sql error info.
function cwp_alp_message_sql_error($str){
if('save'==$str)
add_action( 'admin_notices', 'cwp_alp_message_sql_save_error');

if('update'==$str)
add_action( 'admin_notices', 'cwp_alp_message_sql_update_error');

if('view'==$str)
add_action( 'admin_notices', 'cwp_alp_message_sql_view_error');

if('delete'==$str)
add_action( 'admin_notices', 'cwp_alp_message_sql_delete_error');
}

上面的函數(shù)都是直接的輸出函數(shù),就不用浪費版面上代碼了。
補充:數(shù)據(jù)庫的查詢:
由于下面的查詢語句被使用的比較多,所以我就專門寫了個函數(shù)

/**
*return: Correct sql query
*parameter:none
*@author:Suifengtec suoling.net
*/
function cwp_alp_message_received(){
	$table_name =CWP_PLUGIN_PM_TABLE;//已被定義的表名常量:define('CWP_PLUGIN_PM_TABLE',$table_prefix .'cwp_XXX');
	$usr_name=cwp_get_current_user();
	return 'select * from  '.$table_name.' '.'where to_id = "'.$usr_name.'"'.' AND viewed = "0"';
}

上面的函數(shù)cwp_get_current_user()返回的是當(dāng)前用戶的user_login(登錄名稱,因為在WP中,這個是不可以修改的,所以用這個,當(dāng)然,如果你想麻煩些,你可以用用戶ID)。
Tips:如果你在插件中使用 is_user_logged_in() 或者get_currentuserinfo()之類與當(dāng)前用戶相關(guān)的函數(shù),你會發(fā)現(xiàn)WP會拋出一個致命錯誤:
Fatal error: Call to undefined function is_user_logged_in() ...
或者
Fatal error:Call to undefined function wp_get_current_user() ......
之類的,如何解決這個問題,我會在下一篇文章中介紹。
繼續(xù)說數(shù)據(jù)庫的查詢:
下面的函數(shù)用于返回用戶收到的消息的條數(shù),比較簡單:

/**
*return: The amount of message I received
*parameter:none
*@author:Suifengtec suoling.net
*/
function cwp_alp_num_of_message_i_has_received(){
	global $wpdb;
	$table_name =CWP_PLUGIN_PM_TABLE;//還是表
	$sql=cwp_alp_message_received();//就是上面定義的查詢語句
	$info = $wpdb->get_results($sql);
	return count($info);
}

也就是說:數(shù)據(jù)庫的查詢需要構(gòu)建一個查詢語句,然后用WP內(nèi)置的$wpdb去查詢,具體使用如上面函數(shù)所示。

希望各位高手不吝賜教!如果你是真正的WP愛好者,請不要使用盜版的WP產(chǎn)品,特別是國產(chǎn)的WP作品,以促進(jìn)WP良好的發(fā)展并獲得所用產(chǎn)品良好的支持和版本更新。

祝愉快!

聲明:本站所有文章,如無特殊說明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個人或組織,在未征得本站同意時,禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學(xué)公眾號 WPDAXUE
WordPress開發(fā)

對倡萌童鞋《WordPress 個人資料添加額外的字段》的補充

2014-2-27 10:25:53

WordPress開發(fā)

使用Options Framework框架為自己的主題添加設(shè)置頁面

2014-3-6 12:02:33

12 條回復(fù) A文章作者 M管理員
  1. 又不說是什么插件,完全不知所云

  2. 請注意:這里說的是如何使用,并已經(jīng)說明:

  3. 請注意:這里說的是如何使用,并已經(jīng)說明:

  4. 如何調(diào)用呢?我的頁面提示Fatal error: Call to undefined function cwp_get_current_user() in E:wwwPHPnow-1.5.6htdocswp-contentpluginshsnctice.php on line 76
    我調(diào)用方式為:<?cwp_alp_num_of_message_i_has_received(); ?>

    • 文中提到:如何解決這個問題,我會在下一篇文章中介紹。
      下周會寫出來

    • coolwp.net

      期待中

    • 請在站內(nèi)搜索,已經(jīng)發(fā)布了

    • 提示:插件的常量和全局變量定義、i18n、業(yè)務(wù)部分等細(xì)節(jié),這里就不提供了,僅提供與數(shù)據(jù)庫操作相關(guān)的代碼和經(jīng)驗。
      文章已經(jīng)有提示了,這是個教程,不是個開包即用的插件,是我的插件中的部分與數(shù)據(jù)庫表有關(guān)的代碼及其解釋。

  5. 用戶禁用插件的時候把表刪除了,那如果用戶要再次啟用的話,以前表中存的數(shù)據(jù)(如果有的話)是不是就丟了?

    • 請注意:這里說的是如何使用,并已經(jīng)說明:建議加上后臺選項。

    • Jay

      意思就是說讓用戶禁用時選擇刪除還是保留數(shù)據(jù),對么

  6. 超級efly

    完全不會MYSQL~

?
個人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

大宁县| 宿迁市| 宜章县| 化隆| 淳安县| 张家界市| 清涧县| 奈曼旗| 鹤壁市| 随州市| 沛县| 富顺县| 邵阳县| 南江县| 西畴县| 奈曼旗| 潍坊市| 吐鲁番市| 苍溪县| 福海县| 四子王旗| 宜宾县| 长岭县| 汝阳县| 米易县| 闸北区| 运城市| 湖南省| 秀山| 吉隆县| 峨边| 育儿| 台中市| 河曲县| 台东县| 苏尼特右旗| 武鸣县| 古田县| 台湾省| 土默特右旗| 临汾市|