Plugin Directory

Insert Pages

Insert Pages lets you embed any WordPress content (e.g., pages, posts, custom post types) into other WordPress content using the Shortcode API.


  • Feature: Add options page with option to insert page IDs instead of page slugs (users of WPML will need this feature if translated pages all share the same page slug).
  • Feature: Inserted pages with Beaver Builder enabled now embed correctly.
  • Fix: TinyMCE toolbar button states (active, disabled) have been fixed.
  • Fix: TinyMCE cursor detection inside an existing shortcode has been fixed.
  • Fix: Expanded options in Insert Pages popup now correctly remembers last choice.
  • Fix: Restore missing spinners in search dialog.
  • Fix: prevent PHP warning when rendering wp_editor() outside of edit context. Props Jerry Benton.


  • Add shortcode attribute to wrap inserted content in an inline element (span) instead of a block level element (div). Example usage:
Lorem ipsum [insert page='my-page' display='content' inline] dolor sit amet.
  • Add filter to wrap inserted content in an inline element (span) instead of a block level element (div). Example usage:
function theme_init() {
    // Wrap all inserted content in inline elements (span).
    add_filter( 'insert_pages_use_inline_wrapper', function ( $should_use_inline_wrapper ) { return true; } );
add_action( 'init', 'theme_init' );


  • Add filter to show a message when an inserted page cannot be found. Example usage:
function theme_init() {
    // Show a message in place of an inserted page if that page cannot be found.
    add_filter( 'insert_pages_not_found_message', function ( $content ) { return 'Page could not be found.'; } );
add_action( 'init', 'theme_init' );


  • Fix: Prevent Insert Pages from breaking tinymce if wp_editor() is called outside of an admin context.


  • Fix: Query data wasn't getting reset properly when viewing a category archive containing a post with an inserted page, causing date and author information in post footers in the twentyfifteen theme to show incorrect information. This has been resolved.


  • Maintenance release: prevent infinite loops when using a custom template that doesn't call the_post().


  • Add insert_pages_apply_nesting_check filter. Use it to disable the deep nesting check which prevents inserted pages from being embedded within other inserted pages. Example usage:
function theme_init() {
    // Disable nesting check to allow inserted pages within inserted pages.
    add_filter( 'insert_pages_apply_nesting_check', function ( $should_apply ) { return false; } );
add_action( 'init', 'theme_init' );


  • Remove insertPages_Content id from div wrapper to allow multiple pages to be embedded; replace with insert-page class. Example: <div data-post-id='123' class='insert-page insert-page-123'>...</div>
  • New shortcode attribute: class. You can now add custom classes to the div wrapper around your inserted page:
[insert page='123' display='all' class='my-class another-class']

This results in:

<div data-post-id='123' class='insert-page insert-page-123 my-class another-class'>...</div>


  • Revert previous fix for conflict with Jetpack's Sharing widget (affected other users negatively).
  • New fix for conflict with Jetpack's Sharing widget. Use it in your theme like so:
// If Jetpack Sharing widget is enabled, disable the_content filter for inserted pages.
function theme_init() {
    if ( has_filter( 'the_content', 'sharing_display' ) ) {
        add_filter( 'insert_pages_apply_the_content_filter', function ( $should_apply ) { return false; } );
add_action( 'init', 'theme_init' );


  • Add quicktag button for Insert Pages to the Text Editor.
  • Fix conflict with Jetpack's Sharing widget.
  • Add stronger infinite loop protection (will stop expanding shortcodes nested within an embedded page).
  • Fix potential infinite loop if custom template can't be found.


  • Add insert_pages_available_post_types filter to limit post types shown in insert pages dialog (see FAQ for example filter hook). Props @noahj for the feature request.
  • Add excerpt-only display to output the excerpt without the title above it. Props @kalico for the feature request.


  • Add data-post-id attribute to div container for each inserted page, now you can reference via jQuery with .data( 'postId' ). Props to Robert Payne for the pull request, thanks!


  • Fix for custom post types marked as exclude_from_search not inserting correctly.



  • Fix for long page template names causing Display field to wrap in the tinymce popup;
  • Marked as WordPress 4.0 compatible.


  • Fix for options button toggle in tinymce popup;
  • Fix popup display on small screen sizes (mobile-friendly).


  • Update for WordPress 3.9 (update to work under tinymce4);
  • Can now edit existing shortcodes (click inside them, then click the toolbar button).


  • Better documentation.


  • Add retina toolbar icon.


  • Minor changes to documentation.


  • Initial release.


  • Development release.

Requires: 3.0.1 or higher
Compatible up to: 4.4
Last Updated: 4 days ago
Active Installs: 7,000+


4.8 out of 5 stars


4 of 6 support threads in the last two months have been resolved.

Got something to say? Need help?


Not enough data

1 person says it works.
0 people say it's broken.

0,1,0 0,1,0 0,1,0
100,1,1 0,1,0 100,1,1