9

我有一个页面,我需要允许用户输入一段文本。然后在该文本之后,插入一个将呈现帖子列表的短代码,然后添加更多自由格式的文本。我的想法是他们应该能够插入一个短代码来输出帖子。这样他们就可以简单地在他们希望帖子出现的地方添加短代码。

我目前有检索在其自己的文件中分隔的帖子的逻辑。目前,我只需使用以下get_template_part()功能将其包含在页面中:

get_template_part('donation', 'posts');

我研究了如何创建简码并将以下代码包含到我的functions.php文件中以创建简码:

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{
    get_template_part('donation', 'posts');    
}

正在正确执行并且donation-posts.php帖子正在出现,但是,它们始终位于内容之前,而不是放置短代码的位置。

我尝试删除该get_template_part()功能并仅输出一些文本,并且效果很好。所以我知道这get_template_part()可能不是正确的方法,但是,我无法找到一种方法来做我想做的事情(我相信有一种方法......我只是没有'没找到)。

我试过了:

include(get_template_directory(). '/donation-posts.php');
include_once(get_template_directory(). '/donation-posts.php') : 

但是一旦它们命中包含文件中的 PHP 代码,它们就会停止处理。

我也试过:

$file = file_get_contents(get_template_directory(). '/donation-posts.php');  
        return $file;

但这仅返回文件的内容(如函数名称所示),这意味着它不会执行PHP 脚本来返回帖子。

以前有人做过吗?

4

4 回答 4

20

你可以试试这个,它可以解决你的问题,因为get_template_part基本上反应就像PHP's require,它不会返回但会立即在它被调用的地方回显内容。

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{        
    ob_start();  
    get_template_part('donation', 'posts');  
    $ret = ob_get_contents();  
    ob_end_clean();  
    return $ret;    
}
于 2012-09-07T21:25:24.237 回答
10

这是一个更动态的版本,您可以在其中将路径传递给模板。

function template_part( $atts, $content = null ){
   $tp_atts = shortcode_atts(array( 
      'path' =>  null,
   ), $atts);         
   ob_start();  
   get_template_part($tp_atts['path']);  
   $ret = ob_get_contents();  
   ob_end_clean();  
   return $ret;    
}
add_shortcode('template_part', 'template_part');  

和简码:

[template_part path="includes/social-sharing"]
于 2015-02-12T12:44:50.823 回答
1

接受答案的最小版本:

function my_template_part_shortcode() {
    ob_start();
    get_template_part( 'my_template' );
    return ob_get_clean();
}
add_shortcode( 'my_template_part', 'my_template_part_shortcode' );

my-template.php您要包含的文件在哪里。

于 2015-11-01T22:54:48.537 回答
1

get_template_part() 在functions.php 中使用它时对我不起作用。我在 ob_start 和 clean 中使用了 locate_template() 。例如:

function full_petition_shortcode( $attr ) {
    ob_start();
    locate_template( 'petition.php', TRUE, TRUE );

    return ob_get_clean();
}
add_shortcode( 'full-petition', 'full_petition_shortcode' );
于 2015-11-28T16:19:17.357 回答