這篇文章主要介紹了基礎的WordPress插件制作教程,包括基本的使用ajax提交數據的實現,需要的朋友可以參考下
插件制作準備工作
首先我們在/wp-content/plugins目錄下添加一個文件夾叫做”My-Mood”,在文件夾中添加一個叫做index.php的主文件,這個是插件的主文件,文件的開始需要一些命名的格式:如下面的代碼
- <!--?php <br ?--> /*
- Plugin Name: My Mood
- Plugin URI: http://www.aips.me
- Description: 一個心情發布插件
- Version: 1.0
- Author: 周良博客
- Author URI: http://www.aips.me
- License: GPL
- */
- ?>
Plugin Name 代表了插件的名字。
Plugin URI 代表的是插件的發布地址。
Description 代表的是關于這個插件的描述。
Version 代表了版本好,第一個版本使用1.0,如果你的插件有更新,就依次更改這個版本參數。
Author 代表插件作者的名字。
Author URI 代表作者的主頁。。
License 代表了插件的License,如果你是開源的就使用GPL,關于License的參數可以百度或者Google查詢,這里不再過多的篇幅敘述。
插件的初始化安裝
插件不僅僅是樣式的改變,通常我們會加入新的表,那么新加的表我就是通過插件的安裝函數來完成的,我們繼續在index.php中加入如下的代碼:
- <!--?php <br ?--> //激活動作
- register_activation_hook( __FILE__, 'my_mood_install');
- function my_mood_install() {
- // 啟用時要做的事情
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $charset_collate = $wpdb->get_charset_collate();
- $sql = "CREATE TABLE $table_name (
- id mediumint(9) NOT NULL AUTO_INCREMENT,
- createdon datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
- publishedon datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
- status int NOT NULL,
- mood int NOT NULL,
- text text NOT NULL,
- address varchar(55) DEFAULT '' NOT NULL,
- UNIQUE KEY id (id)
- ) $charset_collate;";
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
- dbDelta( $sql );
- }
- ?>
如上面代碼的注釋,我們通過register_activation_hook激活動作來完成插件的安裝,激活動作通過參數my_mood_install,找到名為my_mood_install的函數執行,這個動作會在插件激活的時候執行。
我們通過my_mood_install函數創建了一張名為”mood”的表,數據庫表的創建是通過Wordpress的dbDelta函數來執行sql語句完成的,要想使用此函數需要先引入wp-admin/includes/upgrade.php文件。
通過上面的代碼我們就運用Wordpress內置的方法創建了一張給mood插件存儲數據的表。
插件卸載
既然Wordpress有安裝也一定會有卸載。Wordpress插件的卸載方法是通過一個叫做uninstall.php的固定命名文件來執行的,在插件根目錄下建一個名叫uninstall.php的文件,代碼內容如下所示:
- <!--?php <br ?--> //卸載動作
- my_mood_uninstall();
- function my_mood_uninstall() {
- // 執行內容
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $wpdb->query("DROP TABLE IF EXISTS " . $table_name);
- }
- ?>
通過Wordpress的$wpdb->query來執行sql,刪除我們安裝時的創建的表,這樣就刪除一切與該插件相關的內容了。
給插件添加后臺管理菜單
如下面的代碼:
- <!--?php <br ?--> //添加菜單
- add_action( 'admin_menu', 'my_mood_create_menu' );
- function my_mood_create_menu() {
- global $my_settings;
- $my_mood_settings=add_menu_page(
- "My Mood",
- "My Mood",
- "manage_options",
- "my-mood",
- "test"
- );
- }
- ?>
通過上面的代碼我們就可以為插件添加一個菜單。方法通過add_action( ‘admin_menu', ‘my_mood_create_menu' )添加一個菜單而菜單具體的頁面則是通過參數來綁定的,如上面的方法是傳入了叫做”test”的參數,因此當點擊這個”My Mood”的菜單的時候就會去尋找叫做”test”的方法進行樣式的輸出,我們給出test方法
- <!--?php <br ?--> function test(){
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $fivesdrafts = $wpdb->get_results(
- "
- SELECT id, createdon, publishedon,status,mood,text,address
- FROM $table_name
- ORDER BY createdon DESC
- "
- );
- ?>
- <div id="my-mood">foreach ( $fivesdrafts as $fivesdraft )
- {
- ?> }
- ?>
- <table class="widefat">
- <thead>
- <tr>
- <th>發布內容</th>
- <th>現在所在的</th>
- <th>心情</th>
- <th>創建日期</th>
- <th>操作</th>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <th>發布內容</th>
- <th>現在所在的</th>
- <th>心情</th>
- <th>創建日期</th>
- <th>操作</th>
- </tr>
- </tfoot>
- <tbody>
- <tr>
- <td><input name="text" type="text" value="" placeholder="輸入你的心情" /></td>
- <td><input name="address" type="text" value="" placeholder="輸入現在所在地" /></td>
- <td><label>高興:<input class="mood" checked="checked" name="mood" type="radio" value="0" /></label>
- <label>一般:<input class="mood" name="mood" type="radio" value="1" /></label>
- <label>悲傷:<input class="mood" name="mood" type="radio" value="2" /></label>
- <label>憂慮:<input class="mood" name="mood" type="radio" value="3" /></label>
- <label>其他:<input class="mood" name="mood" type="radio" value="4" /></label></td>
- <td></td>
- <td><a class="add">添加</a></td>
- </tr>
- <!--?php <br ?-->
- <tr>
- <td><input name="text" type="text" value="'<?php" />text; ?>'/></td>
- <td><input name="address" type="text" value="'<?php" />address; ?>'/></td>
- <td><label>高興:<input class="mood" name="mood<?php echo $fivesdraft->id; ?>" type="radio" />mood==0?'checked=checked':''; ?> value="0"></label>
- <label>一般:<input class="mood" name="mood<?php echo $fivesdraft->id; ?>" type="radio" />mood=='1'?'checked=checked':''; ?> value="1"></label>
- <label>悲傷:<input class="mood" name="mood<?php echo $fivesdraft->id; ?>" type="radio" />mood==2?'checked=checked':''; ?> value="2"></label>
- <label>憂慮:<input class="mood" name="mood<?php echo $fivesdraft->id; ?>" type="radio" />mood==3?'checked=checked':''; ?> value="3"></label>
- <label>其他:<input class="mood" name="mood<?php echo $fivesdraft->id; ?>" type="radio" />mood==4?'checked=checked':''; ?> value="4"></label></td>
- <td></td>
- <td><a class="edit">保存</a><a class="delete">刪除</a></td>
- </tr>
- <!--?php <br ?--></tbody>
- </table>
- </div>
- <!--?php <br ?--> }
- ?>
test方法是php與html代碼混編的樣式,其中HTMl部分主要負責樣式的輸出,而PHP的代碼則是負責執行取數據的邏輯。主要從數據庫讀取數據的部分,通過Wordpress的$wpdb->get_results方法就可以從數據庫中取出我們第一步中創建的表中的數據,返回的是一個數據集合,包含了多條數據。最后通過foreach循環將數據輸出。
我們把數據的界面顯示出來了,那么怎樣才能將數據保存呢?同樣根據上一篇心情插件的例子,先看下面的代碼
- <!--?php <br ?--> function aad_load_scripts($hook) {
- global $my_settings;
- if( $hook != $my_settings )
- return;
- /*載入ajax的js文件,也可以載入其他的javascript和/或css等*/
- wp_enqueue_script('my-ajax', plugins_url( 'my-mood/js/index.js', __FILE ), array('jquery'));
- wp_register_style( 'my-style', plugins_url( 'my-mood/css/style.css', __FILE ), array(), '', 'all' );
- wp_enqueue_style( 'my-style' );
- /*
- 創建驗證nonce
- 它會輸出類似于:
- <![CDATA[
- var aad_vars = {"aad_nonce":"5c18514d34"};
- ]]>
- 之類的被注釋掉的js到HTML。
- */
- wp_localize_script('my-js', 'my_vars', array(
- 'my_nonce' => wp_create_nonce('aad-nonce')
- )
- );
- }
- add_action('admin_enqueue_scripts', 'aad_load_scripts');
- ?>
其中index.js的代碼如下
- jQuery(document).ready(function(){
- jQuery("input").blur(function(){
- var value=jQuery(this).val();
- jQuery.ajax({
- type:"POST",
- url:"/wp-admin/admin-ajax.php",
- dataType: 'json',
- data:{action:"say",value:value},
- success:function(data){
- }
- });
- })
- jQuery(".add").click(function(){
- var parent=jQuery(this).closest("tr");
- var text=jQuery(parent).find("input[name='text']").val();
- var address=jQuery(parent).find("input[name='address']").val();
- var mood=jQuery(parent).find("input[type='radio']:checked").val();
- jQuery.ajax({
- type:"POST",
- url:"/wp-admin/admin-ajax.php",
- dataType: 'json',
- data:{action:"add_mood",text:text,address:address,mood:mood},
- success:function(data){
- window.location.href=window.location;
- }
- });
- })
- jQuery(".delete").click(function(){
- var parent=jQuery(this).closest("tr");
- var id=jQuery(parent).attr('data');
- jQuery.ajax({
- type:"POST",
- url:"/wp-admin/admin-ajax.php",
- dataType: 'json',
- data:{action:"delete_mood",id:id},
- success:function(data){
- window.location.href=window.location;
- }
- });
- })
- jQuery(".edit").click(function(){
- var parent=jQuery(this).closest("tr");
- var id=jQuery(parent).attr('data');
- var text=jQuery(parent).find("input[name='text']").val();
- var address=jQuery(parent).find("input[name='address']").val();
- var mood=jQuery(parent).find("input[type='radio']:checked").val();
- jQuery.ajax({
- type:"POST",
- url:"/wp-admin/admin-ajax.php",
- dataType: 'json',
- data:{action:"edit_mood",id:id,text:text,address:address,mood:mood},
- success:function(data){
- window.location.href=window.location;
- }
- });
- })
- });
在上面的代碼中我們通過Hook插入我們需要js代碼和css代碼,這樣我們插件的js和css就會因為插件的啟用而插入到頁面代碼中。
我們實現異步加載數據,要根據下面的代碼:
- <!--?php <br ?--> function say(){
- $return=array();
- $return['success'] = '1';
- $return['msg']=$_POST['value']."test-ajax";
- echo json_encode($return);
- die();
- }
- add_action('wp_ajax_say', 'say');
- ?>
這段代碼的意思是要使用ajax提交數據,add_action(‘wp_ajax_函數名',函數名)的格式就是注冊一個say路由,它對應的js代碼是
- jQuery("input").blur(function(){
- var value=jQuery(this).val();
- jQuery.ajax({
- type:"POST",
- url:"/wp-admin/admin-ajax.php",
- dataType: 'json',
- data:{action:"say",value:value},
- success:function(data){
- }
- });
- })
因此可以看到js代碼的action為say
同樣的道理數據要進行添加,注冊一個add_mood的路由
- <!--?php <br ?--> function add_mood(){
- $text=$_POST['text'];
- $address=$_POST['address'];
- $mood=$_POST['mood'];
- add($text,$address,$mood);
- $return=array();
- $return['success'] = '1';
- echo json_encode($return);
- die();
- }
- add_action('wp_ajax_add_mood', 'add_mood');
- ?>
數據要進行刪除,注冊一個delete_mood的路由
- <!--?php <br ?--> function delete_mood(){
- $id=$_POST['id'];
- delete($id);
- $return=array();
- $return['success'] = '1';
- echo json_encode($return);
- die();
- }
- add_action('wp_ajax_delete_mood', 'delete_mood');
- ?>
數據要進行編輯,注冊一個edit_mood的路由
- <!--?php <br ?--> function edit_mood(){
- $id=$_POST['id'];
- $text=$_POST['text'];
- $address=$_POST['address'];
- $mood=$_POST['mood'];
- edit($id,$text,$address,$mood);
- $return=array();
- $return['success'] = '1';
- echo json_encode($return);
- die();
- }
- add_action('wp_ajax_edit_mood', 'edit_mood');
- ?>
對應上面增刪改的php函數如下所示
- <!--?php <br ?--> function add($text,$address,$mood){
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $wpdb->insert(
- $table_name,
- array(
- 'createdon' => current_time( 'mysql' ),
- 'publishedon' => current_time( 'mysql' ),
- 'status' => 1,
- 'mood' => $mood,
- 'text'=>$text,
- 'address'=>$address,
- )
- );
- }
- ?>
- <!--?php <br ?--> function delete($id){
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $wpdb->delete(
- $table_name,
- array(
- 'id'=>$id
- )
- );
- }
- ?>
- <!--?php <br ?--> function edit($id,$text,$address,$mood){
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $wpdb->update(
- $table_name,
- array(
- 'mood' => $mood,
- 'text'=>$text,
- 'address'=>$address,
- ),
- array(
- 'id' => $id
- )
- );
- }
- ?>
現在插件的后臺數據和界面都已經處理完了,那么怎樣把我們的心情插件在前臺引用呢?我們需要添加下面的代碼
- <!--?php <br ?--> function mood_dispaly(){
- global $wpdb;
- $table_name = $wpdb->prefix . "mood";
- $fivesdrafts = $wpdb->get_results(
- "
- SELECT text
- FROM $table_name
- ORDER BY createdon DESC
- LIMIT 10
- "
- );
- ?>
- <!--?php <br ?--> }
- ?>
這段代碼就把數據庫中存儲的心情數據通過HTML顯示在前臺,那么樣子哪里控制的呢?還記得第一步我們添加的js和css嗎,是的,樣式就是通過第一步插入的樣式來控制的。
到此一個完整的心情插件就完成了,照著例子你就可以制作一個屬于自己的心情插件了。
新聞熱點
疑難解答