小工具中的快捷代码包装在不需要的<p>元素中

时间:2012-04-15 作者:dashaluna

我正在使用Black Studio TinyMCE Widget 作为富文本编辑器小部件。在侧栏中,我插入了带有[testimonial] 短代码及其后的一些内容。

例如:

[testimonial]

Read more client testimonials (as a link)
当我切换到该小部件的HTML选项卡时,我得到了以下内容:

<p>[testimonial]</p>
<p><a title="Testimonials" href="http://mm.dev/testimonials/">Read more client testimonials</a></p>
shorcode仅显示随机Testimonial CPT职位:

add_shortcode("testimonial", "dlma_testimonial_shortcode");
function dlma_testimonial_shortcode($atts, $content = null){
    $args = array(
        \'post_type\' => \'testimonial\',
        \'post_status\' => \'publish\',
        \'posts_per_page\' => \'1\',
        \'orderby\' => \'rand\'
    );
    $testimonial = new WP_Query($args);

    if($testimonial){
        return apply_filters(\'the_content\', $testimonial->posts[0]->post_content);
    }
    return "";
}
但是,当我查看页面时<p> 插入元素:
Edited thanks to Tom J Nowell

<div class="textwidget">
  <p>
    <blockquote>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum velit convallis sem pulvinar vitae lobortis metus varius.” <em>Person name, Person job</em></p>
    </blockquote>
  </p>
  <p>
    <a href="http://mysite.com/testimonials/" title="Testimonials">Read more client testimonials</a>
  </p>
</div>
The[testimonial] 然而,shortcode得到了正确的扩展,因为它最初被包装到<p> 小部件中的元素,它似乎仍被包装在其中。我已尝试删除<p> 但是,只要单击Save按钮<p> 元素再次插入。

我试着移除不需要的<p> 元素,该元素用the_content 过滤如下:

remove_filter( \'the_content\', \'wpautop\' );
add_filter( \'the_content\', \'wpautop\' , 12);
那没用。我猜我在处理带有短代码的小部件的内容时出错了。我现在很困惑。如何删除不需要的<p> 包裹短代码的元素?

我将非常感谢任何帮助!

非常感谢。

5 个回复
SO网友:Trevor

实际上有几种方法可以处理Wordpress编辑器在中包装短代码<p> 标签。

这段代码可能显示了最简单的方法。。。只是一个简单而简短的函数,您需要将其放入函数中。php文件。一旦你这样做了,你的短代码周围就不再有标签了,它们都在自己的线上!

function wpex_clean_shortcodes($content){   
$array = array (
    \'<p>[\' => \'[\', 
    \']</p>\' => \']\', 
    \']<br />\' => \']\'
);
$content = strtr($content, $array);
return $content;
}
add_filter(\'the_content\', \'wpex_clean_shortcodes\');
来源:http://www.wpexplorer.com/snippet/clean-wordpress-shortcodes

希望对别人有帮助!

SO网友:Tom J Nowell

A.blockquote 是块元素,不应放在<p> 标记,您看到的是浏览器DOM试图补偿无效的html标记。如果您查看生成的原始源代码本身,您将不会找到那些散乱的段落标记

删除您的<p> 包装标签,并确保所有需要包装的内容<p> 标记在短代码内完成。

https://stackoverflow.com/questions/3428828/p-tag-is-a-block-level-element-in-xhtml

一般规则是<p> 元素是块元素,但它不应包含块元素,而应仅包含内联元素。

e、 g.:

Ap 元素可以包含:

  • span
  • b
  • strongp 元素不能包含:
    • div
    • blockquote
    • ul
    • ol
    • h1
SO网友:evavienna

这是多年来众所周知的问题。请看一下Wordpress Ticket.

正如其他人之前可能提到的,有一个插件可以解决这个问题。它被称为“Shortcode Empty Paragraph Fix“这不是最好的解决方案,但也不是那么糟糕。

我不喜欢给我的wp安装带来太多膨胀,所以我在没有类的情况下将短代码包装在div中,并修复了这个问题。

<div> [woocommerce_cart] </div>
我希望这一问题在未来几年内得到解决;)所以我可以删除div,在我看来这是一种节省的方法,因为有时函数中会有额外的函数。php可能会导致一些问题。

SO网友:Jake

我建议这样做,即将特定的“块级”短代码移到“p”元素之外,而不影响其他可能要内联的元素:

function my_fix_shortcodes($content){  
  if (strpos($content, \'<p>\') !== false) {
    /* Move \'block level\' shortcode tags outside <p> elements by surrounding with </p>...<p>
       If they have content, this will be put inside a new <p>
       - you could use a final regex to remove this if needed... */
    $block_level_shortcodes = array(
      \'testimonial\',
      \'another_shortcode\'
    );
    $regex_shortcode = \'(\' . implode(\'|\', $block_level_shortcodes) . \')\';
    // Match opening/standalone or closing shortcode tags
    $regex = \'/(\\[\' . $regex_shortcode . \'[^\\]]*\\]|\\[\\/\' . $regex_shortcode . \'\\])/\';
    $regex_count = 0;
    $content = preg_replace($regex, \'</p>$1<p>\', $content, -1, $regex_count);
    if ($regex_count > 0) {
      /* Remove <br/>s at start or end of <p> which might now be present,
         then any empty <p>s which quite probably are */
      $content = preg_replace(
        array(\'/<p>\\s*<br *\\/>/s\', \'/<br *\\/>\\s*<\\/p>/s\', \'/<p>\\s*<\\/p>/s\'),
        array(\'<p>\', \'</p>\', \'\'),
        $content
      );                    
    }
  }
  return $content;
}
add_filter(\'the_content\', \'my_fix_shortcodes\');
还要注意的是,在WordPress[4.00]本身中,似乎有一次试图解决此类问题的尝试失败了,因此您的短代码处理程序可能会被传递到以<;开头的$内容/p> 并用<;p> ,您必须检测并删除。

更新:WordPress本身似乎存在一些缺陷(与简单的初始wpautop之外的零散添加<;p>和<;/p>有关,当涉及短代码时,如上所述[但这些零散元素没有传递给处理程序]),这意味着此解决方案可能并不总是有效,即使它应该:/

SO网友:Harkály Gergő

也许这可以帮助你(或其他人):

// remove <br> tags from text widget content, from 4.8 version WP adds these tags
remove_filter(\'widget_text_content\', \'wpautop\');

结束

相关推荐

changing wp-admin/widgets.php

我们希望在管理面板中设计小部件页面时有所不同,主要是为了帮助站点管理员了解每个小部件在站点中的显示位置:为此,我们需要更改小部件所使用的HTML。php呈现(仅仅更改css是不够的)。我们如何在不触及核心的情况下做到这一点?