我想制作一个短代码,在短代码中我想要一个文件。当用户在编辑器中编写短代码时。输出将显示所需的文件布局。
我做了一个短代码,但这不起作用,这是我的短信代码:
<?php
function inner_page( $atts, $content = null ){
$return_string = require 'foo/foo_artilces_list.php';
return $return_string;
}
add_action('init', 'register_section_shortcodes');
function register_section_shortcodes(){
add_shortcode('inner_page', 'inner_page');
}
?>
这是我的需要文件代码
<?php
/*=========
Template Name: KBE
=========*/
get_header();
?>
<div id="foo_container">
<h1><?php the_title(); ?></h1>
<!--Breadcrum-->
<?php
if(FOO_BREADCRUMBS_SETTING == 1){
?>
<div class="foo_breadcrum">
<?php echo foo_breadcrumbs(); ?>
</div>
<?php
}
?>
<!--/Breadcrum-->
<!--search field-->
<?php
if(FOO_SEARCH_SETTING == 1){
?>
<div class="foo_search_field">
<input name="" type="text" placeholder="Search the knowledgebase..." />
</div>
<?php
}
?>
<!--/search field-->
<!--content-->
<?php
if(FOO_SIDEBAR_SETTING == 0){
?>
<div id="foo_content" class="foo_content_full" >
<?php
}
elseif(FOO_SIDEBAR_SETTING == 1){
?>
<div id="foo_content" class="foo_content_right" >
<?php
}
elseif(FOO_SIDEBAR_SETTING == 2){
?>
<div id="foo_content">
<?php
}
?>
<!--leftcol-->
<div class="foo_leftcol">
<div class="foo_categories">
<?php
$foo_cat_args = array(
'orderby' => 'term_order',
'order' => 'ASC',
'hide_empty' => true,
);
$foo_terms = get_terms(FOO_POST_TAXONOMY, $foo_cat_args);
foreach($foo_terms as $foo_cat){
$foo_term_id = $foo_cat->term_id;
$foo_term_slug = $foo_cat->slug;
$foo_term_name = $foo_cat->name;
?>
<div class="foo_category">
<h2>
<span class="foo_count"><?php echo FOO_ARTICLE_QTY; ?> Articles</span>
<a href="<?php echo get_term_link($foo_term_slug, 'foo_cat') ?>" title="<?php
sprintf( __( "View all posts in %s" ), $foo_term_name ) ?>"><?php echo $foo_term_name; ?></a>
</h2>
<ul class="foo_article_list">
<?php
$foo_tax_post_args = array(
'post_type' => FOO_POST_TYPE,
'posts_per_page' => FOO_ARTICLE_QTY,
'orderby' => 'name',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => FOO_POST_TAXONOMY,
'field' => 'slug',
'terms' => $foo_term_slug
)
)
);
$foo_tax_post_qry = new WP_Query($foo_tax_post_args);
if($foo_tax_post_qry->have_posts()) :
while($foo_tax_post_qry->have_posts()) :
$foo_tax_post_qry->the_post();
?>
<li>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</li>
<?php
endwhile;
else :
echo "No posts";
endif;
?>
</ul>
</div>
<?php
}
?>
</div>
</div>
<!--/leftcol-->
<!--aside-->
<?php
if((FOO_SIDEBAR_SETTING == 2) || (FOO_SIDEBAR_SETTING == 1)){
dynamic_sidebar('foo_cat_widget');
}
?>
<!--/aside-->
</div><!--content-->
</div>
<?php
get_footer();
?>
它只显示小部件,所有布局都变得混乱。 任何想法
答案 0 :(得分:7)
这里有两个问题。
首先,require
不会返回任何内容。它只是从文件中“导入”代码,并在您发出require调用的位置运行它。因此,新文件中的所有内容都会显示在WordPress处理的其他内容之前。
您可以使用输出缓冲区来避免这种情况。这样:
$return_string = require 'foo/foo_artilces_list.php';
应该是这样的:
ob_start();
require 'foo/foo_artilces_list.php';
$return_string = ob_get_flush();
现在你可以返回字符串,WordPress将完成剩下的工作。
第二个问题:您的get_header()
和get_footer()
来电。 WordPress已经打印了它的标题,你的电话会再次显示它。页脚也是如此...包含的文件将显示页脚,WordPress将在页面末尾第二次显示页脚。您应该从包含的文件中删除这两个电话。
使用输出缓冲区不是一个非常干净的解决方案。最好将所有输出放在包含文件中的函数中,该函数将所有内容存储在函数返回的变量中。然后你可以这样做:
require('foo/foo_artilces_list.php');
$return_string = my_function();