如何在wordpress中的短代码函数中包含一个文件

时间:2014-06-27 07:01:09

标签: php wordpress shortcode

我想制作一个短代码,在短代码中我想要一个文件。当用户在编辑器中编写短代码时。输出将显示所需的文件布局。

我做了一个短代码,但这不起作用,这是我的短信代码:

<?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();
?>

它只显示小部件,所有布局都变得混乱。 任何想法

1 个答案:

答案 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();