Skip to content

Instantly share code, notes, and snippets.

@cubehouse
Created October 5, 2012 10:34
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save cubehouse/3839159 to your computer and use it in GitHub Desktop.
Save cubehouse/3839159 to your computer and use it in GitHub Desktop.
WordPress Fake Page Generator - Use in Theme/Plugin to create non-existant pages dynamically
// create fake page called "chat-room"
// modify function and variable names with "ABCD" to whatever you like
// modify variable $fakepage_ABCD_url to the fake URL you require
add_filter('the_posts','fakepage_ABCD_detect',-10);
function fakepage_ABCD_detect($posts){
global $wp;
global $wp_query;
global $fakepage_ABCD_detect; // used to stop double loading
$fakepage_ABCD_url = "chat-room"; // URL of the fake page
if ( !$fakepage_ABCD_detect && (strtolower($wp->request) == $fakepage_ABCD_url || $wp->query_vars['page_id'] == $fakepage_ABCD_url) ) {
// stop interferring with other $posts arrays on this page (only works if the sidebar is rendered *after* the main page)
$fakepage_ABCD_detect = true;
// create a fake virtual page
$post = new stdClass;
$post->post_author = 1;
$post->post_name = $fakepage_ABCD_url;
$post->guid = get_bloginfo('wpurl') . '/' . $fakepage_ABCD_url;
$post->post_title = "Page Title";
$post->post_content = fakepage_chat_render();
$post->ID = -999;
$post->post_type = 'page';
$post->post_status = 'static';
$post->comment_status = 'closed';
$post->ping_status = 'open';
$post->comment_count = 0;
$post->post_date = current_time('mysql');
$post->post_date_gmt = current_time('mysql', 1);
$posts=NULL;
$posts[]=$post;
// make wpQuery believe this is a real page too
$wp_query->is_page = true;
$wp_query->is_singular = true;
$wp_query->is_home = false;
$wp_query->is_archive = false;
$wp_query->is_category = false;
unset($wp_query->query["error"]);
$wp_query->query_vars["error"]="";
$wp_query->is_404=false;
}
return $posts;
}
function fakepage_ABCD_render(){
return "My amazing pretend page :D";
}
@itdahde
Copy link

itdahde commented Sep 21, 2016

Hi cubehouse,

thanks for the lightest and most functioning virtualizing code snippets, i tested more than 5 and your's the best and simplest way ;)

Nathansh, i had the same problem, in my case it belongs to the
$post->ID = -999;
I changed this to
$post->ID = -1;
and the error disappears.

Then i have another error, that belongs to the gantry template framework:

Notice: Undefined offset: 1 in /var/www/vhosts/radioherzblatt.de/dev.antennefranken.de/cms/wp-content/plugins/gantry/core/gantrybodylayout.class.php on line 482
Notice: Undefined offset: 1 in /var/www/vhosts/radioherzblatt.de/dev.antennefranken.de/cms/wp-content/plugins/gantry/core/gantrybodylayout.class.php on line 483

The code at this lines looking like below:
if ($template = $this->get_query_type($type[0])) return $template; elseif ($template = $this->get_query_type($type[1])) return $template; #482 elseif ($template = $this->get_query_type("$type[0]_$type[1]")) return $template; #483 else return $this->get_query_type('attachment');

By taking a look into the query $wp_query, if saw, that it orders post_type='attachment'
SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'antenne' AND wp_posts.post_type = 'attachment' ORDER BY wp_posts.post_date DESC
but already $post->post_type='page' was set up. So i researched and found out that for the gantry template framework was necessary to set the post_type also for the query:
$wp_query->is_attachment = false;
and then i got the result without any error or notices

@zenerry
Copy link

zenerry commented Aug 17, 2022

Great job, this works like a charm!
Is there any way to call a custom page template and use retrieved API info?

Thanks.

@PBC43
Copy link

PBC43 commented Feb 21, 2023

Amazing ! Many thanks for your job :)

@cubehouse
Copy link
Author

I am amazed this is still relevant 11 years later. Surprised WordPress has had such a robust framework it hasn't needed much change to keep this mostly working.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment