52AV手機A片王|52AV.ONE
標題: WordPress自定義短代碼Shortcode以及產生編輯器短代碼按鈕 [打印本頁]
作者: IT_man 時間: 2016-6-9 12:40
標題: WordPress自定義短代碼Shortcode以及產生編輯器短代碼按鈕
WordPress自定義短代碼Shortcode以及產生編輯器短代碼按鈕(shortcode button)- K) D8 Q$ @: Z( X* L" M) J
( q- x) M( H" @0 \3 P/ S" }3 A
wordpress Shortcode即wordpress短代碼功能是在wordpress 2.5版本開始被引入,用户透過wordpress短代碼可以非常方便快速地在編輯文章或頁面的時候插入動態内容,短代碼的常見應用有插入最新文章、插入廣告、插入音樂視訊、插入下載按钮等。Blog請别人制作wordpress模板時,透過wordpress Shortcode實現了page頁面動態插入不同的幻灯片。( y1 W& \) y/ P) L! h7 p" @
以下是 wordpress 短代碼的詳细介紹及進階應用。
" P0 S' n1 w. B" d8 p- |7 ]8 q
3 v4 E* i4 T6 u3 L2 `短代碼的 wordpress 使用非常簡單。 例如我們想要顯示為指定最近的文章 , 我們可以使用的程式碼類似於下列 :
% B% D+ c1 l! o) U* F% p此外 , 我們可以設定一個參數來控制文章的數量 :
7 r( ]9 B2 v% h x( n7 |2 V0 ]+ S此外 , 我們也可以為文章列表新增一個標題 :) u# }9 P g; }/ ?5 F' ]/ g) S
- [recent-posts posts="5"]Posts Heading[/recent-posts]
複製代碼 + S# `5 x1 z$ c }
) H$ I4 K$ N* t4 L
1. 簡單的短代碼. Y9 ]1 Q+ T: M, z
本教學的第一部分 , 我們會建立下列短代碼的程式碼 :
z& }; W7 J" |/ y a" V* [4 b該程序的建立是非常簡單並且不需要非常進階 PHP 知識。 建立過程如下 :) @# }% Z0 ^: M* u) v
- 建立一個函數 , 當 wordpress發現短代碼時會呼叫此函數 ;
- 藉由設置一個唯一的名稱來註冊短代碼 ;
- 把註冊的函數連結到wordpress的action上。
) Q% {( x) b- D% h
/ U. k! K4 |2 F6 L& q( B
本教學所有程式碼將會直接放到function.php(控制台==>外觀==>主題編輯器==>function.php) ,也可以放在一個被包含在function.php的單獨的php檔案中。
4 t g2 x; c e+ z1.1 建立返回函數
3 @2 x Y L# c: g: ~當發現短代碼的時候,它會被一個稱作返回函數的一段代碼所代替,所以我們先建立一個函數,從資料庫中獲取最新的文章。
9 ^8 G8 A4 F3 u; p8 k- function recent_posts_function() {9 M, g7 e+ @9 {
- query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => 1));$ x, }5 L4 i( y r+ {5 B
- if (have_posts()) :
" z& s# e! U$ X7 ?; Z- l8 T - while (have_posts()) : the_post();. J6 J7 `6 A4 W: f
- $return_string = '<a href="'.get_permalink().'">'.get_the_title().'</a>';# B7 o" \' |7 a n. p1 a
- endwhile;
$ w. |& F% b8 A% A4 b - endif;. p8 l7 m' \8 v# p5 ?8 z Q) A0 T" `
- wp_reset_query();
5 l) ?' @, `- N+ e a8 f - return $return_string;1 |8 O; K2 I* v
- }
複製代碼 如上所示,我們查詢資料庫,獲取最新的文章,並返回一個帶有鏈接的字串。值得註意的是,返回函數並不印任何內容,而是返回一個字串。
2 G% w$ N5 y) h! u% ~! g, ?. `0 z m& D& I! R+ W. C# x
3 ]" }! ?# g X
1.2 註册短代碼
# S/ @. v! }( {$ n6 T& s, f0 p( @, ^現在,我們告訴Wordpress這個函數是一個短代碼:- function register_shortcodes(){" h( r! T+ o/ `! N- {- t) M7 e
- add_shortcode('recent-posts', 'recent_posts_function');3 D8 R8 ]) E, J6 O
- }
複製代碼 當在文章的內容中使用短代碼" N% W# K/ F4 t! `9 H
將會自動呼叫 recent_posts_function() 函數,我們需要確保短代碼的名字是唯一的,以避免重複。/ N' I6 L$ B$ v+ B# P+ N
! p1 p1 r) x' T
a$ \# s0 m' k9 S* o2 }1.3 Hook into WordPress
8 D! _) r; f# g. S, b3 g# g
5 G" R7 S2 v" M7 R/ c! ]為了能夠執行 recent_posts_function() 函數,我們需要把它綁定在 WordPress 的初始化鉤子中。
) }8 _& J- ~5 b/ c4 V8 Q- add_action( 'init', 'register_shortcodes');
複製代碼 3 _5 o- y# m- _3 k1 ^
1.4 測試短代碼
0 D }9 Z& P8 e. I4 @' \簡單的短代碼已設定 , 我們現在需要測試是否能正常執行。 我們可以建立新文章 ( 或開啟現有 ) , 將下列代碼加到文章內容的某個位置 :2. 進階短代碼
2.1 短代碼参數
短代碼是非常有彈性 , 因為它讓我們加入參數可讓它們有更多的功能。 假設我們必須要顯示某一特定數量的最新的文章。 為了達到這個目的 , 我們需要給短代碼指定其他選項以顯示最近的文章數。
我們需要使用兩個函數 ,第一個是內建在 wordpress 的shortcode _ atts ( ) 函式 , 它把用戶的短代碼屬性與本地屬性結合在一起 , 並填入到想要的位置。 第二個是 PHP的extract() 函数 , 顧名思義 , 它萃取出短代碼中的各個屬性。
展開我們的返回功能 , 我們新增一個參數 $atts, 它是一個陣列,從中可以提取到我們需要的文章數。 我們查詢資料庫來取得指定數目的文章 , 並傳回一個列表 :
- function recent_posts_function($atts){
2 }: z* A6 Z! G% E - extract(shortcode_atts(array(
+ u, I3 j" x* [0 P - 'posts' => 1,
# K0 F+ w5 P J* L0 r V - ), $atts));
}+ l0 O5 W n" _" [ - v! [5 F* C" d) [
- $return_string = '<ul>';) C& l; x: w( A! L6 O9 J
- query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));6 T6 p$ B1 m' {
- if (have_posts()) :0 n' ^* h/ G! Z, N
- while (have_posts()) : the_post();
6 c3 b8 T: B1 K, c/ c& y - $return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
: r2 X! w( A5 Y3 W( _ - endwhile;! @: Q4 D* I- ?# [
- endif;- o2 t Z: c+ |6 `7 U) }5 y
- $return_string .= '</ul>';
0 i ~% P" T7 ~. {5 I& h - 0 Q- r; @' M% N+ E3 l* |
- wp_reset_query();
5 q0 N6 a& u* n% a- \& R - return $return_string;
+ _ s: h! O0 P - }
複製代碼 如果使用者未指定此選項 , 1 將是預設值。 我們可以加入多個屬性使短代碼接受更多的參數。 使用這項強化函數 , 我們就可以指定調用最新文章的數量 :當顯示於瀏覽器 , 您就可以看到最近的五篇文章列表 5 l6 `, |; r4 \# s" s) L3 N
2.2 短代碼中增加内容
我們可以繼續擴展我們的短代碼、新增一些內容作為參數 來傳遞, 例如"最新文章列表的標題"。 若要達成此目的 , 我們需要在返回函數中新增第二個參數$content , 並把它顯示在列表前面的一個 <h3> 標簽中。新的函數如下:
- function recent_posts_function($atts, $content = null) {
) F$ n1 |# |, j8 n% V$ h3 H, ? - extract(shortcode_atts(array(, M+ C/ K: }( N9 n" E
- 'posts' => 1,
. V" V7 C( T9 q/ [! i5 M3 F3 K. w - ), $atts)); O& C S( Z) w5 f" i" { r; {4 A
-
$ |" F8 q7 {3 x7 d& I - $return_string = '<h3>'.$content.'</h3>';
1 r- i% w3 A& s7 p9 A) Q8 [% m - $return_string .= '<ul>';) H7 O p* n" J5 H' f) S% ~
- query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));1 o* W: N; A# Z2 ^' _+ w' R7 ]
- if (have_posts()) :9 Q9 R8 H3 Z' E9 u s3 H: i& I% h8 Y
- while (have_posts()) : the_post(); @- [2 R1 p) w$ H
- $return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';1 p6 J: A& x2 m& @/ l5 u: a# F2 g% O
- endwhile;
, M) m6 E9 x0 w; @ - endif;
1 j& L- Y$ p, e% O% w* u# Q - $return_string .= '</ul>';' l, r& I I; A
- $ P. P& d% J( [: X1 a% g! {% w
- wp_reset_query();; B6 [) b/ I3 \' ]1 U( ]
- return $return_string;
' H7 j3 \" F, r' K4 \% x9 B/ G - }
複製代碼 這種短代碼類似於一個HTML標簽:- [recent-posts posts="5"]This is the list heading[/recent-posts]
複製代碼 除了文章列表多了一個標題,其餘的內容和上一個示例是一樣的:9 p% m" c6 T, m. F$ d. W
3. 在任何地方顯示短代碼
3.1 在側邊攔小工具中使用短代碼
預設情況下 , 側邊欄小工具是忽略短代碼的,您可以將此程式碼放在小工具
$ X9 t9 F5 j/ T6 ~5 s我們可以採用一行程式碼來啟用這個函數 , 為了使側邊欄小工具支援短代碼 , 新增以下的程式碼 :
- add_filter('widget_text', 'do_shortcode');
複製代碼 現在不需要修改任何其他地方 , 刷新頁面, 側邊欄將會正確地顯示
" Q& W2 m- U$ ^8 }3 u! n同樣的,在評論中啟用短代碼:
- add_filter( 'comment_text', 'do_shortcode' );
複製代碼 在摘要中啟用短代碼:- add_filter( 'the_excerpt', 'do_shortcode');
複製代碼 4. TinyMCE編輯器增加短代碼按鈕
& i: z9 I" w D: c# a5 e) d# a1 y
雖然短代碼可以方便的為文章增加動態內容,但是這對於普通用戶來說可能還是有點複雜,尤其是當參數比較多的時候。大多數用戶對於類HTML代碼並不熟悉,然而要使用短代碼,他們必須記住具體的語法與參數,因為即使是一個小小的語法錯誤,都可能導致意想不到的結果。要解決這個,我們可以給 TinyMCE編輯器增加一個按鈕,使用戶可以透過簡單的點擊來增加短代碼。建立這個按鈕僅需兩個步驟:
- 為此按鈕建立一個 JS 檔案
- 註冊按鈕與JS文件
. A8 q2 d% k5 {8 p
8 \9 W& D) Q% l* P
4.1 透過JS文件來建立按鈕JS文件是透過 TinyMCE API 來註冊 TinyMCE 插件的。我們在主題的 js 目錄下(/wp-content/themes/你主題名稱/js/)建立 recent-posts.js ,並貼進去下面的代碼(需要把按鈕圖片檔(/wp-content/themes/你主題名稱/js/recentpostsbutton.png)也放在同一個目錄):
- (function() {+ g; | y0 v ^
- tinymce.create('tinymce.plugins.recentposts', {
n) N8 t0 j y0 w - init : function(ed, url) {
) N% N& |) M# ~5 U6 k' t - ed.addButton('recentposts', {
7 _, }6 T I3 E- ~% H! J* c% k - title : 'Recent posts',! w8 L1 l6 ?% _' \% Z
- image : url+'/recentpostsbutton.png',
) Q* Z4 c4 k q! N - onclick : function() {
1 z. P4 [( W7 a) B2 K0 ]9 B - var posts = prompt("文章數量", "1");
5 l4 R' [9 Q) M4 ^3 y7 i - var text = prompt("請填入列表標題", "最新文章");3 K3 c1 s& c) P
- " ]; `) c* {+ _, ?: i
- if (text != null && text != ''){' p# `' g% R% y5 M& @* O) _& `
- if (posts != null && posts != '')- S+ h- A: w, u+ u
- ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]'+text+'[/recent-posts]');
( p; d# }$ [9 R% f" d1 n - else
7 O; }8 Z |: M9 y - ed.execCommand('mceInsertContent', false, '[recent-posts]'+text+'[/recent-posts]');
' x& c& c& l, F - }8 B5 O2 X7 }! w# K1 |
- else{9 P0 Q) G" X/ R( s. q
- if (posts != null && posts != '')
. k" B, N& T8 Q" ^! e - ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]');
4 k* W; L# i5 i; c2 ?* M - else
/ B j. R" ?+ j: I - ed.execCommand('mceInsertContent', false, '[recent-posts]');: Z% {4 \- C5 Y6 N3 G6 k
- }
$ Y% @1 A1 q' t* U - }0 r5 j" P( W7 ]6 I! |! {
- });
+ F/ @ w. D! |# K - },
/ T* m$ R& V; F+ f; T - createControl : function(n, cm) {' [7 \5 [( v3 a: C
- return null;
& D! w1 b: v7 {7 F3 t$ t9 Z! S - },+ m4 ]* V8 m, ?$ }* a
- getInfo : function() {
5 F/ M4 t! v. o5 Z+ p - return {* Q" o7 g8 [9 e
- longname : "Recent Posts",
/ T5 [# h3 }9 |- ^6 x$ @) r3 L! p - author : 'Specs',
# q9 j! ^9 X8 }! ? - authorurl : 'http://9iphp.com',0 C: A" X( ?6 X& M+ D& Q! y% j$ j5 n
- infourl : 'http://9iphp.com/opensystem/wordpress/1094.html',
. k; K$ H$ x, J: T' @$ j' Y - version : "1.0"
" ~% ~) |9 X) H+ e% D% ] - };
/ W V& O' S$ d5 H+ w \, }8 c: L - }* k5 Q! x1 Z* u/ p0 m
- });
) @1 u9 Y4 x( s5 ?3 ]% v - tinymce.PluginManager.add('recentposts', tinymce.plugins.recentposts);
2 I ^& h6 k, U2 X& V - })();
複製代碼 我們透過呼叫 tinymce.create() 建立了一個插件。代碼中最重要的是 init() 函數,我們定義了一個名字,一個icon文件及 onclick() 事件處理程序。在 onclick() 函數的前兩行,依序彈出兩個對話框讓用戶輸入文章數量及列表標題兩個參數,然後根據用戶輸入,把短代碼插入到編輯器中。
最後,TinyMCE插件透過 add() 函數增加到 PluginManager。現在我們已經成功的整合了 [recent-posts] 短代碼到Wordpress中。
' o/ _1 r7 a/ m N
4.2 註冊按鈕及TinyMCE插件! M& B! ^( e: T0 @
+ ]4 O% o* l) o0 c, h$ |
當您完成建立的JS 檔 , 我們現在需要註冊它和短代碼按鈕。 因此我們建立了兩個函數並把它們繫結至適當的 wordpress 過濾器中。
第一個叫做 register_button() 的函數把短代碼增加到按鈕陣列中,在現有按鈕和新按鈕之間增加分割線。
- function register_button( $buttons ) {: Z7 O+ g0 `1 C; I0 c% n' u
- array_push( $buttons, "|", "recentposts" );
6 c. N0 T @3 M* k: b* j - return $buttons;3 T5 V9 Y* g" q) z5 I" {0 q, \* H f
- }
複製代碼 第二個函數 add_plugin() 指定JS文件的路徑及文件名。
, L1 \6 p* e$ Y8 m' S, r- function add_plugin( $plugin_array ) {1 O" h6 I, ~3 Y+ [2 @# y
- $plugin_array['recentposts'] = get_template_directory_uri() . '/js/recent-posts.js';
/ ^/ l. T6 |$ n4 L- z* Z7 `' Y2 g - return $plugin_array;
, c! S& N( e1 k0 Q) ]* V4 x - }
複製代碼 下一步是增加包含前面兩個函數的過濾器。register_button() 函數連結到 mce_buttons 過濾器,這個會在編輯器載入插件的時候執行; add_plugin() 函數連結到 mce_external_plugins 過濾器,當載入按鈕的時候執行。
4 s* ^% M' q+ e3 }( S3 E0 K- function my_recent_posts_button() { h& r$ E: p) U3 n
- if ( ! current_user_can('edit_posts') && ! current_user_can('edit_pages') ) {
2 u( n' S2 N- f8 {3 q6 k# Z1 r( Y+ J - return;( R' A; s! d: [' O
- }
! @8 V& U6 o# F - ; i2 Q2 S, M) _/ r/ ]; N8 b
- if ( get_user_option('rich_editing') == 'true' ) {6 u. ]( o" H7 X
- add_filter( 'mce_external_plugins', 'add_plugin' );
! g, g% \' P) Q3 @) H3 S - add_filter( 'mce_buttons', 'register_button' );3 c3 X0 R) B. L* Q, ?* l
- } 8 D9 W1 O1 a2 @( e0 b9 z5 k1 `
- }
複製代碼 當用戶沒有對文章可視化編輯器中編輯的權限時,前面的函數不會執行。
( V5 N4 x$ f0 @- i1 c8 M最後把函數勾到Wordpress初始化函數- add_action('init', 'my_recent_posts_button');
複製代碼
2 u& f0 L. y1 x1 e% |4.3 按鈕的用法
' \# f# a' I& r
為了測試程式碼是否正確,我們打開一篇新的文章,這時一個我們剛剛定義的按鈕是不是已經出現在第一行的末尾了?如下圖所示:
) z( T; G: h+ O3 P
點擊按鈕的時候,會彈出對話框讓我們輸入文章的數量:
6 e7 W. z5 H0 b/ T
輸入完點擊確定後,會彈出第二個對話框,讓我們輸入列表的標題:
; M. G+ x" @4 ~9 [( P
參數留空的話,不會出現在最後的代碼中。最後,短代碼會新加到編輯器中:
! w! O* `' J" g, w% l
到此就大功告成了。想要增加其他功能的短代碼及按鈕可以參考上面的教學,如法炮製舉一反三,相信可以製作出符合各位需求的短代碼功能。
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/) |
Powered by Discuz! X3.2 |