Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
昨天我們提到透過擴充短代碼 (shortcode) 的方式,客製化出可以用查詢參數 _GET
來指定開啟選單項目的開闔式選單 (accordion) 區塊。今天,我們就要讓 Flatsome 內建的 UX Builder 也能夠轉譯出這個功能。
內容目錄
經過分析後,我們可以發現上層佈景主題將 UX Builder 的核心功能,存放於 inc/builder 下。而用於轉譯短代碼的檔案,則在 inc/builder/shortcodes 之下,我們在裡面可以找到 accordion.php 這個檔案:
add_ux_builder_shortcode( 'accordion', array( 'type' => 'container', 'name' => __( 'Accordion' ), 'image' => '', 'category' => __( 'Content' ), 'template' => flatsome_ux_builder_template( 'accordion.html' ), 'thumbnail' => flatsome_ux_builder_thumbnail( 'accordion' ), 'info' => '{{ title }}', 'allow' => array( 'accordion-item' ), 'presets' => array( array( 'name' => __( 'Default' ), 'content' => ' [accordion] [accordion-item title="Accordion Item 1 Title"][/accordion-item] [accordion-item title="Accordion Item 2 Title"][/accordion-item] [accordion-item title="Accordion Item 3 Title"][/accordion-item] [/accordion] ' ), ), 'options' => array( 'title' => array( 'type' => 'textfield', 'heading' => __( 'Title' ), 'default' => __( '' ), 'auto_focus' => true, ), 'auto_open' => array( 'type' => 'radio-buttons', 'heading' => __('Auto Open'), 'default' => '', 'options' => array( '' => array( 'title' => 'Off'), 'true' => array( 'title' => 'On'), ), ), 'class' => array( 'type' => 'textfield', 'heading' => 'Custom Class', 'full_width' => true, 'placeholder' => 'class-name', 'default' => '', ), ), ) );
從 accordion.php 這個檔案中,可以了解如何在 UX Builder 中註冊新的區塊。透過 add_ux_builder_shortcode
這個函式,我們可以將註冊過的短代碼置於 UX Builder 中,使它能夠在頁面中轉譯自訂的短代碼。這裡簡單介紹一下幾個引數:
名稱 | 說明 |
---|---|
type | 底下是否有子項目,有的話則填入 'type' => 'container' 。 |
name | 在 UX Builder 中顯示的名稱。 |
category | 類型,欲顯示在 UX Builder 的哪個區塊中。因為和 Accordion 是類似的類型,所以維持原本的 ‘content’。 |
template | 在 UX Builder 中要顯示的樣式範本。為 HTML 格式,後面會提到如何引用 HTML 檔案。 |
thumbnail | 選填,在 UX Builder 中要顯示的縮圖。後面會補充說明。 |
info | 要顯示在 UX Builder 中的補充資訊,預設是 {{ title }} ,用來擷取下方 options 中的 title 欄位值。 |
allow | 可新增於此元素的子區塊,因為我們要做的是開闔式選單,因此填寫 'accordion-item' 。 |
presets | 預設內容。在 'content' 將短代碼填入,這樣在新增區塊時,便會自動帶入預設的內容。 |
options | 其他選項,這部分基本上便按照原本的預設值,不需要額外調整。 |
在前一段中,我們提到 template
與 thumbnail
這兩個引數。因為這兩個引數使用了 flatsome_ux_builder_template
與 flatsome_ux_builder_thumbnail
這兩個方法,因此需要在子佈景主題的 functions.php 中稍加改寫:
/* * 將上層佈景主題的 flatsome_ux_builder_template 與 flatsome_ux_builder_thumbnail * 複製到 functions.php 中,並裡面的 get_template_directory() 改為 get_stylesheet_directory() * 才能讓子佈景主題使用。 */ function flatsome_child_ux_builder_template( $path ) { ob_start(); include get_stylesheet_directory() . '/inc/builder/shortcodes/templates/' . $path; return ob_get_clean(); } function flatsome_child_ux_builder_thumbnail( $name ) { return get_stylesheet_directory_uri() . '/inc/builder/shortcodes/thumbnails/' . $name . '.svg'; }
從上述的程式碼中,我們定義了將範本儲存於「子佈景主題」的 inc/builder/shortcodes/templates 中,而縮圖的 svg 檔則儲存於子佈景主題的 inc/builder/shortcodes/thumbnails 中。
我們先將上層佈景主題的 templates 的資料夾中,將 accordion.html 複製到子佈景主題的對應位置,改名為 custom-accordion.html。其內容如下:
<h3 class="accordion_title {{ shortcode.options.class }}">{{ shortcode.options.title }}</h3> <div class="accordion" ng-attr-rel="shortcode.options.open"> <content /> </div>
這裡是透過 AJAX 的方法,將 shortcode 的選項取出並轉譯到 UX Builder 中。因為我們沒有變更任何選項,因此這裡可以維持原樣。
在這次的實作中,我們可以直接將原本 accordion.php 的程式碼直接原封不動的複製到子佈景主題對應的資料夾中,並在 'name'
、'template'
與 'presets'
中稍做修改。
add_ux_builder_shortcode( 'custom_accordion', array( 'type' => 'container', 'name' => __( 'Custom Accordion' ), 'image' => '', 'category' => __( 'Content' ), 'template' => flatsome_child_ux_builder_template( 'custom-accordion.html' ), // 因為沒有縮圖,所以縮圖就先註解掉。 // 'thumbnail' => flatsome_child_ux_builder_template( 'accordion' ), 'info' => '{{ title }}', 'allow' => array( 'accordion-item' ), 'presets' => array( array( 'name' => __( 'Default' ), 'content' => ' [custom_accordion] [accordion-item title="Accordion Item 1 Title"][/accordion-item] [accordion-item title="Accordion Item 2 Title"][/accordion-item] [accordion-item title="Accordion Item 3 Title"][/accordion-item] [/custom_accordion] ' ), ), // 'options' 以下無更動,因此省略。 // 以上是 'options'。 ) );
我們在上一篇跟這一篇的實作中,總共建立了以下幾個檔案:
接著,我們要將這些功能正式套用在子佈景主題中:
require get_stylesheet_directory() . '/inc/shortcodes/custom-accordion.php'; /* 因為要在 UX Builder 啟用後才需要載入轉譯用短代碼, * 因此透過 ux_builder_setup 這個勾點來觸發。 */ add_action( 'ux_builder_setup', function(){ require_once get_stylesheet_directory() . '/inc/builder/shortcodes/custom-accordion.php'; }
今天示範如何將昨天開闔式選單的短代碼,註冊為 UX Builder 的客製化區塊。只要熟悉 add_ux_builder_shortcode
這個函式,便可以大幅提升對 Flatsome 子佈景主題客製化的掌控度。
透過開闔式選單這個相對簡單的例子了解 add_ux_builder_shortcode
的運作方式後,我們可以再進一步處理昨天提到的第二個問題:Flatsome 內建的 Blog Posts 元素無法使用自訂內容製作投影片輪播 (slider)。