如何讓WordPress編輯器支持內聯SVG代碼

来源:http://www.cnblogs.com/manongjc/archive/2016/04/02/5348207.html
-Advertisement-
Play Games

WordPress編輯器對SVG的支持一向是非常的不友好,首先它不能上傳SVG文件,也不能自動的嵌入到內容中讓它正常顯示。同時,對內聯SVG代碼根本不識別,會無情的將SVG代碼自動刪除。 在上一篇文章中我介紹瞭如何讓Wordpress支持上傳SVG圖片的方法,似乎是部分的解決了這個問題。最近在開發過 ...


WordPress編輯器對SVG的支持一向是非常的不友好,首先它不能上傳SVG文件,也不能自動的嵌入到內容中讓它正常顯示。同時,對內聯SVG代碼根本不識別,會無情的將SVG代碼自動刪除。

在上一篇文章中我介紹瞭如何讓Wordpress支持上傳SVG圖片的方法,似乎是部分的解決了這個問題。最近在開發過程中遇到了大量的需要在Wordpress可視化編輯器里使用內聯SVG(inline SVG)代碼的情況。

相信你也知道,Wordpress使用的是TinyMCE編輯器,而TinyMCE編輯器僅對標準的HTML5標記進行支持,SVG代碼一律不識別,當我在Wordpress的編輯器了“可視化”和“文本”兩個標簽間切換時,所有的SVG代碼都被乾凈的刪除。

網上有很多關於如何讓Wordpress的TinyMCE支持SVG的討論,在TinyMCE官方網站也找到了配置TinyMCE擴展標記的文檔。主要是三個配置點:extended_valid_elementscustom_elementsvalid_children。下麵是網上拷貝的一段網友提供的配置Wordpress編輯器的代碼:

add_filter('tiny_mce_before_init', 'vsl2014_filter_tiny_mce_before_init');
function vsl2014_filter_tiny_mce_before_init( $options ) {

    if ( ! isset( $options['extended_valid_elements'] ) ) {
        $options['extended_valid_elements'] = 'svg';
    } else {
        $options['extended_valid_elements'] .= ',svg';
    }

    if ( ! isset( $options['valid_children'] ) ) {
        $options['valid_children'] = '+body[svg]';
    } else {
        $options['valid_children'] .= ',+body[svg]';
    }

    if ( ! isset( $options['custom_elements'] ) ) {
        $options['custom_elements'] = 'svg';
    } else {
        $options['custom_elements'] .= ',svg';
    }

    return $options;
}

還有網友認為下麵這樣就可以了:

function override_mce_options($initArray) {
    $opts = '*[*]';
    $initArray['valid_elements'] = $opts;
    $initArray['extended_valid_elements'] = $opts;
    return $initArray;
}
add_filter('tiny_mce_before_init', 'override_mce_options');

還有網友給出了下麵的建議:

  1. TinyMCE刪除SVG代碼的原因是認為<svg>是空標記,所以,應該在<svg>代碼里放入一點東西,比如 &nbsp;,或一句“抱歉,你的瀏覽器不支持SVG”(在支持SVG的瀏覽器里這句話是不顯示的。)
  2. 應該給SVG標簽上添加一個id屬性。
  3. 將SVG代碼放入<pre>內

上面的這些建議單獨使用似乎都不成功,但每種建議都似乎能解決一部分問題。經過反覆的實驗,我最終找到了下麵的方法,能成功的讓SVG在Wordpress的TinyMCE編輯器里不被刪除,而且保存良好的格式。

首先在function.php裡加入下麵的PHP代碼:

/**
 * Add to extended_valid_elements for TinyMCE
 *
 * @param $init assoc. array of TinyMCE options
 * @return $init the changed assoc. array
 */
function my_change_mce_options( $init ) {

    $ext = 'a[*],altglyph[*],altglyphdef[*],altglyphitem[*],animate[*],animatecolor[*],animatemotion[*],animatetransform[*],circle[*],clippath[*],color-profile[*],cursor[*],defs[*],desc[*],ellipse[*],feblend[*],fecolormatrix[*],fecomponenttransfer[*],fecomposite[*],feconvolvematrix[*],fediffuselighting[*],fedisplacementmap[*],fedistantlight[*],feflood[*],fefunca[*],fefuncb[*],fefuncg[*],fefuncr[*],fegaussianblur[*],feimage[*],femerge[*],femergenode[*],femorphology[*],feoffset[*],fepointlight[*],fespecularlighting[*],fespotlight[*],fetile[*],feturbulence[*],filter[*],font[*],font-face[*],font-face-format[*],font-face-name[*],font-face-src[*],font-face-uri[*],foreignobject[*],g[*],glyph[*],glyphref[*],hkern[*],line[*],marker[*],mask[*],metadata[*],missing-glyph[*],mpath[*],path[*],pattern[*],polygon[*],polyline[*],radialgradient[*],rect[*],script[*],set[*],stop[*],lineargradient[*],style[*],svg[*],switch[*],symbol[*],text[*],textpath[*],title[*],tref[*],tspan[*],use[*],view[*],vkern[*]';

    // Add to extended_valid_elements if it alreay exists
    
    if ( isset( $init['extended_valid_elements'] ) ) {
        $init['extended_valid_elements'] .= ',' . $ext;
    } else {
        $init['extended_valid_elements'] = $ext;
    }

    // Super important: return $init!
    return $init;
}

add_filter('tiny_mce_before_init', 'my_change_mce_options');

在上面的Wordpress過濾器里,我將所有的SVG標記元素都添加了上去(至於用通配符’*[*]’的方法,我沒有實驗過,有興趣的朋友可以試試,歡迎給出反饋。)

細心的朋友可能觀察到,上面的SVG標記名稱全都改成了小寫。而很顯然SVG官方規範里規定SVG標記名稱的大小寫是有意義的。但我實驗過,使用駝峰式的SVG標記名稱是不行的。可能是HTML代碼並不在意大小寫的原因。

第二,在Wordpress的TinyMCE編輯器里,將所有的SVG代碼都用<pre></pre>包裹起來,這樣,TinyMCE編輯器就能保持SVG代碼的原有縮進格式。

第三,在<svg></svg>代碼里放入一點東西,比如 &nbsp;,或一句“抱歉,你的瀏覽器不支持SVG”:

<svg>

    <rect> ... </rect>

    抱歉,你的瀏覽器不支持SVG
</svg>

實施了上面的方法後,我現在使用Wordpress的TinyMCE編輯器,在嵌入SVG代碼後,就像跟寫入普通html代碼一樣,不會被刪除和情況。我並沒有深入的研究TinyMCE編輯器對SVG代碼的處理機制,上面的這些方法也只是治標不治本。也許隨著Wordpress的升級或TinyMCE升級,這些方法會失效。

如果你有更巧的方法,請在評論里分享,謝謝!

原文地址:http://www.manongjc.com/article/657.html

相關閱讀:

讓Wordpress支持上傳SVG圖片

WordPress中wp_title()函數的使用方法詳解

SVG里的幾個動畫元素的用法介紹


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 算術運算符+ - * / % ++ -- 舉例:1. while (true) { Console.Write("請輸入整數a:"); int a = int.Parse(Console.ReadLine()); Console.Write("請輸入整數b:"); int b = int.Parse ...
  • html代碼: hub代碼: 通知調用Notify方法即可。 關鍵點:GlobalHost.ConnectionManager.GetHubContext ...
  • 實現了那些功能,先看看效果圖: 項目工程目錄: 接下來開始具體的步驟: 第一步:在VS中新建工程 第二步:使用NuGet 安裝EntityFramework 第三步:使用NuGet 安裝EntityFramework.SqlSreverCompact 第四步:在Entities文件夾下添加Stude ...
  • 一、WCF概述 1) 什麼是WCF? Windows Communication Foundation (WCF) 是用於構建面向服務的應用程式的框架。藉助 WCF,可以將數據作為非同步消息從一個服務終結點發送至另一個服務終結點。服務終結點可以是由 IIS 承載的持續可用的服務的一部分,也可以是應用程 ...
  • 先看圖,這是幾個月前用NPOI寫的導出數據到Excel,用了上百行代碼,而且難控制,導出來也比較難看 excel打開的效果 下麵是我用ExcelReport類庫導出到Excel的操作 1.首先引用ExcelReport類庫,使用NuGet即可 2.現在就可以寫導出的代碼,ExcelReport已經提 ...
  • C#數據進行顯示轉換時有可能會出現溢出的情況這時可以用關鍵字checked進行檢查是否溢出: checked(<expression>) 檢查溢出 unchecked(<expression>) 不檢查溢出 如果使用checked檢查溢出,一旦溢出就會拋出System.OverflowExcepti ...
  • 開始設置視窗的具體的位置的時候,我就只能通過在windows的屬性設置的StartPosition直接隨便設置為CenterScreen,這樣也挺方便的,直接居中顯示咯。 可是後面出現了另一個問題,就是我其他的窗體,我想指定他在某個具體的位置出現,查了好久才知道StartPosition的Manua ...
  • "Microsoft Build 2016 Day 1 記錄" Microsoft Build 2016 進行到了第二天,我覺得這一天的內容非常精彩,因為主要和開發者相關
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...