小部件内容显示在标题之前

时间:2012-08-27 作者:nouptime

我最近一直在尝试为WP电子商务创建一个“热门产品”小部件。由于没有内置功能,我参考了DaveMackintosh的帖子here 给它一个机会。

仍然没有成功。但由于有一个短代码,我决定使用“小部件中的短代码”插件,并将短代码放在文本小部件中。它现在可以工作了,但现在的问题是产品列表出现在小部件区域之外,只是浮动在侧栏中。

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

导致此行为的原因很可能是因为shortcode函数中的某些内容导致了不稳定的行为。我最近在做的事情上也遇到了同样的问题。

来自WordPress Codex for"Add ShortCode" 页面底部附近有一张便条:

请注意,由shortcode调用的函数不应产生任何类型的输出。短代码函数应返回用于替换短代码的文本。直接生成输出将导致意外的结果。这类似于过滤器函数的行为方式,因为它们不应该在调用中产生预期的副作用,因为您无法控制从何时何地调用它们。

根据您引用的示例hack,有echo 在shortcode函数中调用。基本上,这些echo命令是在小部件头脚本之前调用的。

解决这个问题的方法是通过所有echo 在函数中调用一个变量,然后在函数的末尾添加一个return语句。

return $html;

SO网友:Md. Zubaer Ahammed

如果您编写大量HTML,那么通过串联将所有内容传递给变量会非常无聊和不方便。在这种情况下,我建议使用“对象缓冲”。所以,你可以写ob_start() 函数,从中可以开始缓冲并使用$content = ob_get_clean()

让我举个例子把事情弄清楚。

正如WordPress所说,如果您正在编写shortcode. 因此,以下代码不应在出现短代码的情况下编写。

<div id="my-wrapper">

  <?php 
   $name = \'John Doe\';
   echo \'Hello \'.$name;
  ?>
</div>
要解决出现的问题(内容显示在标题之前),可以将everying设置为如下变量:

<?php

$content =\'<div id="my-wrapper">\';

$name = \'John Doe\';

$content .= \'Hello \'.$name;

echo \'</div>\';

return $content;

?>
正如您可以想象的那样,以这种方式编写大量代码将非常烦人。在这种情况下,我将使用php对象缓冲,如下所示:

<?php ob_start();?>

<!-- start your code here -->

<div id="my-wrapper">

  <?php 
   $name = \'John Doe\';
   echo \'Hello \'.$name;
  ?>
</div>

<!-- code finished -->

<?php 

$content = ob_get_clean();
return $content; 

?>
现在不需要更改代码。把一切都放在两者之间这种方法在编写大量代码的情况下非常有用,还可以增强可见性。

Note: What ob_start() does is, it starts saving everything after it (instead of letting it being outputted). On the otherhand, ob_get_clean() stops saving things and return the saved contents.

结束

相关推荐

Travel Blog Plugins

今年晚些时候,我将使用Wordpress创建一个关于我旅行的博客。我希望该博客具有以下功能我的帖子将被地理定位一张包含帖子位置的地图,可以单击地图上的各个点到达帖子</我正在寻找最好/最合适的插件。谢谢,艾尔。