快捷码是否没有为其他元素留出空间?

时间:2011-03-01 作者:Wordpressor

我已经创建了自己的短代码。很遗憾,我无法共享代码/

当我在我的页面上使用它时,它的行为很奇怪。它始终具有最高优先级。我是指页面编辑器中的类似内容:

Text
[shortcode]
页面上的输出:

< shortcode contents > 
Text
在页面编辑器中:

[shortcode]
Text
[shortcode]
提供:

< shortcode contents >
< shortcode contents >
Text
所以我无法在我的短代码之前和之间放置任何东西。

更详细地说,我的短代码使用了一些ifs、foreach和循环(它们从自定义post类型获取和显示数据)。

知道为什么会这样吗?

[编辑]

OK, so I\'ve been using echoes instead of return. My bad. Is there any way of return my whole function without editing every single line and adding $output etc.?

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

我认为您的问题是,您的短代码响应它的输出,而不是返回它。

因此,在您的shortcode函数中,删除任何直接输出(即?>.....<?php 以及任何echo而是将您的输出收集到一个变量中并返回:

function my_shortcode_cb($atts) {
    ....
    $output = ....
    $output .= ....
    return $output;
}

More detail:

因此

while ($a != $b) {
    echo "<ul>";
    if ($c == $d) {
        foreach ($e as $k => $v) {
            ?>
            <li class="item-<?php echo $k; ?>"><?php echo $v; ?></li>
            <?php
        }
    }
    echo "</ul>";
}
您可以:

$output = \'\';
while ($a != $b) {
    $output .= "<ul>"
    if ($c == $d) {
        foreach ($e as $k => $v) {
            $output .= "<li class=\\"item-".$k."\\">".$v."</li>";
        }
    }
    $output .= "</ul>";
}
return $output;
或者,如果你想便宜点;-),您可以这样做:

ob_start();
while ($a != $b) {
    echo "<ul>";
    if ($c == $d) {
        foreach ($e as $k => $v) {
            ?>
            <li class="item-<?php echo $k; ?>"><?php echo $v; ?></li>
            <?php
        }
    }
    echo "</ul>";
}
return ob_get_clean();
顺便说一句:如果你的短代码回调真的很长,那么它很有可能进行重构。如果这样做的话,不管怎样,很可能会从函数调用返回的字符串中汇编输出。

结束

相关推荐

Paging in a sidebar mini loop

我切换到了另一个主题,并决定用其中的一些默认代码制作一个小部件,在自定义循环中显示我的美味帖子、推特帖子、su帖子和youtube视频(不包括主循环中的这些类别)。但是现在。。。分页不再工作。我制作了这个小部件:// =============================== EDL Sidebar Posts Widget ====================================== class SidebarPosts extends WP_Widget { &#x