防止将快捷代码包装在<p>标记中

时间:2019-09-30 作者:sound wave

我正在使用一个latex插件在我的wordpress网站上显示公式,我想添加包含公式的短代码,因此短代码的内容必须由插件处理才能显示在页面中。

例如,通过写作$\\frac{15}{5} = 3$ 在编辑器中,这将显示在页面中.

所以我写了这个简单的短代码

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
    return "$\\frac{15}{5} = 3$";
}
但是通过写作[test] 在编辑器中,这将显示在页面中$\\frac{15}{5} = 3$.

所以我寻找解决问题的方法,通过写作发现

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
    return apply_filters( \'the_content\', \'$\\frac{15}{5} = 3$\' );
}
公式显示正确,但它被包装在<p> 标记,以便通过写入the fraction [test] equals a natural number, 这将显示

这是来自控制台的HTML

<p>the fraction </p><p><img ...></p>
 equals a natural number<p></p>
我希望短代码不会被包装在p标签中。

我知道有一个Toggle wpautop 但是,由于我在所有页面中都编写公式,手动编写将是巨大的时间浪费<p> 每个页面中的标签。

我搜索了很多关于这个问题的信息,到目前为止,我就是这么尝试的(以下所有代码都放在functions.php 文件)

remove_filter( \'the_content\', \'wpautop\' );
add_filter( \'the_content\', \'wpautop\' , 99);
add_filter( \'the_content\', \'shortcode_unautop\',100 );

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
    return apply_filters( \'the_content\', \'$\\frac{15}{5} = 3$\' );
}
<小时>
function wpex_clean_shortcodes($content){
$array = array (
    \'<p>[\' => \'[\',
    \']</p>\' => \']\',
    \']<br />\' => \']\'
);
$content = strtr($content, $array);
return $content;
}
add_filter(\'the_content\', \'wpex_clean_shortcodes\');

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
    return wpex_clean_shortcodes(apply_filters( \'the_content\',\'$\\frac{15}{5} = 3$\' ));
}
<小时>
add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
        $content = apply_filters( \'the_content\',\'$\\frac{15}{5} = 3$\' );
        $content = shortcode_unautop($content);
        return $content;
}
<小时>
add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
        $content = apply_filters( \'the_content\',\'$\\frac{15}{5} = 3$\' );
        return do_shortcode(wpautop($content));
}
最后,此代码来自Shortcode Empty Paragraph Fix 插件

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
        return apply_filters( \'the_content\',\'$\\frac{15}{5} = 3$\' );
}

add_filter( \'the_content\', \'shortcode_empty_paragraph_fix\' );
function shortcode_empty_paragraph_fix( $content ) {
    // define your shortcodes to filter, \'\' filters all shortcodes
    $shortcodes = array( \'test\' );
    foreach ( $shortcodes as $shortcode ) {
        $array = array (
            \'<p>[\' . $shortcode => \'[\' .$shortcode,
            \'<p>[/\' . $shortcode => \'[/\' .$shortcode,
            $shortcode . \']</p>\' => $shortcode . \']\',
            $shortcode . \']<br />\' => $shortcode . \']\'
        );
        $content = strtr( $content, $array );
    }
    return $content;
}
在前面的所有情况下,显示的是

如何解决这个问题?

1 个回复
最合适的回答,由SO网友:majick 整理而成

您可以尝试删除wpautop 筛选自the_content 在您的短代码中(并重新添加它以保持其他插件等的一致性):

add_shortcode( \'test\', \'test_sc\' );
function test_sc( $atts ){
    remove_filter( \'the_content\', \'wpautop\' );
    $content = apply_filters( \'the_content\', \'$\\frac{15}{5} = 3$\' );
    add_filter( \'the_content\', \'wpautop\' );
    return $content;
}

相关推荐

如何从派生的进程中使用STRING_SHORTCODES()?

我有一个插件,它生成一个进程来执行打印功能。要打印的项目(在本例中为Woocommerce产品)通过URL传递(通过product_id). 在进行打印之前,必须从产品描述中删除所有注册的短代码。如果我打电话strip_shortcodes() 它什么都不做。我猜注册的短代码数组超出了范围?是否有人能提出一种有效的方法,使流程能够使用strip_shortcodes()?