我正在尝试创建一个短代码来呈现自定义的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它可以工作。
有什么想法吗?
由于
答案 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
函数获取当前主题目录。
希望有所帮助