前幾天百度知道中有人問如何在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)品良好的支持和版本更新。
祝愉快!






又不說是什么插件,完全不知所云
請注意:這里說的是如何使用,并已經(jīng)說明:
請注意:這里說的是如何使用,并已經(jīng)說明:
如何調(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(); ?>
文中提到:如何解決這個問題,我會在下一篇文章中介紹。
下周會寫出來
期待中
請在站內(nèi)搜索,已經(jīng)發(fā)布了
提示:插件的常量和全局變量定義、i18n、業(yè)務(wù)部分等細(xì)節(jié),這里就不提供了,僅提供與數(shù)據(jù)庫操作相關(guān)的代碼和經(jīng)驗。
文章已經(jīng)有提示了,這是個教程,不是個開包即用的插件,是我的插件中的部分與數(shù)據(jù)庫表有關(guān)的代碼及其解釋。
用戶禁用插件的時候把表刪除了,那如果用戶要再次啟用的話,以前表中存的數(shù)據(jù)(如果有的話)是不是就丟了?
請注意:這里說的是如何使用,并已經(jīng)說明:建議加上后臺選項。
意思就是說讓用戶禁用時選擇刪除還是保留數(shù)據(jù),對么
完全不會MYSQL~