J'ai utilisé la solution de Dave Jesch pour créer des pages virtuelles (à partir d'un contenu temporairement enregistré dans une table de base de données personnalisée et mis à jour à partir d'un flux RSS toutes les quatre heures). Voir plus ici: http://davejesch.com/wordpress/wordpress-tech/creating-virtual-pages-in-wordpress/
Jusqu’à présent, j’ai vérifié que l’url ressemblait à une page virtuelle (c’est-à-dire qu’elle est l’enfant d’une certaine limace et qu’elle contient des chiffres en tant que première partie de celle-ci, elle est propre à mon site Web, bien sûr). J'ai récupéré tout le contenu nécessaire à la création d'une page à partir de ma table de base de données personnalisée. Et j'ai réussi à utiliser un modèle personnalisé.
Ce que je n’ai pas encore résolu, et j’ai besoin d’aide, est une solution permettant d’ajouter (de simuler) des champs personnalisés à la page sans les ajouter à la base de données. Il y a certaines valeurs de la table personnalisée que j'aimerais utiliser en dehors de the_content()
mais dans la boucle, comme vous le feriez pour des champs personnalisés.
Toutes les suggestions que j'ai vues à ce sujet enregistrent les données sous forme de champs personnalisés dans la base de données, sur la page id -1, mais étant donné que le site Web compte de nombreux visiteurs et que toutes les pages virtuelles obtiendront l'identifiant -1 qui ne peut que se terminer. mal, en plus, je ne veux pas sauvegarder beaucoup de bric-à-brac dans la base de données, car le contenu de ma base de données personnalisée va changer très souvent (ce sont des offres d'emploi, il y en aura donc des centaines et elles resteront rarement dans le système). plus de quelques semaines, en tête).
Alors, y a-t-il un moyen d'envoyer de faux champs personnalisés avec la fausse page ou y a-t-il un meilleur moyen de le faire?
ETA:
Le code ci-dessous est la plupart de ce qui constitue la fonction. Quelques noms de fonctions sont modifiés pour le rendre moins spécifique au client, mais dans l’ensemble, c’est la plupart. La fonction get_ip_post()
est omise car elle ne récupère que le contenu de la table personnalisée et les renvoie sous forme de tableau.
/********************************************/
/* */
/* 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;
}
Si vous utilisez get_post_meta
dans le modèle, celui-ci appelle get_metadata
avec le méta-type post
, qui contient le filtre get_{$meta_type}_metadata
, qui dans ce cas sera get_post_metadata
. Là, vous pouvez vérifier la clé et renvoyer les données que vous voulez.
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 );