【问题标题】:How to include a file in shortcode function in wordpress如何在wordpress的简码函数中包含文件
【发布时间】:2014-06-27 07:01:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php wordpress shortcode


    【解决方案1】:

    这里有两个问题。

    首先,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();
    

    【讨论】:

    • 在我的情况下,文件的输出被提供了两次,直到我替换了 $return_string = ob_get_flush(); with $return_string = ob_get_clean();
    猜你喜欢
    • 2013-02-24
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多