0

I am trying to create a virtual page for my plugin and I am having a $wp_query reset issue when doing so. I am using the class https://gist.github.com/brianoz/9105004 to create the virtual page. I can get everything to work ok but the issue is whenever there is another loop on the page whether from a widget plugin in the sidebar it will return the $wp_query set from the virtual page. The virtual page class has taken over the page and I can't find a way to make it so any other queries on the page will work. Thanks.

  • can you add the code you are using to the question? questions should not rely on external links. – Milo Jun 24 '14 at 23:33
0

I found this and it works. The big difference is that it checks if $post count == 0 and the creates the virtual page which will then allow all the other queries to function as normal.

<?php /*
Plugin Name: Virtual Page
Plugin URI: http://davejesch.com
Description: Create a virtual page with content
Author: Dave Jesch
Author URI: http://davejesch.com
Version: 1.0
*/

if (!class_exists('DJVirtualPage'))
{
class DJVirtualPage
{
    private $slug = NULL;
    private $title = NULL;
    private $content = NULL;
    private $author = NULL;
    private $date = NULL;
    private $type = NULL;

    public function __construct($args)
    {
        if (!isset($args['slug']))
            throw new Exception('No slug given for virtual page');

        $this->slug = $args['slug'];
        $this->title = isset($args['title']) ? $args['title'] : '';
        $this->content = isset($args['content']) ? $args['content'] : '';
        $this->author = isset($args['author']) ? $args['author'] : 1;
        $this->date = isset($args['date']) ? $args['date'] : current_time('mysql');
        $this->dategmt = isset($args['date']) ? $args['date'] : current_time('mysql', 1);
        $this->type = isset($args['type']) ? $args['type'] : 'page';

        add_filter('the_posts', array(&$this, 'virtualPage'));
    }

    // filter to create virtual page content
    public function virtualPage($posts)
    {
        global $wp, $wp_query;

        if (count($posts) == 0 &&
            (strcasecmp($wp->request, $this->slug) == 0 || $wp->query_vars['page_id'] == $this->slug))
        {
            //create a fake post intance
            $post = new stdClass;
            // fill properties of $post with everything a page in the database would have
            $post->ID = -1;                          // use an illegal value for page ID
            $post->post_author = $this->author;       // post author id
            $post->post_date = $this->date;           // date of post
            $post->post_date_gmt = $this->dategmt;
            $post->post_content = $this->content;
            $post->post_title = $this->title;
            $post->post_excerpt = '';
            $post->post_status = 'publish';
            $post->comment_status = 'closed';        // mark as closed for comments, since page doesn't exist
            $post->ping_status = 'closed';           // mark as closed for pings, since page doesn't exist
            $post->post_password = '';               // no password
            $post->post_name = $this->slug;
            $post->to_ping = '';
            $post->pinged = '';
            $post->modified = $post->post_date;
            $post->modified_gmt = $post->post_date_gmt;
            $post->post_content_filtered = '';
            $post->post_parent = 0;
            $post->guid = get_home_url('/' . $this->slug);
            $post->menu_order = 0;
            $post->post_tyle = $this->type;
            $post->post_mime_type = '';
            $post->comment_count = 0;

            // set filter results
            $posts = array($post);

            // reset wp_query properties to simulate a found page
            $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 dj_create_virtual()
{
$url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
if ($url == 'dave-virtual-page')
{
    $args = array('slug' => 'dave-virtual-page',
            'title' => 'Dave\'s Virtual Page',
            'content' => "This can be generated content, or static content<br />
        Whatever you put here will appear on your virtual page.");
    $pg = new DJVirtualPage($args);
}
}
add_action('init', 'dj_create_virtual');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for?Browse other questions tagged or ask your own question.