Adds shortcodes to display the content of a post or a list of posts.
This plugin adds two shortcodes that allow you to display either the content of a post or a list of posts within the content area of a post. This plugin should be fully compatible with all post types, as it simply uses the get_post()
and get_posts()
WordPress functions.
Post Content
The first shortcode is the [post-content]
shortcode. Using that shortcode will allow you to display the content of one post within another post. This shortcode requires a single attribute with a key of “id”. To use this shortcode to display the content of a post or page with an ID of 25, you would use this shortcode like [post-content id=25]
. This shortcode also accepts the following optional arguments:
post_name
=> null
– The slug of the post that you want to pull. This can be used in place of the id
attributeshow_image
=> false
– Determines whether or not to display the featured image (if so, this appears before the content)show_excerpt
=> false
– Determines whether to default to showing the post excerpt instead of the post content (still falls back to post content if the excerpt is not set)excerpt_length
=> 0
– If you would like to limit the length of the content/excerpt shown on the page, specify the maximum number of words that should be shown (a read more link will automatically be appended to any entries that exceed that limit).image_width
=> 0
– The width, in pixels, to which the featured image should be sizedimage_height
=> 0
– The height, in pixels, to which the featured image should be sizedshow_title
=> false
– Whether or not to show the post title at the top of the content. By default, the title is wrapped in <h2>
tags, but you can use the post-content-shortcodes-title
filter to modify the title output.link_image
=> false
(set this to true/1 if you would like to wrap the featured image in a link to the post) – Added in 0.6view_template
=> null
(if you are using the Views plugin, you can set the ID of an existing Content Template to be used in-place of the default list item output) – Added in 0.6shortcodes
=> false
– By default, this plugin strips shortcodes out of the post content/excerpt. If you would like to attempt to process/render shortcodes in the content, set this flag to true.Post List
The second shortcode is the [post-list]
shortcode. This shortcode does not require any arguments, but will accept the following arguments (most of which are the default arguments used with get_posts()
):
numberposts
=> -1
offset
=> 0
category
=> null
(can accept category slug [with quotes] or category ID [without quotes])orderby
=> title
order
=> asc
include
=> null
exclude
=> null
meta_key
=> null
meta_value
=> null
post_type
=> 'post'
post_mime_type
=> null
post_parent
=> null
post_status
=> 'publish'
exclude_current
=> true
blog
=> null
(can be set to the numeric ID or the blog name [slug] of the site from which to pull the posts – this replaces the old blog_id attribute)show_image
=> false
show_excerpt
=> false
excerpt_length
=> 0
image_width
=> 0
image_height
=> 0
tax_name
=> null
(the name of a taxonomy – e.g. “tag”, “category”, etc. – to be used to filter the list of posts) – Added in 0.6tax_term
=> null
(the list of term IDs or slugs to filter the list of posts – multiple IDs or slugs can be separated by spaces) – Added in 0.6link_image
=> false
(set this to true/1 if you would like to wrap the featured image in a link to the post) – Added in 0.6ignore_protected
=> false
(set this to true/1 if you would like the post list to exclude any password-protected posts) – Added in 0.6view_template
=> null
(if you are using the Views plugin, you can set the ID of an existing Content Template to be used in-place of the default list item output) – Added in 0.6The first 13 arguments are standard arguments for the get_posts()
function.
The exclude_current
argument is not a standard argument for the get_posts()
function. It is a custom argument for this plugin. When that argument is set to true
, the current page or post will be excluded from the list of posts. If it is set to false
, "false"
or 0
, the current page or post will be included in the post list.
The blog_id
argument is also not standard. That argument allows you to pull a post from a site other than the current site when using WordPress multisite. Simply set that argument to the ID of the site from which you want to pull the post, and the post with the id
you specify will be pulled from the blog/site with the blog_id
you specify.
The show_image
, image_width
and image_height
arguments only apply to the post-list
shortcode. They determine whether to display the featured image and how to display it for each post within the list. If the image_width
and image_height
arguments are both set to 0 (which is the default), the “thumbnail” size will be used (assuming the show_image
argument is set to 1 or “true”). If only one of the image_width
or image_height
arguments are set, the other argument will be set to 999999 to ensure that the specified dimension is met.
The show_excerpt
and excerpt_length
arguments also apply to the post-list shortcode. If you set show_excerpt
to 1 or “true”, the post excerpt will be shown if it exists. If it doesn’t exist (or is empty), the post content will be shown (with HTML stripped out of it). You can truncate the length of the excerpts that are shown in the post list by setting the excerpt_length
value. The excerpt_length
is measured in words, so if you would like each excerpt to display no more than 50 words, you would set the excerpt_length
parameter to 50. If you leave it set to 0 (which is the default), the entire excerpt or content will be shown in the post list. In the post-list
shortcode, if show_excerpt
is set to 0 or false, no content will be shown in the list (as opposed to the behavior of the show_excerpt
parameter in the post-content
shortcode).
The view_template
argument can be a bit complicated to get working properly, and is still a bit experimental. Please use it at your own risk. Unfortunately, the standard [wpv-post-featured-image] and [wpv-post-url] shortcodes (and, by extension, the [wpv-post-link] shortcode) do not work properly, especially when trying to display content from another site in the network. There are three extra shortcodes created for use in your Content Template, the first two of which replace the [wpv-post-featured-image] and [wpv-post-url] shortcodes:
[pcs-thumbnail]
– will output the post thumbnail (at the width/height you set in the post-content/post-list shortcode attributes)[pcs-post-url]
– will return/output the URL to the post[pcs-entry-classes]
– will add some additional classes to the entry wrapper. Accepts 2 parameters: classes
– a space-separated list of the CSS classes you want to apply to the entrycolumns
– a numerical value representing how many columns you want in the list (which will automatically add column-1, column-2, etc. to the list of entry classes, as well as adding a class of “first” to the first item in each row – for instance, if you have 6 items, and you use [pcs-entry-classes classes="foo bar entry" columns="3"]
, the class list for the first and fourth items will be foo bar entry column-1 first
, the class list for the second and fifth items will be foo bar entry column-2
and the class list for the third and sixth items will be foo bar entry column-3
)I have created a Gist showing a simple example of a Views Content Template used with a Post List widget.
To read more about the other arguments, please visit the codex page for the get_posts()
function.
If you are looking to display a list of attachments in a post, rather than displaying a list of posts or pages, you might want to check out the List Attachments Shortcode plugin instead.
Multisite – Pulling Posts From Another Blog
To pull a list of posts from another blog, simply provide the blog’s ID as the blog_id
argument in the shortcode. With that argument, this plugin will pull a list of posts that match the other criteria you provided. If the blog_id
argument is provided, and the blog_id
doesn’t match the ID of the current blog, the exclude_current
argument will be ignored (otherwise, this plugin would automatically exclude whatever post on the other blog happens to have the same ID as the current post).
When the list is displayed, shortlinks (that blog’s URL with ?p=[post_id]
) will be used, rather than the proper permalink, since it would require a lot more resources to build the proper permalink.
The usage would look something like:
[post-list blog_id=12 post_type="page"]
When displaying a post list, you can use any post_type
that is registered on that blog (that post_type does not have to be registered on the current site).
To display the content of a single post from another blog, again, simply provide the blog’s ID as the blog_id
argument. That will pull the content of that post. Unfortunately, at this time, there is no way to invoke all of the plugins from the blog from which you’re pulling the content, so any shortcodes, filters, etc. that may be active on the source blog will not be parsed when the content is displayed on the current blog. Obviously, if all of the same plugins and themes are active (or, if any plugins/themes that introduce shortcodes and filters are active) on both the source blog and the current blog, then there is nothing to worry about.
The usage would look something like:
[post-content blog_id=12 id=25]
That would pull the content for the post with an ID of 25 from the blog with an ID of 12.
The easiest way to install this plugin automatically from within your administration area.
If that doesn’t work, or if you prefer to install it manually, you have two options.
Upload the ZIP
FTP Installation
If you would like to force this plugin to be active (generally only useful for Multi Site installations) without an option to deactivate it, you can upload the post-content-shortcodes.php & class-post-content-shortcodes.php files to your /wp-content/mu-plugins folder. If the mu-plugins folder does not exist, you can safely create it. Make sure not to upload the post-content-shortcodes folder into your mu-plugins directory, as “Must Use” plugins must reside in the root mu-plugins directory in order to work.
The easiest way to install this plugin automatically from within your administration area.
If that doesn’t work, or if you prefer to install it manually, you have two options.
Upload the ZIP
FTP Installation
If you would like to force this plugin to be active (generally only useful for Multi Site installations) without an option to deactivate it, you can upload the post-content-shortcodes.php & class-post-content-shortcodes.php files to your /wp-content/mu-plugins folder. If the mu-plugins folder does not exist, you can safely create it. Make sure not to upload the post-content-shortcodes folder into your mu-plugins directory, as “Must Use” plugins must reside in the root mu-plugins directory in order to work.
To display the content of a single post within another post, you want to use the [post-content]
shortcode. To display the content of the post with an ID of 25 and a slug of ‘this-is-my-cool-post’, the usage would look like:
[post-content id=25]
or
[post-content post_name="this-is-my-cool-post"]
To display a list of posts within another post, you want to use the [post-list]
shortcode. To display a list of all pages (post_type=page) on this site, the usage would look like:
[post-list post_type="page"]
By default, this plugin will display all posts that match the specified criteria (except for the current post). To limit the number of posts that are displayed, you should add the numberposts
argument to the shortcode. That would look like:
[post-list post_type="page" numberposts=15]
The [post-content]
shortcode will not output any extra HTML at all. It simply outputs the content of the page being cloned. The original title is not output, nor is any sort of wrapper HTML.
The [post-list]
shortcode, however, does output some HTML to actually format the list. The default HTML code output looks like:
<ul class="post-list"> <li class="listed-post"><a href="%permalink%" title="%title%">%title</a></li> </ul>
There are some filters available within the plugin that can alter the HTML generated by the shortcode. Those filters are as follows:
Yes.
[post-list]
shortcode retrieves an empty list of posts/pages, it will normally return an empty string (so as not to disrupt the flow of the page). However, you can have the shortcode output a custom error message by hooking into the post-content-shortcodes-no-posts-error
filter.post-content-shortcodes-defaults
filter. The array of default arguments is passed to that filter before it gets used.[post-content]
shortcode (for instance, to wrap it in an HTML container, or to add content before or after), you can hook into the post-content-shortcodes-content
filter. The constructed HTML output is passed as the first parameter, and the WordPress post object is passed as a second parameter.[post-content]
shortcode (if you are limiting the length of the content/excerpt), you can use the post-content-shortcodes-read-more
filter to do so.post-content-shortcodes-image-class
to do that.post-content-shortcodes-default-image-size
filter.There are also four actions that are executed (as of 0.6) within the plugin:
pcs_starting_post_content
– Fires when the post_content() function is entered; allows you to selectively add any special filters, etc. that need to be added just for use within the post-content shortcode.pcs_ending_post_content
– Fires before the output from the post_content() function is returned; allows you to remove any filters that you may have added in the pcs_starting_post_content
action.pcs_starting_post_list
– Fires when the post_list() function is entered; allows you to selectively add any special filters, etc. that need to be added just for use within the post-list shortcode.pcs_ending_post_list
– Fires before the output from the post_list() function is returned; allows you to remove any filters you may have added in the pcs_starting_post_list
action.By default, the [post-list]
shortcode excludes the current post (since that would cause somewhat of a loop in the user’s mind; clicking on a link in the page only to have the page reload with the same content). To allow the current post to be displayed in the list of posts, set the exclude_current
argument to 0
. That might look something like:
[post-list exclude_current=0]
Use the blog
attribute to specify which site/blog the post should be pulled from. The blog
attribute can accept a blog ID (numeric) or a blog name (the slug of the blog).
Yes. You can safely network-activate this plugin, or even use it as a mu-plugin. To pull a post with a slug of ‘this-is-my-cool-post’ from a blog with an ID of 10 and a slug of ‘mycoolsite’, the usage would look something like:
[post-content post_name="this-is-my-cool-post" blog=10]
or
[post-content post_name="this-is-my-cool-post" blog="mycoolsite"]
Yes. The way this plugin works, there is no distinction between multi-network & multisite. You can use the blog_id
argument to pull posts from any site in the entire multi-network installation; regardless of which network they fall under.
There is a known issue where HTML (especially [caption] shortcodes) within the excerpt can break the entire page. In order to avoid this, be sure to place the tag above the [caption] shortcode within the posts being pulled into the post-list shortcode.
Unfortunately, because of the way the Views plugin processes posts, the [wpv-post-url], [wpv-post-link] and [wpv-post-featured-image] shortcodes do not work properly. Instead, you will need to use the [pcs-post-url] and [pcs-thumbnail] shortcodes.
enable-site-settings
and tax_query
link_image
attribute to wrap post thumbnail in a link (h/t @vince102, @MadManSam and @soft4tec)tax_term
and tax_name
attributes to help filter the list by taxonomyignore_protected
attribute to leave password-protected posts out of the post-list (h/t @kapsol)pcs_starting_post_list
, pcs_ending_post_list
, pcs_starting_post_content
and pcs_ending_post_content
)post-content-shortcodes-open-item
filterpost-content-shortcodes-include-thumbnail
filter to change the way the thumbnail is included in post content (if desired)switch_to_blog()
post_list
shortcodepost_list
shortcodepcsc-transient-timeout
filter for transient timeout (to allow shorter or longer caching of data)post-content
shortcode using the show_title
attribute.This is the first version of this plugin