Je construis un plugin WordPress qui utilise des pages factices pour afficher les données récupérées à partir d'une API.
La configuration est relativement simple. J'ai une règle de réécriture pour les URL sur lesquelles le plugin veut travailler, et lorsque j'appuie sur des query_vars spécifiques, je lance une page factice.
public function __construct() { require_once plugin_dir_path(__FILE__).'vendor/autoload.php'; add_action('init', [$this, 'rewrite_rule'], 1); // add query vars add_action('query_vars', [$this, 'add_query_vars_filter'], 1); // virtual page init add_filter('the_posts', [$this, 'virtual_page'], 1); } public function virtual_page($posts) { global $wp, $wp_query; if (!empty(get_query_var('plugin'))) { $plugin = get_query_var('plugin'); } if (!empty($plugin)) { $post = new stdClass(); $post->post_author = 1; $post->post_name = 'lorem ipsum'; $post->guid = get_bloginfo('wpurl').'/'; $post->post_title = 'title'; $post->post_content = 'content'; $post->ID = -999; $post->post_type = 'page'; $post->post_status = 'static'; $post->comment_status = 'closed'; $post->ping_status = 'open'; $post->comment_count = 0; $post->post_date = current_time('mysql'); $post->post_date_gmt = current_time('mysql', 1); $posts = NULL; $posts[] = $post; $wp_query->is_page = true; $wp_query->is_single = false; $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; remove_filter('the_content', 'wpautop'); remove_filter('the_excerpt', 'wpautop'); return $posts; } }
Ce code fait ce qu'il est censé faire, c'est-à-dire afficher une page factice avec le contenu dont j'ai besoin, mais je reçois un avertissement en PHP 8.0 :
"Attempt to read property "post_type" on null"
Je pense que l'ordre d'exécution ici est erroné car je reçois $post et $wp_query vides dans xdebug. Je suppose que la fonction de page virtuelle est exécutée trop tôt.
J'ai essayé de déboguer ce problème pendant longtemps mais malheureusement je manquais de connaissances backend/WordPress.
Si quelqu'un peut m'aider, je lui en serais encore plus reconnaissant.
Si vous essayez d'utiliser des pages virtuelles dans WP 6.1, vous n'aurez plus d'identifiant de publication. Cette ligne provoque sa rupture.
$post->ID = -999;