Maison  >  Questions et réponses  >  le corps du texte

Page virtuelle WordPress - "Essayer d'obtenir la propriété 'post_type' de non-objet"

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.

P粉265724930P粉265724930251 Il y a quelques jours406

répondre à tous(1)je répondrai

  • P粉002023326

    P粉0020233262024-01-17 10:01:10

    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;

    répondre
    0
  • Annulerrépondre