嘿伙计们,我在编写主题短代码时遇到了一些麻烦。我希望代码显示带有视图计数器功能的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 '';
}
}
答案 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_r
或print
或var_dump
比使用纯HTML还要简洁。
由于PHP仅在包装器标签<?php
和?>
内运行,因此您应该利用此功能。
但是因为我们不能在这里执行此操作因为您可能丢失了内容顺序,所以您可以使用一些对象存储。基本上在开始HTML块之前(可能在短代码函数的开头就好了),只需添加ob_start();
来存储代码。然后在结束您的功能之前,您可以return
和$data = ob_get_clean();
return $data;
使用{{1}}数据。
祝更多WordPress的工作顺利。