使用wordpress短代码来渲染PHP

时间:2016-07-25 14:04:29

标签: php wordpress

我正在尝试创建一个短代码来呈现自定义的PHP页面。如果我使用wordpress模板,我会得到非常奇怪的行为。

例如。如果我使用代码创建模板:

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?> <?php generate_article_schema( 'BlogPosting' ); ?>>
<div class="inside-article">
<?PHP $content = apply_filters( 'the_content', get_the_content() );

    global $post;
    $post_info = get_post($post->ID);
    $content =  $post_info->post_content;

    $ind = strrpos($content, "/");

    $page = substr($content, $ind+1);
    $path = substr($content, 0, $ind+1);

   $oldDir = getcwd();
   chdir($_SERVER["DOCUMENT_ROOT"].$path);
   include($page);
   chdir($oldDir);

?>


</div><!-- .inside-article -->
</article><!-- #post-## -->

然后在wordpress页面中,我只需输入文件的位置,例如/contact/contact_form.php。 contact_form.php页面在wordpress主题中呈现在屏幕上。

现在,我最近发现了短代码,并认为这些是在页面上呈现php的更好方法。而不是将页面内容作为/contact/contact_form.php,我可以[custom_php filepath =“/ contact / contact_form.php”]

这是我遇到问题的地方。 contact_form.php似乎在整个地方都有许多require_once()函数,但是它们似乎不存在变量,即使第一个方法(上面)工作正常。

对于我的短代码,我有:

function subscribe_custom_php_shortcode($atts, $content = null) {
$atts = shortcode_atts(
    array(
        'filepath' => '/index.php'
    ), $atts);


    $ind = strrpos($atts["file"], "/");
    $page = substr($atts["file"], $ind+1);
    $path = substr($atts["file"], 0, $ind+1);
    $oldDir = getcwd();
    chdir($_SERVER["DOCUMENT_ROOT"].$path); 
    ob_start();
    include($page); 
    $content = ob_get_clean();      
    chdir($oldDir);
    return $content;
}
add_shortcode('custom_php', 'subscribe_custom_php_shortcode');

正如您所看到的,代码非常相似,只是我添加了ob_start()和ob_get_clean()以根据某些注释获取PHP的结果。删除这些仍然似乎没有带来contact_form.php中require_conce的值。

有趣的是,如果我更改require_once for include它可以工作。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

假设filepath与主题目录相关,这应该是包含它的最佳方式......

function subscribe_custom_php_shortcode($atts, $content = null) {
    $atts = shortcode_atts(
        array(
            'filepath' => '/index.php'
        ), $atts );

    ob_start();
    include get_stylesheet_directory() . $atts['filepath'];
    $content = ob_get_clean();

    return $content;
}
add_shortcode('custom_php', 'subscribe_custom_php_shortcode');

如您所见......我们使用get_stylesheet_directory函数获取当前主题目录。

希望有所帮助