在 WordPress 3.5 以前,WordPress 上傳圖片彈出框如圖所示,而本工作室釋出的設定選項類檔案、新增自定義面板類檔案中的圖片上傳也是使用的老版本的圖片上傳工能。

到了 WordPress 3.5 以上版本,出現了新的媒體中心,新的媒體庫介面還支援圖片多選,介面如圖:

那麼怎樣呼叫新的媒體中心呢?
下面做一個示例:
第一步:在後臺新建一個設定頁面
首先在後臺新建一個設定頁面,用來上傳 Logo,在 functions.php 檔案中新增以下程式碼,其中 add_theme_page 函式將會在後臺的 「外觀」 選單項裡面再增加一個子選單項,新新增的設定頁面將會呼叫 ashuwp_display_function 這個函式來輸出內容。
- function ashuwp_function(){
- add_theme_page( '主題設定', '主題設定', 'edit_themes', 'ashu_slug','ashuwp_display_function');
- }
- add_action('admin_menu', 'ashuwp_function');
第二部,在頁面輸出內容
上面新增設定頁面的函式中,要呼叫 ashuwp_display_function 這個函式來顯示內容,那麼接下來就新增 ashuwp_display_function 函式,來輸出上傳 logo 的輸入框和按鈕。
- function ashuwp_display_function(){
- echo '<h1>Logo 設定</h1>';
- echo '<form method="post">';
- echo '<input type="text" size="60" value="'.get_option('ashu_upload').'" name="ashu_upload" class="ashuwp_url_input" id="ashu_upload_input"/><a id="ashu_upload" class="ashu_upload_button button" href="#"> 上傳</a>';
- echo '<p><input type="hidden" value="1" name="save_ashuwp_options"/>';
- echo '<input type="submit" name="Submit" class="button-primary autowidth" value="儲存設定" /></p>';
- echo '</form>';
- }
上面的程式碼輸出了一個標題,一個簡單的表單,表單中包含:一個文字輸入框,一個上傳按鈕,一個隱藏的驗證域,一個提交按鈕,其中 input 文字輸入框的 value 為 get_option('ashu_upload'),請注意 input 的 id 、 name,以及按鈕的 id, 要說明的是,雖然上面的按鈕只是輸出了一個<a> 標籤,但是其中的類名為 button,在 wp 的後臺就會顯示為按鈕樣式。此時新增的主題設定頁面應該如圖:

有了顯示,還得能儲存,所以將 ashuwp_display_function 函式中新增處理資料並儲存的程式碼, 更改後的函式如下:
- function ashuwp_display_function(){
- /****處理資料********/
- if ( isset( $_POST['save_ashuwp_options'] ) ) { //save_ashuwp_options 是先前輸出的隱藏域
- $new_option = $old_option = get_option('ashu_upload'); //獲取老資料, 新資料的值暫時和老資料一樣
- $new_option = $_POST['ashu_upload']; //獲取提交的資料,新資料重新賦值
- if ( $old_option != $new_option ) { //如果新老資料不一樣,就說明更改了
- update_option( 'ashu_upload', $new_option ); //更新上資料
- }
- }
- /******處理資料*****/
- echo '<h1>Logo 設定</h1>';
- echo '<form method="post">';
- echo '<input type="text" size="60" value="'.get_option('ashu_upload').'" name="ashu_upload" class="ashuwp_url_input" id="ashu_upload_input"/><a id="ashu_upload" class="ashu_upload_button button" href="#"> 上傳</a>';
- echo '<p><input type="hidden" value="1" name="save_ashuwp_options"/>';
- echo '<input type="submit" name="Submit" class="button-primary autowidth" value="儲存設定" /></p>';
- echo '</form>';
- }
此時,如果再後臺手動輸入資料,是已經可以儲存、更改設定資料的。
第三步:新增 js
首先需要呼叫 wp_enqueue_media() 載入媒體庫的程式碼,不過如果你是在文章頁面,預設已經載入了這些程式碼,可以不用再呼叫。
其次,為了程式碼的完整性,本次的 js 程式碼也不單獨放一個 js 檔案了。以下是新增了 js 程式碼之後的 ashuwp_display_function 函式,,由於這是 php 程式碼,所以請注意 php 的<?php 和?> 標籤。
- function ashuwp_display_function(){
- /****處理資料********/
- if ( isset( $_POST['save_ashuwp_options'] ) ) { //save_ashuwp_options 是先前輸出的隱藏域
- $new_option = $old_option = get_option('ashu_upload'); //獲取老資料, 新資料的值暫時和老資料一樣
- $new_option = $_POST['ashu_upload']; //獲取提交的資料,新資料重新賦值
- if ( $old_option != $new_option ) { //如果新老資料不一樣,就說明更改了
- update_option( 'ashu_upload', $new_option ); //更新上資料
- }
- }
- /******處理資料*****/
- echo '<h1>Logo 設定</h1>';
- echo '<form method="post">';
- echo '<input type="text" size="60" value="'.get_option('ashu_upload').'" name="ashu_upload" class="ashuwp_url_input" id="ashu_upload_input"/><a id="ashu_upload" class="ashu_upload_button button" href="#"> 上傳</a>';
- echo '<p><input type="hidden" value="1" name="save_ashuwp_options"/>';
- echo '<input type="submit" name="Submit" class="button-primary autowidth" value="儲存設定" /></p>';
- echo '</form>';
- /******以下是新增的 js****/
- wp_enqueue_media(); //在設定頁面需要載入媒體中心
- ?>
- <script>
- jQuery(document).ready(function(){
- var ashu_upload_frame;
- var value_id;
- jQuery('.ashu_upload_button').live('click',function(event){
- value_id =jQuery( this ).attr('id');
- event.preventDefault();
- if( ashu_upload_frame ){
- ashu_upload_frame.open();
- return;
- }
- ashu_upload_frame = wp.media({
- title: 'Insert image',
- button: {
- text: 'Insert',
- },
- multiple: false
- });
- ashu_upload_frame.on('select',function(){
- attachment = ashu_upload_frame.state().get('selection').first().toJSON();
- jQuery('input[name='+value_id+']').val(attachment.url);
- });
- ashu_upload_frame.open();
- });
- });
- </script>
- <?php
- /*****js******/
- }
至此,呼叫新版媒體庫程式碼已經完成。
以下是本次的完整程式碼,懶人專用,你只需要複製下面的程式碼放到主題的 functions.php 檔案的最後一個?> 之前即可。本次程式碼在 wp 3.8.1 版本的 Twenty Fourteen 主題下測試。
- function ashuwp_function(){
- add_theme_page( '主題設定', '主題設定', 'administrator', 'ashu_slug','ashuwp_display_function');
- }
- add_action('admin_menu', 'ashuwp_function');
- function ashuwp_display_function(){
- /****處理資料********/
- if ( isset( $_POST['save_ashuwp_options'] ) ) { //save_ashuwp_options 是先前輸出的隱藏域
- $new_option = $old_option = get_option('ashu_upload'); //獲取老資料, 新資料的值暫時和老資料一樣
- $new_option = $_POST['ashu_upload']; //獲取提交的資料,新資料重新賦值
- if ( $old_option != $new_option ) { //如果新老資料不一樣,就說明更改了
- update_option( 'ashu_upload', $new_option ); //更新上資料
- }
- }
- /******處理資料*****/
- echo '<h1>Logo 設定</h1>';
- echo '<form method="post">';
- echo '<input type="text" size="60" value="'.get_option('ashu_upload').'" name="ashu_upload" class="ashuwp_url_input" id="ashu_upload_input"/><a id="ashu_upload" class="ashu_upload_button button" href="#"> 上傳</a>';
- echo '<p><input type="hidden" value="1" name="save_ashuwp_options"/>';
- echo '<input type="submit" name="Submit" class="button-primary autowidth" value="儲存設定" /></p>';
- echo '</form>';
- /******以下是新增的 js****/
- wp_enqueue_media(); //在設定頁面需要載入媒體中心
- ?>
- <script>
- jQuery(document).ready(function(){
- var ashu_upload_frame;
- var value_id;
- jQuery('.ashu_upload_button').live('click',function(event){
- value_id =jQuery( this ).attr('id');
- event.preventDefault();
- if( ashu_upload_frame ){
- ashu_upload_frame.open();
- return;
- }
- ashu_upload_frame = wp.media({
- title: 'Insert image',
- button: {
- text: 'Insert',
- },
- multiple: false
- });
- ashu_upload_frame.on('select',function(){
- attachment = ashu_upload_frame.state().get('selection').first().toJSON();
- //jQuery('#'+value_id+'_input').val(attachment.url).trigger('change');
- jQuery('input[name='+value_id+']').val(attachment.url).trigger('change');
- });
- ashu_upload_frame.open();
- });
- });
- </script>
- <?php
- /*****js******/
- }