Intereting Posts
Запрос дополнительных пользовательских полей Установите высоту мета-окна категорий в панели сообщений При нажатии на пункт меню, не относящемся к определенной странице Извлечение ссылок внутри тегов в WordPress Как ускорить загрузку плагина wordpress disqus? Скрыть определенные виджеты от определенных пользовательских ролей в admin Есть ли способ получить N количество редакторов WYSIWYG в настраиваемом типе сообщений? Могу ли я создавать интерфейсные страницы профиля для редактирования с помощью WordPress? Как мне это сделать? Как добавить пользовательскую функцию для добавления / обновления продукта? Может ли кэш-папка плагина WordPress задерживать загрузку изображений? Пользовательские постоянные ссылки только для записей в блоге Пользовательские сообщения – разбиение на теги Понимание детской темы WordPress пользовательской загрузки JS как вызвать WordPress API из другой существующей системы PHP Как ограничить get_posts ()?

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

Я использовал решение Дейва Йеша для создания виртуальных страниц (из содержимого, временно сохраненного в таблице пользовательских баз данных, обновляемой из RSS каждые четыре часа). См. Больше здесь: http://davejesch.com/wordpress/wordpress-tech/creating-virtual-pages-in-wordpress/

До сих пор я проверял, что URL-адрес выглядит как одна из виртуальной страницы (то есть, это дочерний элемент определенного слизня и содержит числа в качестве первой части пули, это, конечно, относится к моему сайту). Я извлек весь контент, необходимый для создания страницы, из моей таблицы пользовательских БД. И мне удалось использовать настраиваемый шаблон.

Что мне еще предстоит решить, и вам нужна помощь, это решение для добавления (подделки) настраиваемых полей на страницу без добавления их в базу данных. Есть некоторые значения из пользовательской таблицы, которые я хотел бы использовать за пределами the_content() но внутри цикла, так как вы бы настраивали поля.

Все предложения, которые я видел для этого, сохраняют данные как настраиваемые поля в базе данных, на страницу id -1, но поскольку на веб-сайте довольно много посетителей, и все виртуальные страницы получат идентификатор -1, который может только закончиться плохо, плюс я не хочу сохранять кучу хлама в БД, так как содержимое моей пользовательской базы данных будет меняться довольно часто (это объявления о работе, поэтому их будет сотни, и они редко будут оставаться в системе для более чем на пару недель, вершины).

Итак, есть ли способ отправить поддельные пользовательские поля вместе с поддельной страницей или есть лучший способ сделать это?

ETA:

В приведенном ниже коде используется большинство функций. Несколько имен функций изменены, чтобы сделать их менее специфичными для клиента, но в целом это большая часть. Функция get_ip_post() опущена, поскольку она только извлекает содержимое из пользовательской таблицы и возвращает их как массив.

 /********************************************/ /* */ /* Virtual page, class and functions. */ /* */ /********************************************/ // Based on: http://davejesch.com/wordpress/wordpress-tech/creating-virtual-pages-in-wordpress/ 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); echo $args['post_parent_ID']; $this->type = isset($args['type']) ? $args['type'] : 'page'; echo $this->post_parent_ID; 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_type = $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; } else { } return ($posts); } } } function isJobAd($url){ global $virtual_post_id; if( strpos( $url, 'lediga-uppdrag/' ) > 0 || strpos( $url, 'ledige-oppdrag/' ) > 0 ){ // Check that we're in the right place, Swedish & Norwegian urls respectively $url_parts = explode( '/', $url ); $slug = end($url_parts); $post_id = current(explode("-", $slug)); if(is_numeric($post_id)){ $virtual_post_id = $post_id; return true; } else { return false; } } else { return false; } return true; } function dj_create_virtual() { global $current_blog; global $ip_slug; if( !is_admin() ) { $url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); $url_parts = explode( '/', $url ); $slug = end($url_parts); $post_id = current(explode("-", $slug)); if (isJobAd($url)) { $arr_post = get_ip_post( $post_id ); if( is_array( $arr_post ) ) { $args = array('slug' => $ip_slug . '/' . $slug, 'title' => $arr_post['title'], 'content' => $arr_post['description'], 'type' => 'page', 'date' => $arr_post['pubdate']); $pg = new DJVirtualPage($args); } else { echo 'No post found.'; } } } } add_action('init', 'dj_create_virtual'); // Using page-ip-post.php as template add_filter( 'single_template', 'portfolio_page_template', 99 ); function portfolio_page_template( $template ) { if ( is_page( -1 ) ) { $new_template = locate_template( array( 'page-ip-post.php' ) ); if ( '' != $new_template ) { return $new_template ; } } return $template; } с /********************************************/ /* */ /* Virtual page, class and functions. */ /* */ /********************************************/ // Based on: http://davejesch.com/wordpress/wordpress-tech/creating-virtual-pages-in-wordpress/ 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); echo $args['post_parent_ID']; $this->type = isset($args['type']) ? $args['type'] : 'page'; echo $this->post_parent_ID; 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_type = $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; } else { } return ($posts); } } } function isJobAd($url){ global $virtual_post_id; if( strpos( $url, 'lediga-uppdrag/' ) > 0 || strpos( $url, 'ledige-oppdrag/' ) > 0 ){ // Check that we're in the right place, Swedish & Norwegian urls respectively $url_parts = explode( '/', $url ); $slug = end($url_parts); $post_id = current(explode("-", $slug)); if(is_numeric($post_id)){ $virtual_post_id = $post_id; return true; } else { return false; } } else { return false; } return true; } function dj_create_virtual() { global $current_blog; global $ip_slug; if( !is_admin() ) { $url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); $url_parts = explode( '/', $url ); $slug = end($url_parts); $post_id = current(explode("-", $slug)); if (isJobAd($url)) { $arr_post = get_ip_post( $post_id ); if( is_array( $arr_post ) ) { $args = array('slug' => $ip_slug . '/' . $slug, 'title' => $arr_post['title'], 'content' => $arr_post['description'], 'type' => 'page', 'date' => $arr_post['pubdate']); $pg = new DJVirtualPage($args); } else { echo 'No post found.'; } } } } add_action('init', 'dj_create_virtual'); // Using page-ip-post.php as template add_filter( 'single_template', 'portfolio_page_template', 99 ); function portfolio_page_template( $template ) { if ( is_page( -1 ) ) { $new_template = locate_template( array( 'page-ip-post.php' ) ); if ( '' != $new_template ) { return $new_template ; } } return $template; } 

Если вы используете get_post_meta в шаблоне, который вызывает get_metadata с post типа мета, который содержит фильтр get_{$meta_type}_metadata , который в этом случае будет get_post_metadata . Там вы можете проверить ключ и вернуть все нужные данные.

 function wpd_fake_meta( $meta_data, $object_id, $meta_key, $single ){ if( 'somekey' == $meta_key ){ return 'somefakevalue'; } return null; } add_filter( 'get_post_metadata', 'wpd_fake_meta', 20, 4 );