开发者

Problem return a function inside of a shortcode in Wordpress

开发者 https://www.devze.com 2023-02-09 03:35 出处:网络
I have some trouble coding a themes shortcode. I want the code to display a div with a view counter function, and then a link with the shotcodes content as the url.

I have some trouble coding a themes shortcode. I want the code to display a div with a view counter function, and then a link with the shotcodes content as the url.

The view_count(); function works fine when called inside theme files, and I actually managed to make it show, but then it displayed before the_content(); of the post (the gray bar), when I wanted it within content under an element.

(1) Here's what I've got:

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) Here's the code that displays both on top of page:

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) This code displays the views above content, and the link in the correct place:

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

I read somewhere in the Wordpress forums that you should return (instead of echo) values within functions, but that breaks it, displaying the view count, skips the html and spits out the $content.

Here is a link to the page in question: http://nvrt.me/4Qf1 (currently using code from block #2)

I'm running out of midnight oil. I would really appreciate it if someone could help me out.


EDIT:

Here is the code for the_views(); function. I can see that it's echoed, but when changed to return, it doesn't display it at all.

### 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 '';
    }
}


Even though it is a recommended practice in Wordpress to have functions that return values, it is not always possible, especially when you are calling another function that writes it's output directly to the stream.

When the component writes it's output directly to the stream you need to code to accommodate that behavior unless you want to rewrite the who component (I wouldn't do that ;-) ).

In this instance the the_views() function actually offers you both options. If you look at the $display parameter and follow the code this function can behave both ways. If $display is set to True (it's default) it will echo the results of the function. If $display is set to False it will return the output.

So you have two options, both of which should work:

Option 1, Return a value

Note that when I call the_views() I pass it a false parameter like this: 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>";
}

?>

*Option 2: Echo your output *

Note that when I call the the_views() there are no parameters passed to it.

<?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>";
}

?>

Oh, also, don't forget to escape your quotes when you are returning a string.


Couldn't add the code block as a comment on @BLewis response but working off what he said, I did something like this:

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


I'd like to contribute a new answer here.

I was working on extending a plugin and found this was how the author did it and to me it makes much more sense.

If you're outputting a lot of HTML you should not use echo, it's bad practise, hard to read and a pain to keep the formatting of the output nice using echo. Even if you use it's counter parts, it's still less clean to have echo_r or print or var_dump than to use pure HTML.

Since PHP only runs inside the wrapper tags <?php and ?>, you should use this to your advantage.

But since we can't just do this here because you may lose your content order, you can use some object storing. Basically before you start your HTML block (probably at the beginning of your shortcode function would be good), just add ob_start(); to store your code. Then just before ending your function, you can return your data using $data = ob_get_clean(); and return $data; .

Good luck with more WordPress work.

0

精彩评论

暂无评论...
验证码 换一张
取 消