在Wordpress插件中无法得到我想要的回声

时间:2012-02-09 20:54:35

标签: php wordpress

所以我正在尝试编写一个新的插件,因为我无法找到一个完全符合我想要的扩展性的插件。该插件的目标是能够使用一个简单的短代码来显示一个图像滑块,该滑块会自动填充您博客的最新帖子。

我已经准备好了基本的插件文件,并且实现并测试了短代码。我昨天在SO上解决了一个问题,但解决方案突出了一个新问题。这是代码:

function slyd( $category, $slydcount ) {
    global $post;
    $tmp_post = $post;                                                                              // Create $tmp_post to empty $post once Slyd is done with it

    $args = array(
        'category'      =>  $category,
        'numberposts'   =>  $slydcount
    );
    $slydposts = get_posts( $args );
    foreach( $slydposts as $post ) : setup_postdata($post);
        $post_title         =   get_the_title();                                                    // Get the post's title
        $post_content       =   get_the_content();                                                  // Get the post's content - will write code to get excerpt later
        $post_thumb         =   wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' );     // Get the post's featured image's src
        $post_permalink     =   get_permalink();                                                    // Get the post's permalink
        echo '<h2><a href="' . $post_permalink . '">' . $post_title . '</a></h2>'
        . '<p>' . $post_content . '</p>'
        . '<p>' . $post_thumb . '</p>';
    endforeach;
    $post = $tmp_post;                                                                              // Empty $post once Slyd is done with it
}

// Create the shortcode
function slyd_shortcode( $atts ) {
    // $atts        ::=     array of attributes
    // examples:            [slyd]
    //                      [slyd category='slide']
    //                      [slyd slydcount='5']
    //                      [slyd theme='default']

    /* Retrieve attributes set by the shortcode and set defaults for
    unregistered attributes. */
    extract( shortcode_atts( array(
        'category'      =>  'slyd',                                                                 // Which category(s) to display posts from
        'slydcount'     =>  '5',                                                                    // How many Slyds to display
        'theme'         =>  'default'                                                               // Which Slyd theme to use
    ), $atts ) );

    return "<p>category = {$category}, count = {$slydcount}</p>"
    . slyd( $category, $slydcount );
}

add_shortcode( 'slyd', 'slyd_shortcode' );

问题出在foreach的{​​{1}}循环中。我最初使用function slyd();return现在将结果放在屏幕上。这有助于显示第一篇文章,但它当然会逃避这个功能。我需要它循环并显示所有帖子。

通过研究PHP文档,我发现我可以使用echo代替printecho,但它会给我与return相同的结果。发生的事情是代码似乎执行了两次。它将自己放置在第一次需要的位置,然后它也回显到浏览器并将其放置在页面echo的正下方。

我想我的问题是,headreturnecho是否有替代方法可以解决我的问题?

提前致谢。

现在我正试图让插件进入博客的最新帖子,但我遇到了一些麻烦。当我使用the_title()和the_permalink()时,它们显示在我试图包含它们的代码之外。此外,the_content()使用_permalink()和the_title()显示一次,然后第二次显示它应该是

您可以看到行为here

1 个答案:

答案 0 :(得分:3)

在这种情况下,

return就是你想要的。您想要从slyd函数返回一个值(即html代码),以便您可以在slyd_shortcode函数中使用它(在本例中为追加它)。但是,您需要先将所有输出收集到另一个变量(下面为$ret),然后然后返回该值:

function slyd( $category, $slydcount ) {
    global $post;
    $tmp_post = $post;
    $args = array(
        'category'      =>  $category,
        'numberposts'   =>  $slydcount
    );
    $slydposts = get_posts( $args );
    $ret = '';
    foreach( $slydposts as $post ) {
        setup_postdata($post);
        $post_title         =   get_the_title();
        $post_content       =   get_the_content();
        $post_thumb         =   wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' );
        $post_permalink     =   get_permalink();
        $ret .= '<h2><a href="' . $post_permalink . '">' . $post_title . '</a></h2>'
        . '<p>' . $post_content . '</p>'
        . '<p>' . $post_thumb . '</p>';
    }
    $post = $tmp_post;                                                                  
    return $ret;
}

如您所见,您应首先使用空字符串初始化$ret变量,然后在foreach循环的每次迭代时附加到该变量。 return用于在循环之后返回整个字符串