问题在Wordpress中返回短代码内的函数

时间:2011-02-07 06:43:03

标签: php wordpress function shortcode

嘿伙计们,我在编写主题短代码时遇到了一些麻烦。我希望代码显示带有视图计数器功能的div,然后将带有shotcodes内容的链接显示为url。

view_count();函数在主题文件中调用时工作正常,我实际上设法让它显示,但然后它显示在the_content()之前;帖子(灰色条),当我想要它在元素下的内容中时。

(1)这就是我所拥有的:

function video_block( $atts, $content = null ) { 
    return '<div class="video-block"><span class="ViewCount"><?php the_views(); ?></span> <a class="dl-source" href="' . $content . '">Link</a></div>';
}

(2)这是在页面顶部显示的代码:

function video_block( $atts, $content = null ) { ?>
    <div class="video-block"><span class="ViewCount"><?php the_views(); ?></span> <a class="dl-source" href="<?php echo $content; ?>">Link</a></div>
<?php }

(3)此代码显示上述内容的视图,以及正确位置的链接:

function video_block( $atts, $content = null ) {
    $views = the_views();
    return '<div class="video-block"><span class="ViewCount"><?php $views; ?></span> <a class="dl-source" href="<?php echo $content; ?>">Link</a></div>';
}

我在Wordpress论坛的某个地方读到你应该在函数中返回(而不是echo)值,但这会破坏它,显示视图计数,跳过html并吐出$ content。

以下是相关网页的链接:http://nvrt.me/4Qf1(目前正在使用第2栏中的代码)

我的午夜油耗尽了。如果有人可以帮助我,我将非常感激。


修改

以下是the_views()的代码;功能。我可以看到它已经回显,但是当改为返回时,它根本不会显示它。

### Function: Display The Post Views
function the_views($display = true, $prefix = '', $postfix = '', $always = false) {
    $post_views = intval(post_custom('views'));
    $views_options = get_option('views_options');
    if ($always || should_views_be_displayed($views_options)) {
        $output = $prefix.str_replace('%VIEW_COUNT%', number_format_i18n($post_views), $views_options['template']).$postfix;
        if($display) {
            echo apply_filters('the_views', $output);
        } else {
            return apply_filters('the_views', $output);
        }
    }
    elseif (!$display) {
        return '';
    }
}

3 个答案:

答案 0 :(得分:5)

尽管在Wordpress中建议使用返回值的函数, 并不总是可以 ,尤其是在调用另一个写入它的函数时#&strong> 39; s直接输出到流。

当组件将其输出直接写入流时,您需要编码以适应该行为,除非您想要重写who组件(我不会这样做;-))。

在这个例子中,the_views()函数实际上为您提供了两个选项。如果查看$ display参数并按照代码执行此功能,则可以采用两种方式。如果$ display设置为True(它是默认值),它将回显函数的结果。如果$ display设置为False,它将返回输出。

所以你有两个选择,两个都应该有效:

选项1,返回值

请注意,当我调用the_views()时,我会传递一个false参数,如下所示:the_views(false)

<?php

function video_block( $atts, $content = null ) { 
  return "<div class=\"video-block\"><span class=\"ViewCount\">" . the_views(false) .  "</span><a class=\"dl-source\" href=\"$content\">Link</a></div>";
}

?>

* 选项2:回应您的输出*

请注意,当我调用the_views()时,没有传递给它的参数。

<?php

function video_block( $atts, $content = null ) { 
  echo "<div class=\"video-block\"><span class=\"ViewCount\">";
  the_views();
  echo "</span><a class=\"dl-source\" href=\"$content\">Link</a></div>";
}

?>

哦,也不要忘记在退还字符串时逃脱你的报价。

答案 1 :(得分:3)

无法将代码块添加为对@BLewis响应的评论,但是根据他的说法,我做了类似的事情:

function my_shortcode() {
  ob_start();
  a_function_to_display();
  $data = ob_get_clean();
  return $data;
}
add_shortcode( 'shortcode_name', 'my_shortcode' );

答案 2 :(得分:2)

我想在这里提供一个新答案。

我正在努力扩展插件,发现这就是作者如何做到的,对我来说它更有意义。

如果您输出大量HTML,则不应使用echo,这是不好的做法,难以阅读,并且使用echo保持输出的格式不错很难。即使你使用它的计数器部分,使用echo_rprintvar_dump比使用纯HTML还要简洁。

由于PHP仅在包装器标签<?php?>内运行,因此您应该利用此功能。

但是因为我们不能在这里执行此操作因为您可能丢失了内容顺序,所以您可以使用一些对象存储。基本上在开始HTML块之前(可能在短代码函数的开头就好了),只需添加ob_start();来存储代码。然后在结束您的功能之前,您可以return$data = ob_get_clean(); return $data;使用{{1}}数据。

祝更多WordPress的工作顺利。