Как создать виртуальную страницу (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' (ярлык) страницы. Несмотря на статус "виртуальной" это все-таки будет полноценная страница, на которой будут выведены и автор и дата и прочие атрибуты записи (если предусмотрено темой). Собственно, даже шорткоды, вставленные в контент такой виртуальной страницы будут выполнены движком.
1.А куда это все вставлять?
2.Как добавить к этому виртуальному посту meta field ?
например добавить поле _aioseop_title и чтобы это поле было обработано плагином All in One SEO Pack
или
как в коде созданной страницы прописать теги
с неким содержанием?
3. как к такой страницы прикрепить "изображение записи"?
там у вас:
$wp_query->is_page = true;
$wp_query->is_singular = true;
Надо бы сделать проверку на page. А лучше 'post' вообще не использовать, потому что WP выкидывает варнинги. Не вылечил, но я и не искал, достаточно is_singular = false