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

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

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

<?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');
    }
?>

这是我的require文件代码

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

它只显示小部件和所有布局变得混乱.
任何的想法

解决方法:

你有两个问题.

首先,要求不返回任何东西.它只是从文件中“导入”代码,并在您发出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();

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...