3

我在编写主题短代码时遇到了一些麻烦。我希望代码显示一个带有视图计数器功能的 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 论坛的某个地方读到,您应该在函数中返回(而不是回显)值,但这会破坏它,显示视图计数,跳过 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 '';
    }
}
4

3 回答 3

5

尽管在 Wordpress 中推荐使用返回值的函数,但这并不总是可行的,尤其是当您调用另一个将其输出直接写入流的函数时。

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

在这种情况下,the_views() 函数实际上为您提供了两个选项。如果您查看 $display 参数并遵循代码,则此函数可以双向运行。如果 $display 设置为 True(它是默认值),它将回显函数的结果。如果 $display 设置为 False 它将返回输出。

所以你有两个选择,这两个都应该工作:

选项 1,返回一个值

请注意,当我调用 the_views() 时,我会向它传递一个像这样的错误参数: 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>";
}

?>

哦,另外,当你返回一个字符串时,不要忘记转义你的引号。

于 2011-02-07T06:50:21.367 回答
3

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

function my_shortcode() {
  ob_start();
  a_function_to_display();
  $data = ob_get_clean();
  return $data;
}
add_shortcode( 'shortcode_name', 'my_shortcode' );
于 2014-06-09T13:54:01.980 回答
2

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

我正在努力扩展一个插件,发现这就是作者的做法,对我来说这更有意义。

如果您要输出大量不应该使用的 HTML echo,那么使用echo. 即使您使用它的对应部分,使用或echo_r使用纯 HTML 仍然不太干净。printvar_dump

由于 PHP 仅在包装标签<?php和内运行?>,因此您应该利用它来发挥自己的优势。

但是由于我们不能在这里这样做,因为您可能会丢失您的内容顺序,您可以使用一些对象存储。基本上在您开始您的 HTML 块之前(可能在您的短代码功能的开头会很好),只需添加ob_start();以存储您的代码。然后在结束你的函数之前,你可以return使用你的数据$data = ob_get_clean();and return $data;

祝你有更多的 WordPress 工作好运。

于 2013-09-01T12:54:24.760 回答