如何让WordPress和TinyMCE接受HTML5中允许的包装块级元素的<a>标记?

时间:2014-08-20 作者:Hauke P.

Starting with version 5 the HTML standard allows <a> tags wrap block-level elements. 在特定页面上,我需要用<a> 标签:

Some intro text.

<div>
  <a href="http://somewhere/">
    <h4>Some heading</h4>
    <img src="http://somewhere/some-img.jpg" alt="Some image" />
  </a>
</div>
虽然我可以在文本编辑器中输入,但它会导致一些奇怪的行为:

上述代码将转换为以下HTML代码:

<p>Some intro text.</p>
<div>
<a href="http://somewhere/"></p>
<h4>Some heading</h4>
<p><img src="http://somewhere/some-img.jpg" alt="Some image" /><br />
</a>
</div>
显然,开场白<a> 然后是结束</p> 对于从未打开的<p> 这显然是错误的。还有一些非封闭的<p><img> 标签

由于这似乎是一个与新行相关的问题,我试图从我的Wordpress代码中删除新行:

Some intro text.

<div><a href="http://somewhere/"><h4>Some heading</h4><img src="http://somewhere/some-img.jpg" alt="Some image" /></a></div>
有趣的是,这会产生以下HTML代码:

<p>Some intro text.</p>
<div><a href="http://somewhere/"><br />
<h4>Some heading</h4>
<p><img src="http://somewhere/some-img.jpg" alt="Some image" /></a></div>
现在,还有一个结尾</p> 标签在<img>. (好的,HTML5 accepts non-closed <p> tags... 但我不认为这种行为是故意在这里使用的。)此外,Wordpress还引入了<br /> 不知从哪里冒出来的。

到目前为止与Wordpress相关的问题。。。

现在谈谈与TinyMCE相关的问题:

从Wordpress中的文本编辑模式切换回视觉编辑模式时<a>s仍然存在。但是,当再次切换回文本模式(或从可视编辑模式保存页面)时<a>s完全移除。

有了这个解释,我们来谈谈我的主要问题:How can I make Wordpress and TinyMCE accept <a> tags wrapping block-level elements?

以下是我已经尝试过的:

将筛选器添加到tiny_mce_before_init 这让TinyMCEvalid_children 的设置<a>s包括<h4>s(如问题中所述)HTML5, WordPress and Tiny MCE issue - wrapping anchor tag around div results in funky output“”

  • 将筛选器添加到tiny_mce_before_init 这让TinyMCEschema settinghtml5.Block <a> tags are getting stripped from the Editor“,但我真的不明白<a> 在那里,标签被视为故意行为。

  • 2 个回复
    SO网友:clayRay

    几年后,但希望其他人会发现这个解决方案很有用。。。

    虽然我尝试在Wordpress中实现这类功能的问题略有不同,但希望这个解决方案也能对您起作用。

    首先,通过添加以下代码解决了标签不允许包含多个块级元素的问题this article 我的职能。php文件。。。

    function allow_all_tinymce_elements_attributes( $init ) {
    
        // Allow all elements and all attributes
        $ext = \'*[*]\';
    
        // Add to extended_valid_elements if it already exists
        if ( isset( $init[\'extended_valid_elements\'] ) ) {
            $init[\'extended_valid_elements\'] .= \',\' . $ext;
        } else {
            $init[\'extended_valid_elements\'] = $ext;
        }
    
        // return value
        return $init;
    }
    
    add_filter(\'tiny_mce_before_init\', \'allow_all_tinymce_elements_attributes\');
    
    。。。然后确保为我的标签命名。这允许我在文本选项卡中输入并成功保存以下内容。。。

    Some text.
    <div>
    <a href="https://somewhere.com/product/this_prod/" name="link">
    <h2>THIS PRODUCT</h2>
    Cost efficient Blablabla</a>
    </div>
    
    对于第二个问题,当从“文本”切换到“可视”选项卡时,代码被剥离,我只是关闭了特定帖子类型的可视选项卡。我修改了中的初始代码this article, 它最初的目标是帖子ID,而不是帖子类型。我将此代码添加到我的函数中。php文件。。。

    add_filter(\'user_can_richedit\', \'disable_wyswyg_to_preserve_my_markup\');
    function disable_wyswyg_to_preserve_my_markup( $default ){
      if( get_post_type() == \'product\') return false;
      return $default;
    }
    
    如果这对自定义帖子类型不起作用,可以尝试在前面的代码上方添加以下行。。。

    add_theme_support( \'post-formats\', \'my_custom_post_type\' );
    
    或者,为了解决第二个问题,您也可以尝试一个插件,例如this one.

    SO网友:richerimage

    我一直都是通过短代码来实现的。如。。。

    [b_link url="http://example.com"]<h4>Stuff</h4><p>Yadda yaddas</p>[/b_link]
    
    (手头和手机上都没有代码,但如果需要,可以明天提供。)

    结束

    相关推荐

    多个具有不同$设置[‘Drag_Drop_Upload’]值的TinyMCE(Wp_EDITOR)中断

    当我有两个+分开的wp_editors 具有不同的值drag_drop_upload 它们都被建造成drag_drop_upload 设置为true。如果我将它们全部设置为false,它们会按照预期的方式工作,但如果它们具有不同的值,则不会。下面是要演示的代码:add_action( \'add_meta_boxes\', function() { add_meta_box( \'asdf123_editors\', \'Editors\', function() { &