Flector

Как создать виртуальную страницу (virtual page) в WordPress?

Пример открытия виртуальной страницы

Я уже рассматривал код, которым можно программно создать страницу при активации темы. Однако, внутри плагина логично будет не создавать физическую страницу, а обойтись виртуальным аналогом. То есть виртуальные страницы на сайте будут доступны только, пока плагин активирован. Для чего это может быть нужно? Вариантов масса - от реализации какого-либо собственного API до банального вывода карты сайта без создания физических страниц. Некоторые плагины, например, таким образом, создают собственные страницы авторизации и регистрации на сайте. Но не суть, для чего вам это надо. Главное как это сделать. Первым делом вы должны в свой плагин (или тему) добавить следующий код:

//класс для создания виртуальных страниц start 
if (!class_exists('wphVirtualPage')) {class wphVirtualPage {
 
    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('отсутствует ярлык для виртуальной страницы');
 
        $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'));
    }
 
    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) ) 
            {
 
            $post = new stdClass;
 
            $post->ID = -111;
            $post->post_author = $this->author;
            $post->post_date = $this->date;
            $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';
            $post->ping_status = 'closed';
            $post->post_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_type = $this->type;
            $post->post_mime_type = '';
            $post->comment_count = 0;
 
            $posts = array($post);
 
            $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);
    }
}}
//класс для создания виртуальных страниц end

Этот код представляет собой класс для создания виртуальных страниц. А вот код, которым создается конкретная виртуальная страница с выбранным ярлыком:

function wph_create_virtual_page() {
    $url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
    if ($url == 'wphook-virtual-page') {
        $args = array('slug' => 'wphook-virtual-page',
                      'title' => 'Это виртуальная страница',
                      'content' => "Это сгенерированный из кода контент.<br />
                                    Здесь вы можете вывести что угодно.",
                      'author' => 1,
                      'date' => '14.01.2017',
                      'type' => 'post');                      
        $pg = new wphVirtualPage($args);
    }
}
add_action('init', 'wph_create_virtual_page');

Автора, дату и тип можно не указывать. Обязательным параметром является только 'slug' (ярлык) страницы. Несмотря на статус "виртуальной" это все-таки будет полноценная страница, на которой будут выведены и автор и дата и прочие атрибуты записи (если предусмотрено темой). Собственно, даже шорткоды, вставленные в контент такой виртуальной страницы будут выполнены движком.


Комментарии (3 комментария)
  1. 1.А куда это все вставлять?
    2.Как добавить к этому виртуальному посту meta field ?
    например добавить поле _aioseop_title и чтобы это поле было обработано плагином All in One SEO Pack
    или
    как в коде созданной страницы прописать теги
    с неким содержанием?

  2. 3. как к такой страницы прикрепить "изображение записи"?

  3. SalfetKa:

    там у вас:

    $wp_query->is_page = true;
    $wp_query->is_singular = true;

    Надо бы сделать проверку на page. А лучше 'post' вообще не использовать, потому что WP выкидывает варнинги. Не вылечил, но я и не искал, достаточно is_singular = false

Написать комментарий

Для вставки кода воспользуйтесь кнопкой "Код". Используйте предпросмотр!