在 WordPress 中使用頁面模板創(chuàng)建自定義表單,讓用戶從前端頁面輸入數(shù)據(jù)過程是很麻煩的,主要麻煩的地方在于創(chuàng)建 HTML 表單并驗證用戶提交的數(shù)據(jù),這一個過程需要寫很多代碼,一不小心,很容易會出錯,導(dǎo)致表單提交不了,或出現(xiàn)一些安全性問題。
Nette From 類庫是 PHP Nette 框架中的表單處理類,我們可以把這個類拿出來單獨使用,使用方法也非常簡單,我們來看一下,下面的代碼都是寫在一個 WordPress 標準的頁面模板中的。
第一步,安裝并引入 Nette-From 類庫
通過 Composer 安裝 Nette-From 類庫
composer require nette/forms
如果不知道怎么使用 Composer,請參考本站之前的文章在WordPress主題或插件中使用 PHP Composer。
引入 Nette From 類
這一步很簡單,通過 Composer 安裝完成之后,直接在頁面模板中引入 Composer 生成的 autoload.php 文件即可。
require_once( dirname( __FILE__ ) . '/vendor/autoload.php' );
use Nette\Forms\Form;
創(chuàng)建表單并顯示
最重要的一步就是創(chuàng)建表單了,這也是和直接使用 HTML 創(chuàng)建表單不同的地方,在這里,創(chuàng)建表單的代碼完全寫在 PHP 中,不用再去寫亂七八糟的 HTML 代碼了,代碼量減少了不少,出錯的機會自然也少了。
// 獲取用戶數(shù)據(jù),在為表單設(shè)置默認數(shù)據(jù)時使用
$uid = wp_get_current_user()->ID;
$nickname = get_user_meta($uid, 'nickname' ,true);
$card = get_user_meta($uid, 'card' ,true);
//創(chuàng)建表單
$form = new Form;
$form->setMethod( 'POST' );
$form->addText( 'nickname', '昵稱:' )
->setRequired( '請輸入昵稱' ) // 這里設(shè)置了驗證此項為必填項
->setDefaultValue($nickname);
$form->addText( 'card', ' 會員卡號:' )
->setDefaultValue($card);
$form->addSubmit( 'send', '修改資料' );
//顯示表單
echo $forms;
在上面的代碼中:
- 我們需要使用 wp_get_current_user 函數(shù)獲取當前用戶
- 使用 get_user_meta 獲取當前用戶的自定義字段
提交到后臺
最后一步就是把提交過來的數(shù)據(jù)提交到后臺了,提交之前,我們可以先驗證一下表單的數(shù)據(jù)是否符合我們設(shè)置的條件,驗證過程 Nette From 幫我們處理了,我們只需要簡單的判斷一下是否驗證成功就可以了,如果驗證成功,就把數(shù)據(jù)保存到后臺,這里直接使用 update_user_meta 把數(shù)據(jù)保存到了用戶自定義字段。如果驗證失敗,就顯示錯誤提示信息。
// 驗證表單
if ( $form->isSuccess() ) {
// 獲取表單的值,有了這個,就不用通過丑陋的$POST[*]來獲取表單提交的值了。
$values = $form->getValues();
// 保存自定義字段,有了這個操作,才能保存數(shù)據(jù)到數(shù)據(jù)庫中
update_user_meta( $uid, 'nickname', $values->nickname);
update_user_meta( $uid, 'card', $values->card);
// 顯示成功提醒
echo '<div class="ui-c-alert ui-c-alert-success">用戶資料修改成功</div>';
}
// 如果表單有錯誤,顯示錯誤信息
$form->render( 'errors' );
到這里,一個功能完整的表單就處理好了,當然,演示代碼中需要處理的數(shù)據(jù)比較少,看起來可能沒什么必要,試想一下,如果表單項非常多的情況下,直接使用 HTML 創(chuàng)建表單,還是使用本文介紹的方法比較方便,相信結(jié)果是一目了然的。



樓主不是推薦是用piklist插件來做表單嗎?