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
  1. [recent-posts]
複製代碼
此外 , 我們可以設定一個參數來控制文章的數量 :

7 r( ]9 B2 v% h  x( n7 |2 V0 ]+ S
  1. [recent-posts posts="5"]
複製代碼
此外 , 我們也可以為文章列表新增一個標題 :
) u# }9 P  g; }/ ?5 F' ]/ g) S
  1. [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
  1. [recent-posts]
複製代碼
該程序的建立是非常簡單並且不需要非常進階 PHP 知識。 建立過程如下 :
) @# }% Z0 ^: M* u) v
/ U. k! K4 |2 F6 L& q( B
本教學所有程式碼將會直接放到function.php(控制台==>外觀==>主題編輯器==>function.php) ,也可以放在一個被包含在function.php的單獨的php檔案中。
4 t  g2 x; c  e+ z
1.1 建立返回函數
3 @2 x  Y  L# c: g: ~當發現短代碼的時候,它會被一個稱作返回函數的一段代碼所代替,所以我們先建立一個函數,從資料庫中獲取最新的文章。
9 ^8 G8 A4 F3 u; p8 k
  1. function recent_posts_function() {9 M, g7 e+ @9 {
  2.         query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => 1));$ x, }5 L4 i( y  r+ {5 B
  3.         if (have_posts()) :
    " z& s# e! U$ X7 ?; Z- l8 T
  4.                 while (have_posts()) : the_post();. J6 J7 `6 A4 W: f
  5.                         $return_string = '<a href="'.get_permalink().'">'.get_the_title().'</a>';# B7 o" \' |7 a  n. p1 a
  6.                 endwhile;
    $ w. |& F% b8 A% A4 b
  7.         endif;. p8 l7 m' \8 v# p5 ?8 z  Q) A0 T" `
  8.         wp_reset_query();
    5 l) ?' @, `- N+ e  a8 f
  9.         return $return_string;1 |8 O; K2 I* v
  10. }
複製代碼
如上所示,我們查詢資料庫,獲取最新的文章,並返回一個帶有鏈接的字串。值得註意的是,返回函數並不印任何內容,而是返回一個字串。

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這個函數是一個短代碼:
  1. function register_shortcodes(){" h( r! T+ o/ `! N- {- t) M7 e
  2.         add_shortcode('recent-posts', 'recent_posts_function');3 D8 R8 ]) E, J6 O
  3. }
複製代碼
當在文章的內容中使用短代碼" N% W# K/ F4 t! `9 H
  1. [recent-posts]
複製代碼
將會自動呼叫 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
  1. add_action( 'init', 'register_shortcodes');
複製代碼
3 _5 o- y# m- _3 k1 ^
1.4 測試短代碼

0 D  }9 Z& P8 e. I4 @' \簡單的短代碼已設定 , 我們現在需要測試是否能正常執行。 我們可以建立新文章 ( 或開啟現有 ) , 將下列代碼加到文章內容的某個位置 :
  1. [recent-posts]
複製代碼
2. 進階短代碼
2.1 短代碼参數
短代碼是非常有彈性 , 因為它讓我們加入參數可讓它們有更多的功能。 假設我們必須要顯示某一特定數量的最新的文章。 為了達到這個目的 , 我們需要給短代碼指定其他選項以顯示最近的文章數。
我們需要使用兩個函數 ,第一個是內建在 wordpress 的shortcode _ atts ( ) 函式 , 它把用戶的短代碼屬性與本地屬性結合在一起 , 並填入到想要的位置。 第二個是 PHP的extract() 函数 , 顧名思義 , 它萃取出短代碼中的各個屬性。
展開我們的返回功能 , 我們新增一個參數 $atts, 它是一個陣列,從中可以提取到我們需要的文章數。 我們查詢資料庫來取得指定數目的文章 , 並傳回一個列表 :
  1. function recent_posts_function($atts){
    2 }: z* A6 Z! G% E
  2.         extract(shortcode_atts(array(
    + u, I3 j" x* [0 P
  3.                 'posts' => 1,
    # K0 F+ w5 P  J* L0 r  V
  4.         ), $atts));
      }+ l0 O5 W  n" _" [
  5.   v! [5 F* C" d) [
  6.         $return_string = '<ul>';) C& l; x: w( A! L6 O9 J
  7.         query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));6 T6 p$ B1 m' {
  8.         if (have_posts()) :0 n' ^* h/ G! Z, N
  9.                 while (have_posts()) : the_post();
    6 c3 b8 T: B1 K, c/ c& y
  10.                         $return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
    : r2 X! w( A5 Y3 W( _
  11.                 endwhile;! @: Q4 D* I- ?# [
  12.         endif;- o2 t  Z: c+ |6 `7 U) }5 y
  13.         $return_string .= '</ul>';
    0 i  ~% P" T7 ~. {5 I& h
  14. 0 Q- r; @' M% N+ E3 l* |
  15.         wp_reset_query();
    5 q0 N6 a& u* n% a- \& R
  16.         return $return_string;
    + _  s: h! O0 P
  17. }
複製代碼
如果使用者未指定此選項 , 1 將是預設值。 我們可以加入多個屬性使短代碼接受更多的參數。 使用這項強化函數 , 我們就可以指定調用最新文章的數量 :
  1. [recent-posts posts="5"]
複製代碼
當顯示於瀏覽器 , 您就可以看到最近的五篇文章列表
5 l6 `, |; r4 \# s" s) L3 N
2.2 短代碼中增加内容
我們可以繼續擴展我們的短代碼、新增一些內容作為參數 來傳遞, 例如"最新文章列表的標題"。 若要達成此目的 , 我們需要在返回函數中新增第二個參數$content , 並把它顯示在列表前面的一個 <h3> 標簽中。新的函數如下:
  1. function recent_posts_function($atts, $content = null) {
    ) F$ n1 |# |, j8 n% V$ h3 H, ?
  2.         extract(shortcode_atts(array(, M+ C/ K: }( N9 n" E
  3.                 'posts' => 1,
    . V" V7 C( T9 q/ [! i5 M3 F3 K. w
  4.         ), $atts));  O& C  S( Z) w5 f" i" {  r; {4 A

  5. $ |" F8 q7 {3 x7 d& I
  6.         $return_string = '<h3>'.$content.'</h3>';
    1 r- i% w3 A& s7 p9 A) Q8 [% m
  7.         $return_string .= '<ul>';) H7 O  p* n" J5 H' f) S% ~
  8.         query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));1 o* W: N; A# Z2 ^' _+ w' R7 ]
  9.         if (have_posts()) :9 Q9 R8 H3 Z' E9 u  s3 H: i& I% h8 Y
  10.                 while (have_posts()) : the_post();  @- [2 R1 p) w$ H
  11.                         $return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';1 p6 J: A& x2 m& @/ l5 u: a# F2 g% O
  12.                 endwhile;
    , M) m6 E9 x0 w; @
  13.         endif;
    1 j& L- Y$ p, e% O% w* u# Q
  14.         $return_string .= '</ul>';' l, r& I  I; A
  15. $ P. P& d% J( [: X1 a% g! {% w
  16.         wp_reset_query();; B6 [) b/ I3 \' ]1 U( ]
  17.         return $return_string;
    ' H7 j3 \" F, r' K4 \% x9 B/ G
  18. }
複製代碼
這種短代碼類似於一個HTML標簽:
  1. [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
我們可以採用一行程式碼來啟用這個函數 , 為了使側邊欄小工具支援短代碼 , 新增以下的程式碼 :
  1. add_filter('widget_text', 'do_shortcode');
複製代碼
現在不需要修改任何其他地方
, 刷新頁面, 側邊欄將會正確地顯示

" Q& W2 m- U$ ^8 }3 u! n
同樣的,在評論中啟用短代碼:
  1. add_filter( 'comment_text', 'do_shortcode' );
複製代碼
在摘要中啟用短代碼:
  1. add_filter( 'the_excerpt', 'do_shortcode');
複製代碼
4. TinyMCE編輯器增加短代碼按鈕
& i: z9 I" w  D: c# a5 e) d# a1 y
雖然短代碼可以方便的為文章增加動態內容,但是這對於普通用戶來說可能還是有點複雜,尤其是當參數比較多的時候。大多數用戶對於類HTML代碼並不熟悉,然而要使用短代碼,他們必須記住具體的語法與參數,因為即使是一個小小的語法錯誤,都可能導致意想不到的結果。
要解決這個,我們可以給 TinyMCE編輯器增加一個按鈕,使用戶可以透過簡單的點擊來增加短代碼。建立這個按鈕僅需兩個步驟:
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)也放在同一個目錄):
  1. (function() {+ g; |  y0 v  ^
  2.         tinymce.create('tinymce.plugins.recentposts', {
      n) N8 t0 j  y0 w
  3.                 init : function(ed, url) {
    ) N% N& |) M# ~5 U6 k' t
  4.                         ed.addButton('recentposts', {
    7 _, }6 T  I3 E- ~% H! J* c% k
  5.                                 title : 'Recent posts',! w8 L1 l6 ?% _' \% Z
  6.                                 image : url+'/recentpostsbutton.png',
    ) Q* Z4 c4 k  q! N
  7.                                 onclick : function() {
    1 z. P4 [( W7 a) B2 K0 ]9 B
  8.                                         var posts = prompt("文章數量", "1");
    5 l4 R' [9 Q) M4 ^3 y7 i
  9.                                         var text = prompt("請填入列表標題", "最新文章");3 K3 c1 s& c) P
  10. " ]; `) c* {+ _, ?: i
  11.                                         if (text != null && text != ''){' p# `' g% R% y5 M& @* O) _& `
  12.                                                 if (posts != null && posts != '')- S+ h- A: w, u+ u
  13.                                                 ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]'+text+'[/recent-posts]');
    ( p; d# }$ [9 R% f" d1 n
  14.                                         else
    7 O; }8 Z  |: M9 y
  15.                                                 ed.execCommand('mceInsertContent', false, '[recent-posts]'+text+'[/recent-posts]');
    ' x& c& c& l, F
  16.                                         }8 B5 O2 X7 }! w# K1 |
  17.                                         else{9 P0 Q) G" X/ R( s. q
  18.                                                 if (posts != null && posts != '')
    . k" B, N& T8 Q" ^! e
  19.                                                         ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]');
    4 k* W; L# i5 i; c2 ?* M
  20.                                                 else
    / B  j. R" ?+ j: I
  21.                                                         ed.execCommand('mceInsertContent', false, '[recent-posts]');: Z% {4 \- C5 Y6 N3 G6 k
  22.                                         }
    $ Y% @1 A1 q' t* U
  23.                                 }0 r5 j" P( W7 ]6 I! |! {
  24.                         });
    + F/ @  w. D! |# K
  25.                 },
    / T* m$ R& V; F+ f; T
  26.                 createControl : function(n, cm) {' [7 \5 [( v3 a: C
  27.                         return null;
    & D! w1 b: v7 {7 F3 t$ t9 Z! S
  28.                 },+ m4 ]* V8 m, ?$ }* a
  29.                 getInfo : function() {
    5 F/ M4 t! v. o5 Z+ p
  30.                         return {* Q" o7 g8 [9 e
  31.                                 longname : "Recent Posts",
    / T5 [# h3 }9 |- ^6 x$ @) r3 L! p
  32.                                 author : 'Specs',
    # q9 j! ^9 X8 }! ?
  33.                                 authorurl : 'http://9iphp.com',0 C: A" X( ?6 X& M+ D& Q! y% j$ j5 n
  34.                                 infourl : 'http://9iphp.com/opensystem/wordpress/1094.html',
    . k; K$ H$ x, J: T' @$ j' Y
  35.                                 version : "1.0"
    " ~% ~) |9 X) H+ e% D% ]
  36.                         };
    / W  V& O' S$ d5 H+ w  \, }8 c: L
  37.                 }* k5 Q! x1 Z* u/ p0 m
  38.         });
    ) @1 u9 Y4 x( s5 ?3 ]% v
  39.         tinymce.PluginManager.add('recentposts', tinymce.plugins.recentposts);
    2 I  ^& h6 k, U2 X& V
  40. })();
複製代碼
我們透過呼叫 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() 的函數把短代碼增加到按鈕陣列中,在現有按鈕和新按鈕之間增加分割線。
  1. function register_button( $buttons ) {: Z7 O+ g0 `1 C; I0 c% n' u
  2.         array_push( $buttons, "|", "recentposts" );
    6 c. N0 T  @3 M* k: b* j
  3.         return $buttons;3 T5 V9 Y* g" q) z5 I" {0 q, \* H  f
  4. }
複製代碼
第二個函數 add_plugin() 指定JS文件的路徑及文件名。
, L1 \6 p* e$ Y8 m' S, r
  1. function add_plugin( $plugin_array ) {1 O" h6 I, ~3 Y+ [2 @# y
  2.         $plugin_array['recentposts'] = get_template_directory_uri() . '/js/recent-posts.js';
    / ^/ l. T6 |$ n4 L- z* Z7 `' Y2 g
  3.         return $plugin_array;
    , c! S& N( e1 k0 Q) ]* V4 x
  4. }
複製代碼
下一步是增加包含前面兩個函數的過濾器。register_button() 函數連結到 mce_buttons 過濾器,這個會在編輯器載入插件的時候執行; add_plugin() 函數連結到 mce_external_plugins 過濾器,當載入按鈕的時候執行。
4 s* ^% M' q+ e3 }( S3 E0 K
  1. function my_recent_posts_button() {   h& r$ E: p) U3 n
  2.         if ( ! current_user_can('edit_posts') && ! current_user_can('edit_pages') ) {
    2 u( n' S2 N- f8 {3 q6 k# Z1 r( Y+ J
  3.                 return;( R' A; s! d: [' O
  4.         }
    ! @8 V& U6 o# F
  5. ; i2 Q2 S, M) _/ r/ ]; N8 b
  6.         if ( get_user_option('rich_editing') == 'true' ) {6 u. ]( o" H7 X
  7.                 add_filter( 'mce_external_plugins', 'add_plugin' );
    ! g, g% \' P) Q3 @) H3 S
  8.                 add_filter( 'mce_buttons', 'register_button' );3 c3 X0 R) B. L* Q, ?* l
  9.         } 8 D9 W1 O1 a2 @( e0 b9 z5 k1 `
  10. }
複製代碼
當用戶沒有對文章可視化編輯器中編輯的權限時,前面的函數不會執行。
( V5 N4 x$ f0 @- i1 c8 M最後把函數勾到Wordpress初始化函數
  1. 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
到此就大功告成了。想要增加其他功能的短代碼及按鈕可以參考上面的教學,如法炮製舉一反三,相信可以製作出符合各位需求的短代碼功能
參考文章: 1 2





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/) Powered by Discuz! X3.2