Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从短代码函数内部调用WordPress get_template_part首先呈现模板_Php_Wordpress_Shortcode - Fatal编程技术网

Php 从短代码函数内部调用WordPress get_template_part首先呈现模板

Php 从短代码函数内部调用WordPress get_template_part首先呈现模板,php,wordpress,shortcode,Php,Wordpress,Shortcode,我有一个页面,我需要允许用户输入一段文字。然后在该文本之后,插入一个短代码,该短代码将呈现一个帖子列表,然后再添加更多自由格式的文本。我的想法是,他们应该能够插入一个短代码,输出帖子。通过这种方式,他们可以简单地在希望帖子出现的地方添加快捷码 我目前有检索在自己的文件中分开的帖子的逻辑。目前,我只需使用get\u template\u part()函数即可将其包含在页面中: get_template_part('donation', 'posts'); 我研究了如何创建短代码,并将以下代码包含

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

我目前有检索在自己的文件中分开的帖子的逻辑。目前,我只需使用
get\u template\u part()
函数即可将其包含在页面中:

get_template_part('donation', 'posts');
我研究了如何创建短代码,并将以下代码包含到我的
functions.php
文件中以创建短代码:

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{
    get_template_part('donation', 'posts');    
}
[template_part path="includes/social-sharing"]
php正在正确执行捐赠帖子,帖子也在出现,但是,帖子总是放在内容之前,而不是放在快捷码的位置

我尝试过删除
get\u template\u part()
函数,只输出一些文本,效果很好。因此,我知道
get\u template\u 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脚本来返回帖子


以前有人这样做过吗?

您可以尝试一下,它可能会解决您的问题,因为
获取模板部分
基本上会像
PHP的
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;    
}

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

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');  
还有短代码:

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{
    get_template_part('donation', 'posts');    
}
[template_part path="includes/social-sharing"]

接受答案的最低版本:

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
是您希望包含的文件。

get\u template\u 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' );

很抱歉,我花了这么长时间才做出回应,但我有一大堆项目要做,这是一个公益项目,因此它在优先事项中占有相应的位置。不管怎样,你的修复正是我需要的!非常感谢。这是一个如此丑陋的解决方案,但它是最好的(唯一的?)解决方案。太棒了,尽管如此,我告诉我这里的评论不是为了感谢你的话,我只能说,谢谢你,伟大的模块化!希望这个例子也能有所帮助: