3

I want to make a shortcode and in shortcode i want to require a file. when a user write a shortcode in editor. The output will show the required file layout.

I make a shortcode but this not working, here is my shortdoe Code:

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

Here is my require file code

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

It show me only widgets and all layout get messy. any idea

0

1 Answer 1

9

You have two issues here.

First, require doesn't return anything. It just "imports" the code from the file and runs it exactly where you put the require call. So, everything in your new file is displayed before the rest of the stuff WordPress handles.

You can circumvent this with an output buffer. This:

$return_string = require 'foo/foo_artilces_list.php'; 

Should look like this:

ob_start(); require 'foo/foo_artilces_list.php'; $return_string = ob_get_flush(); 

Now you can return the string and WordPress will do the rest.

Second problem: your get_header() and get_footer() calls. WordPress will already have printed it's header, your call will display it a second time. Same goes for the footer ... your included file will display the footer and WordPress will display it a second time at the end of the page. You should remove both calls from your included file.

Using the output buffer for this is not a very clean solution. It would be better to place all your output in the included file in a function that stores everything in a variable that is returned by the function. Then you could do:

require('foo/foo_artilces_list.php'); $return_string = my_function(); 
Sign up to request clarification or add additional context in comments.

1 Comment

In my case output from the file was served twice until I replaced $return_string = ob_get_flush(); with $return_string = ob_get_clean();

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.