I'm trying to get page content when I only know the slug string.
Is there a function for this, or an easy way to do this or is this a case of doing it via SQL?
Thanks very much
Use get_posts()
and the parameter name
which is the slug:
$page = get_posts([ 'name' => 'your-slug' ]);
if ( $page )
{
echo $page[0]->post_content;
}
Be aware that the post type in get_posts()
defaults to 'post'
. If you want a page use …
$page = get_posts([
'name' => 'your-slug',
'post_type' => 'page'
]);
If you want all public post types (except attachments) set the post type argument to 'any'
. Then you could get more than one result because slugs are not unique across different post types.
You can get a page by its title using get_page_by_title()
function.
You can use it like this (assuming you want to show the content):
$page = get_page_by_title('Your Title');
$content = apply_filters('the_content', $page->post_content);
echo $content;
BTW, to Get page using slug:
function get_page_id_by_slug($slug){
global $wpdb;
$id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '".$slug."'AND post_type = 'page'");
return $id;
}
$page = get_post(get_page_id_by_slug('my-slug'));
Read up on conditional tags:is_page()
also takes the slug as an argument.
Hence,
if( is_page( 'your-slug' ) ) {
// fetch content
}
will do what you want.
Should you be interested on how to fetch post/page content based on a slug when not on said page, you can feed get_posts
a slug as well. This is not documented in the codex.
The following will fetch the id from a slug:
$args = array(
'name' => 'your-slug'
);
$posts_from_slug = get_posts( $args );
// echo fetched content
echo $posts_from_slug[0]->post_content;
Use get_page_by_path
to retrieve the WP_Post object, then you can extract the post content and filter for HTML output if necessary.
Syntax
get_page_by_path( string $page_path, string $output = OBJECT, string|array $post_type = 'page' )
Example:
I use this code when populating a theme template from a page, to ensure the content is rendered as HTML:
<?php
$about = get_page_by_path('about');
$content = apply_filters( 'the_content', $about->post_content );
echo $content;
?>
To get a post of a different type, pass in the other two parameters:
get_page_by_path('cat', OBJECT, 'animal');
for more reference see WordPress Function Reference