快捷码没有输出所有所需的标记

时间:2016-06-06 作者:Darren Bachan

我很难让我的短代码输出所有的标记-出于某种原因,它只输出了部分标记。

我有以下功能:

function shortcode_container($atts, $content = null) {

            $type = isset($atts[\'type\']) ? $atts[\'type\'] : \'\';
            $margintop = isset($atts[\'margintop\']) ? $atts[\'margintop\'] : \'\';
            $marginbottom = isset($atts[\'marginbottom\']) ? $atts[\'marginbottom\'] : \'\';

            $output = \'\';

            $output .= \'<div class="container \'.$type.\'" style="margin-top:\'.$margintop.\'; margin-bottom:\'.$marginbottom.\'">\';
            $output .= \'<section>\';
            $output .= \'<div class="row">\';
            $output .= apply_filters(\'the_content\', $content);
            $output .= \'</div>\';
            $output .= \'</section>\';
            $output .= \'</div>\';

            return $output;

        }
我希望能够将以下内容写入WP WYSIWYG:

[container]

Text

[/container]
因此它将输出为:

<div class="container">
<section>
<div class="row">
 Text
</div>
</section>
</div>
代码当前仅输出<div class="container"> 没有别的,没有<section><div class="row">.

我的全部功能。php文件为here.

2 个回复
SO网友:ZachTRice

我刚刚测试了这段代码,它似乎正在工作。虽然正如其他人所说,您在边距底部的末尾缺少一个分号,您可能希望添加该分号以确保语义正确。

话虽如此,为了让代码在输入所见即所得时准确地输出您想要的内容,而不需要额外的p标记包装文本,您应该添加一个过滤器来替换<p> 这样的标签:

/* Shortcode Content Filter */
if ( ! function_exists( \'the_content_filter\' ) ) :
    function the_content_filter($content) {
        $block = join("|",array(\'container\'));
        $rep = preg_replace("/(<p>)?\\[($block)(\\s[^\\]]+)?\\](<\\/p>|<br \\/>)?/","[$2$3]",$content);
        $rep = preg_replace("/(<p>)?\\[\\/($block)](<\\/p>|<br \\/>)?/","[/$2]",$rep);
        return $rep;
    }
    add_filter("the_content", "the_content_filter");
endif;
否则,请在编辑器中执行此操作:

[container]

Text

[/container]
这将输出:

<div class="container test" style="margin-top:20px; margin-bottom:20px"><section><div class="row"><p></p>
<p>Test</p>
<p>
</p></div></section></div>

SO网友:Mayeenul Islam

我经常做输出缓冲,这对我很有用。让我们看看这个例子。未测试。

esc_attr() 将处理各种用户输入错误的转义。

<?php
/**
 * Container shortcode
 *
 * Outputs a container wrapping the content.
 * 
 * @param  array $atts     Array of shortcode attributes.
 * @param  string $content Content within a shortcode.
 * @return string          The formatted content.
 */
function wpse_228875_shortcode( $atts, $content ) {

    $atts = shortcode_atts( array(
                \'type\'          => \'\',
                \'margintop\'     => \'\',
                \'marginbottom\'  => \'\',
            ), $atts, \'container\' );

    $type           = isset($atts[\'type\'])          ? $atts[\'type\']         : \'\';
    $margintop      = isset($atts[\'margintop\'])     ? $atts[\'margintop\']    : \'\';
    $marginbottom   = isset($atts[\'marginbottom\'])  ? $atts[\'marginbottom\'] : \'\';

    //start output buffering
    ob_start();
    ?>

    <div class="container <?php echo esc_attr($type); ?>" style="margin-top:<?php echo esc_attr($margintop); ?>; margin-bottom:<?php echo esc_attr($marginbottom); ?>;">
        <section>
            <div class="row">
                <?php
                /**
                 * Using do_shortcode() will allow you
                 * to use another shortcode within the
                 * container shortcode.
                 */
                echo do_shortcode( apply_filters( \'the_content\', $content ) );
                ?>
            </div> <!-- /.row -->
        </section>
    </div> <!-- /.container -->

    <?php
    //cleanup the buffering and return everything within
    return ob_get_clean();

}

add_shortcode( \'container\', \'wpse_228875_shortcode\', 10, 2 );
脚注:什么是输出缓冲

资料来源:https://stackoverflow.com/a/2832179/1743124