Virtuelle WordPress-Seite – „Es wird versucht, die Eigenschaft ‚post_type' eines Nicht-Objekts abzurufen'
P粉265724930
P粉265724930 2024-01-16 12:01:22
0
1
519

Ich baue ein WordPress-Plugin, das Dummy-Seiten verwendet, um von einer API abgerufene Daten anzuzeigen.

Die Einrichtung ist relativ einfach. Ich habe eine Umschreiberegel für die URLs, an denen das Plugin arbeiten möchte, und wenn ich auf bestimmte Abfragevariablen klicke, starte ich eine Dummy-Seite.

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;
    }
}

Dieser Code tut, was von ihm erwartet wird, nämlich eine Dummy-Seite mit dem von mir benötigten Inhalt anzuzeigen, aber ich erhalte in PHP 8.0 eine Warnung:

"Attempt to read property "post_type" on null"

Ich glaube, dass die Ausführungsreihenfolge hier falsch ist, weil ich in xdebug leere $post und $wp_query erhalte. Ich vermute, dass die Funktion der virtuellen Seite zu früh ausgeführt wird.

Ich habe lange versucht, dieses Problem zu beheben, aber leider fehlten mir Backend-/WordPress-Kenntnisse.

Wenn jemand helfen kann, wäre ich noch dankbarer.

P粉265724930
P粉265724930

Antworte allen(1)
P粉002023326

如果您尝试在 WP 6.1 中使用虚拟页面,您将无法再拥有帖子 ID。这条线导致它破裂。

$post->ID = -999;

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage