所以我正在尝试编写一个新的插件,因为我无法找到一个完全符合我想要的扩展性的插件。该插件的目标是能够使用一个简单的短代码来显示一个图像滑块,该滑块会自动填充您博客的最新帖子。
我已经准备好了基本的插件文件,并且实现并测试了短代码。我昨天在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
代替print
或echo
,但它会给我与return
相同的结果。发生的事情是代码似乎执行了两次。它将自己放置在第一次需要的位置,然后它也回显到浏览器并将其放置在页面echo
的正下方。
我想我的问题是,head
,return
或echo
是否有替代方法可以解决我的问题?
提前致谢。
现在我正试图让插件进入博客的最新帖子,但我遇到了一些麻烦。当我使用the_title()和the_permalink()时,它们显示在我试图包含它们的代码之外。此外,the_content()使用_permalink()和the_title()显示一次,然后第二次显示它应该是
您可以看到行为here。
答案 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
用于在循环之后返回整个字符串。