Wordpress Visual EditorがHTMLの変更を取り除く


8

WordPress HTMLエディターを使用して、次のようなicomoonアイコンを追加すると、

<span class="icon-shield"></span>

ビジュアルエディターに切り替えてから、HTMLエディターに戻ると、アイコンが消えます。これを修正するためにこのJavaScriptのビットを含めようとしています。私はwp_enqueue_scriptsを見て、これをfunctions.phpに入れましたが、それでも問題は解決しません。

function oakwood_tinymcefix() {
    wp_enqueue_script( 'tiny_mce' );
    echo '<script type="text/javascript">'
   , 'tinymce.init({
            ...
            extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]"
        });'
   , '</script>';
}
add_action( 'admin_enqueue_scripts', 'oakwood_tinymcefix' );

どうすれば修正できますか?


まず、省略記号...は有効なJavascriptではなく、コンテンツの省略を示すためによく使用されます。この例では、省略記号が存在する独自のTinyMCE構成を提供することを目的としたドキュメントの作成者がいると思います。さらに、TinyMCEのimgルールを置き換えることを明示的に示すドキュメントのデフォルト値を使用しました-これはspan問題に対して何もしません。表示する研究努力が多ければ多いほど、有効な回答が得られる可能性が高くなります。TinyMCEのドキュメントでもう少し時間をかけてください。
bosco 14年

特に、オプションのドキュメントvalid_elementsオプションに渡す必要があるものを理解するのに役立ちextended_valid_elementsます。私はドキュメントを読んでいませんが、おそらくかなり似ています"span[class|id|title|style]"
bosco

ありがとう。私はJavaScriptを知らないので、スニペットが機能することを前提にしています。私の悪い。
mcography 14年

1
違反はありませんが、理解できないコードを使用するべきではありません。それはハッカーの夢ですね。ユーザーにコードをインストールしてもらいます(たまたま悪質です)。
s_ha_dum 2014年

いくつかの調査の後、この問題は私が最初に考えたよりもいくぶん複雑に見えます。調査結果と回避策/解決策を本日中に追加します。余談ですが、@ s_ha_dumは非常に有効なポイントを提示します。WordPressの微調整、開発、またはWordPressの開発に時間を費やす予定がある場合は、基本的な技術に慣れるのに少し時間を費やす必要があります。あなたのサイトを安全に保つことは言うまでもありません。
bosco 14年

回答:


8

バックグラウンド

空の除去の周りにこの問題が公転<span></span>ポストを保存するか、間の切り替えのTinyMCEの要素VisualTextエディタのタブ。チケット#26986に4.0-alpha-20140602記載されているように、この問題はコア機能に固有であり(トランクバージョン以降)、標準のWordPress APIを介して変更することはできません。チケットは設定の背後にある理由を詳しく説明し、としてマークされています。つまり、最善の策は以下にリストされた「回避策」の1つであることを意味します。wont-fix

デフォルトのWordPress / TinyMCEの動作

デフォルトでは、WordPressのTinyMCEインスタンスは、何もしないマークアップを排除するために、空のタグや特定の属性がないタグが削除されるように構成されています。

MDNの<span>ドキュメントから:

HTML要素は、フレージングコンテンツ用の一般的なインラインコンテナーであり、本質的に何も表現しません。(classまたはid属性を使用して)スタイル設定の目的で要素をグループ化したり、langなどの属性値を共有するために使用できます。他の意味要素が適切でない場合にのみ使用してください。

<span>グループインライン要素/コンテンツに意図され、ワードプレスコア貢献要素は、タグが空の場合は無関係であるので、コンテンツからそれを除去しなければならないことを決定しました。


回避策

ほとんどの部分については、TinyMCEをの設定を変更するための適切な方法をすることであるにフックtiny_mce_before_initフィルタをただしspanの空の除去動作は、このように変更することはできません。そのためには、コアファイルへのハックが必要になる可能性が高いため、検討するソリューションは提供していません。

理想:<span>スクリーンリーダーにテキストを与える

スクリーンリーダーは、視覚障害者を支援するために画面上のコンテンツを解釈しようとするソフトウェアです。Webページを処理するとき、ほとんどのスクリーンリーダーは、CSS(およびJavaScript)を完全に無効にするか、サブセットのみを処理するため、通常はCSSによって非表示になっているものが、表示されているかのように処理されます。ウェブ開発者は、伝統的に、CSSが有効になっているすべての人からそれらを非表示になります要素に適用可能なCSSクラスを作成することにより、アクセシビリティの名前で、この動作を利用するの線に沿って何かを

.screen-reader-text {
    position: absolute !important;
    height: 1px;
    width: 1px; 
    overflow: hidden;
    clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
    clip: rect(1px, 1px, 1px, 1px);
}

このクラスが利用できる場合(テーマのスタイルシートには類似のクラスが含まれている可能性があります)、アイコンスパン内に、画面に表示されない(または少なくとも表示されるように見える)2番目の「スクリーンリーダー」スパンを追加できます。は、alt属性がどのように機能するかと同様に、スクリーンリーダーにアイコンのアクセス可能な代替を提供します<img>

<span class="icon-shield"><span class="screen-reader-text">Security</span></span>

上記は、CSSが有効になっているときにアイコンを表示し、スクリーンリーダーが代わりに「セキュリティ」を解釈します。

<span>目に見えないコンテンツを与える

<span>が削除されないようにするために、明示的に表示されていないコンテンツを追加できます。

  • 開始タグと終了タグの間にスペース文字を追加するだけで十分です。ただし、空の空白が削除されるため、&nbsp;HTMLエンティティを介して文字を追加する必要があります。この文字は、タブを切り替えるか保存すると通常のスペースに見えるように変換されますが、マークアップから削除されません。これは、要素に単一の文字を配置した場合と同様に、スパンのサイズに影響を与える可能性があることに注意してください。

    <span class="icon-shield">&nbsp;</span>

  • UTF-8文字セットを使用していると想定すると、HTMLエンティティを介して「ソフトハイフン」文字を使用できます&shy;。とは異なり&nbsp;、ソフトハイフンキャラクターは、スペースを取らないかのようにレンダリングされ、スパンのサイズに影響を与えません。

    <span class="icon-shield">&shy;</span>

代替要素を使用する

WordPressのTinyMCEは空の<span>要素を取り除くように構成されていますが、コンテンツなしで存在できるようにデフォルトで構成されている他の多くのタグがあります。コメントではチケット#26986TobiasBgは、使用することをお勧めします<i><em><b>、および<strong>いくつかの他の可能性あり)。アイコンの使用方法の詳細については、このスタックオーバーフローの質問を参照してください<i>

<i class="icon-shield"></i>

独自のTinyMCEインスタンスを作成する

これはおそらく、最も複雑で一般的にばかげた解決策であるため、実装は提供しません。プラグインを使用すると、TinyMCEスクリプトの個別のインスタンスをロードし、(WordPressが公開するオプション以外に)必要に応じてそれらを構成し、デフォルトのエディターを置き換える(または非表示にして代わりのメタボックスを追加する)ことができるはずです。空のスパンの削除を無効にすることはできますが、そのような実装を具体化するために必要な時間は、メリットをはるかに上回ります。


100万人に感謝、@ boscho!お時間を割いていただき、ありがとうございました。私は今サインオフしなければなりませんが、今夜遅くにあなたの提案を調べます。
mcography 14年

<i>要素も削除されます。取り除かれていないだけのようです。
EHerman、2015年

@EHermanいくつかの実験を行っiたところ、最も単純なものまですべての空の要素<i></i>が新しい投稿の作成とその後の変更の過程で保持されました-コンテンツから削除されたものはありませんでした。また、コアコードベースでそのような動作を特定することもできません。WordPressが空のi要素を削除するユースケースを提供できますか?
bosco 2015年

これを回避する別の方法は、アイコンをコンテンツに挿入するショートコードを作成することです。[icon class = shield]のようなもの。これにより、ビジュアルエディターの使用中にアイコンを編集することもできます。
HU ist Sebastian

1
もう1つの方法は、HTMLコメントをのようにspan要素内に置くこと<span class="icon-shield"><!-- icon --></span>です。これは、スペースを&nbsp;必要とせず、TinyMCEが要素を削除するのを防ぎます。
j08691
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.